<?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>Forem: Chris Greening</title>
    <description>The latest articles on Forem by Chris Greening (@chrisgreening).</description>
    <link>https://forem.com/chrisgreening</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%2F482393%2F52b5179a-7754-451f-a6bf-233266e3a62f.jpg</url>
      <title>Forem: Chris Greening</title>
      <link>https://forem.com/chrisgreening</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/chrisgreening"/>
    <language>en</language>
    <item>
      <title>Documentation That Builds Itself with Sphinx + Read the Docs</title>
      <dc:creator>Chris Greening</dc:creator>
      <pubDate>Fri, 18 Apr 2025 13:00:00 +0000</pubDate>
      <link>https://forem.com/chrisgreening/documentation-that-builds-itself-with-sphinx-read-the-docs-56pl</link>
      <guid>https://forem.com/chrisgreening/documentation-that-builds-itself-with-sphinx-read-the-docs-56pl</guid>
      <description>&lt;p&gt;What if your documentation built itself?&lt;/p&gt;

&lt;p&gt;With the latest update to &lt;strong&gt;Greening&lt;/strong&gt;, it kind of does.&lt;/p&gt;




&lt;h2&gt;
  
  
  🌿 Docs with Zero Effort
&lt;/h2&gt;

&lt;p&gt;When you run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;greening new
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Greening now automatically scaffolds a complete &lt;a href="https://www.sphinx-doc.org/" rel="noopener noreferrer"&gt;Sphinx&lt;/a&gt; documentation setup right alongside your project.&lt;/p&gt;

&lt;p&gt;That includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A fully wired &lt;code&gt;docs/&lt;/code&gt; directory&lt;/li&gt;
&lt;li&gt;Smart &lt;code&gt;conf.py&lt;/code&gt; configuration with your project name, slug, author, and version&lt;/li&gt;
&lt;li&gt;Automatic API reference generation using &lt;code&gt;autodoc&lt;/code&gt; and &lt;code&gt;autosummary&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Recursive scanning of your codebase&lt;/li&gt;
&lt;li&gt;The clean and familiar &lt;a href="https://sphinx-rtd-theme.readthedocs.io/" rel="noopener noreferrer"&gt;Read the Docs theme&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All of this is driven directly from your &lt;code&gt;greening.yaml&lt;/code&gt; — no manual setup required.&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 Instant Hosting with Read the Docs
&lt;/h2&gt;

&lt;p&gt;Once your project is pushed to GitHub, all you have to do is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;a href="https://readthedocs.org/" rel="noopener noreferrer"&gt;readthedocs.org&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Link your GitHub repo&lt;/li&gt;
&lt;li&gt;✅ Done&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Read the Docs will:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Automatically detect your &lt;code&gt;docs/&lt;/code&gt; folder&lt;/li&gt;
&lt;li&gt;Install any dependencies listed in &lt;code&gt;requirements.txt&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Build your documentation from your actual code&lt;/li&gt;
&lt;li&gt;Rebuild it every time you push to &lt;code&gt;main&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your code is documented. Your documentation is hosted. Everything just works.&lt;/p&gt;




&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;No need for extra steps or boilerplate.&lt;/p&gt;

&lt;p&gt;Just run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;greening init
greening new
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And your project ships with full developer-facing docs, automatically generated and deployed with zero extra effort.&lt;/p&gt;

&lt;p&gt;Because documentation should be part of the build, not a separate to-do list.&lt;/p&gt;

</description>
      <category>python</category>
      <category>opensource</category>
      <category>tooling</category>
      <category>automation</category>
    </item>
    <item>
      <title>GitHub Autodetection Comes to Greening</title>
      <dc:creator>Chris Greening</dc:creator>
      <pubDate>Mon, 14 Apr 2025 16:00:00 +0000</pubDate>
      <link>https://forem.com/chrisgreening/github-autodetection-comes-to-greening-1l3p</link>
      <guid>https://forem.com/chrisgreening/github-autodetection-comes-to-greening-1l3p</guid>
      <description>&lt;p&gt;Tired of typing your GitHub username for the hundredth time?&lt;/p&gt;

&lt;p&gt;We were too.&lt;/p&gt;

&lt;p&gt;Greening now &lt;strong&gt;automatically detects your GitHub username and email&lt;/strong&gt; from your local Git configuration, and &lt;strong&gt;intelligently sets up your project YAML&lt;/strong&gt; based on whether you’ve authenticated with a &lt;code&gt;GITHUB_TOKEN&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This small change adds up to a &lt;strong&gt;much smoother “greening init” experience&lt;/strong&gt; , with fewer fields to fill out and fewer reasons to stall when inspiration hits.&lt;/p&gt;




&lt;h2&gt;
  
  
  How It Works
&lt;/h2&gt;

&lt;p&gt;When you run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;greening init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Greening now looks for:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git config user.name
git config user.email
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If found, it pre-fills those values in &lt;code&gt;greening.yaml&lt;/code&gt;. No need to remember your GitHub handle, no need to copy-paste your email again.&lt;/p&gt;

&lt;p&gt;But it goes one step further…&lt;/p&gt;

&lt;p&gt;If you’ve already set a &lt;code&gt;GITHUB_TOKEN&lt;/code&gt; in your environment (to allow GitHub repo creation), Greening assumes you want automation mode engaged.&lt;/p&gt;

&lt;p&gt;So instead of prompting you to manually fill out a &lt;code&gt;git_remote&lt;/code&gt;, it will:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Autocomment the &lt;code&gt;git_remote:&lt;/code&gt; line&lt;/li&gt;
&lt;li&gt;Uncomment and set &lt;code&gt;create_github_repo: true&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This means when you run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;greening new
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You’ll get a &lt;strong&gt;fully scaffolded project&lt;/strong&gt; , &lt;strong&gt;GitHub repo automatically created&lt;/strong&gt; , and everything pushed in seconds — all without editing a single config field.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why We Did This
&lt;/h2&gt;

&lt;p&gt;The philosophy behind Greening has always been:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you’ve done it more than twice, Greening should probably do it for you.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Even tiny points of friction — like having to setup a GitHub repo — can break flow. And we’re obsessed with keeping you in flow.&lt;/p&gt;

&lt;p&gt;Every saved keystroke, every reduced prompt, every automated step is another seed planted toward a finished project.&lt;/p&gt;




&lt;h2&gt;
  
  
  What’s Next
&lt;/h2&gt;

&lt;p&gt;We’re actively working on a &lt;strong&gt;plugin system&lt;/strong&gt; , smarter defaults, and automatic detection for even more fields. Because the less you have to think about setup, the more you can focus on building.&lt;/p&gt;

&lt;p&gt;Try it out. Set your GitHub token, run &lt;code&gt;greening init&lt;/code&gt;, and just build.&lt;/p&gt;




&lt;p&gt;📌 &lt;a href="https://github.com/chris-greening/greening" rel="noopener noreferrer"&gt;Greening on GitHub&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pip install greening
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>opensource</category>
      <category>python</category>
    </item>
    <item>
      <title>🌱 New Feature: Beautiful Per-Command Help for the Greening CLI</title>
      <dc:creator>Chris Greening</dc:creator>
      <pubDate>Wed, 09 Apr 2025 16:00:00 +0000</pubDate>
      <link>https://forem.com/chrisgreening/new-feature-beautiful-per-command-help-for-the-greening-cli-4iah</link>
      <guid>https://forem.com/chrisgreening/new-feature-beautiful-per-command-help-for-the-greening-cli-4iah</guid>
      <description>&lt;p&gt;🌿 One of the newest additions to the Greening CLI is intuitive, per-command help. You can now run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;greening &amp;lt;&lt;span class="nb"&gt;command&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nt"&gt;--help&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;greening &lt;span class="nb"&gt;help&lt;/span&gt; &amp;lt;&lt;span class="nb"&gt;command&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To instantly get detailed, actionable help for that specific command — no guesswork, no flipping to the docs mid-flow.&lt;/p&gt;




&lt;h2&gt;
  
  
  🌱 How It Works
&lt;/h2&gt;

&lt;p&gt;Let’s say you want to scaffold a new project. Just type:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;greening new &lt;span class="nt"&gt;--help&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and you'll see:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Usage: greening new &lt;span class="o"&gt;[&lt;/span&gt;OPTIONS]

Scaffold a new Python project using greening.yaml.

This &lt;span class="nb"&gt;command &lt;/span&gt;uses your greening.yaml configuration to generate a full project structure based on a customizable template.
It can also automatically:
- Initialize a GitHub repository
- Create and activate a virtual environment
- Commit and push the project to GitHub

Options:
  &lt;span class="nt"&gt;--help&lt;/span&gt;              Show this message and exit.

Examples:
  greening new
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;Ready to deploy a fully scaffolded GitHub Pages site with Jekyll?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;greening deploy &lt;span class="nt"&gt;--help&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Returns:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Usage: greening deploy &lt;span class="o"&gt;[&lt;/span&gt;OPTIONS]

Deploy a documentation site using GitHub Pages.

This &lt;span class="nb"&gt;command &lt;/span&gt;generates and deploys a Jekyll site &lt;span class="o"&gt;(&lt;/span&gt;using the Minimal Mistakes theme&lt;span class="o"&gt;)&lt;/span&gt; based on your project metadata &lt;span class="k"&gt;in &lt;/span&gt;greening.yaml.

It can also:
- Automatically push the site to the &lt;span class="sb"&gt;`&lt;/span&gt;gh-pages&lt;span class="sb"&gt;`&lt;/span&gt; branch of your GitHub repository
- Auto-configure Google Analytics &lt;span class="k"&gt;if &lt;/span&gt;a tracking ID is defined &lt;span class="k"&gt;in &lt;/span&gt;greening.yaml

Options:
  &lt;span class="nt"&gt;--help&lt;/span&gt;              Show this &lt;span class="nb"&gt;help &lt;/span&gt;message and &lt;span class="nb"&gt;exit

&lt;/span&gt;Examples:
  greening deploy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;Want to initialize your config?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;greening init &lt;span class="nt"&gt;--help&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Outputs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Usage: greening init

Initialize a new greening.yaml config file in the current directory.

This command inspects your environment and Git configuration to prepopulate sensible defaults:
- Auto-detects your GitHub username and email via git config
- Checks for a GITHUB_TOKEN in your environment
- Creates greening.yaml only if one does not already exist

Options:
  --help              Show this help message and exit

Examples:
  greening init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🌾 Why This Matters
&lt;/h2&gt;

&lt;p&gt;Greening is all about eliminating friction and helping you ship beautiful software fast. With these new help commands, you can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🌱 Stay in flow&lt;/li&gt;
&lt;li&gt;🌿 Learn Greening’s capabilities organically&lt;/li&gt;
&lt;li&gt;🌾 Discover hidden features you might’ve missed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You don’t need to remember everything. You just need to remember:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;greening &amp;lt;&lt;span class="nb"&gt;command&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nt"&gt;--help&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🌱 What’s Next?
&lt;/h2&gt;

&lt;p&gt;As new features roll out, each command’s help will grow to reflect new flags, options, and workflows. All discoverable in the CLI — no context switching, no fluff.&lt;/p&gt;

&lt;p&gt;Stay tuned — and keep planting those seeds. 🌿&lt;/p&gt;

</description>
      <category>python</category>
      <category>opensource</category>
      <category>tutorial</category>
      <category>automation</category>
    </item>
    <item>
      <title>How to Generate a GitHub Token for Pushing Repos with Greening</title>
      <dc:creator>Chris Greening</dc:creator>
      <pubDate>Mon, 07 Apr 2025 16:00:00 +0000</pubDate>
      <link>https://forem.com/chrisgreening/how-to-generate-a-github-token-for-pushing-repos-with-greening-ne6</link>
      <guid>https://forem.com/chrisgreening/how-to-generate-a-github-token-for-pushing-repos-with-greening-ne6</guid>
      <description>&lt;p&gt;When using &lt;code&gt;greening new&lt;/code&gt; to auto-create and push a repo to GitHub, you'll need a &lt;strong&gt;GitHub token&lt;/strong&gt; with proper permissions. This token allows Greening to authenticate with the GitHub API on your behalf and create new repositories for your projects.&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://www.christophergreening.com/" rel="noopener noreferrer" class="c-link"&gt;
            Chris Greening - Software Developer
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            Hey! My name's Chris Greening and I'm a software developer from the New York metro area with a diverse range of engineering experience - beam me a message and let's build something great!
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.christophergreening.com%2Fstatic%2Ffavicon.png"&gt;
          christophergreening.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Here’s how to generate one and use it securely:&lt;/p&gt;




&lt;h2&gt;
  
  
  🔐 Step 1: Generate a New Token
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Visit &lt;a href="https://github.com/settings/tokens" rel="noopener noreferrer"&gt;github.com/settings/tokens&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;"Generate new token"&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use the following settings&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Note&lt;/strong&gt;: &lt;code&gt;Greening CLI access&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Expiration&lt;/strong&gt;: Choose one (90 days or custom)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scopes&lt;/strong&gt;: Check the box for:

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;repo&lt;/code&gt; (Full control of private repositories)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;"Generate token"&lt;/strong&gt; and &lt;strong&gt;copy it immediately&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  🧠 Step 2: Add It to Your Environment
&lt;/h2&gt;

&lt;p&gt;For security, never hard-code your token into your project.&lt;/p&gt;

&lt;p&gt;Instead, add it to your environment using one of the following:&lt;/p&gt;

&lt;h3&gt;
  
  
  Unix/macOS
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;GITHUB_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ghp_your_token_here
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;You can also add this to your &lt;code&gt;~/.bashrc&lt;/code&gt;, &lt;code&gt;~/.zshrc&lt;/code&gt;, or &lt;code&gt;~/.bash_profile&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  Windows (Command Prompt)
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;set GITHUB_TOKEN=ghp_your_token_here
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Windows (PowerShell)
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$&lt;/span&gt;&lt;span class="nn"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;GITHUB_TOKEN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ghp_your_token_here"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  ✅ Step 3: Use It with Greening
&lt;/h2&gt;

&lt;p&gt;Now that your token is available, Greening will detect it automatically.&lt;/p&gt;

&lt;p&gt;Just run:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;greening new
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;If you have &lt;code&gt;create_github_repo: true&lt;/code&gt; in your &lt;code&gt;greening.yaml&lt;/code&gt; config, Greening will:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create a new GitHub repo&lt;/li&gt;
&lt;li&gt;Add the remote&lt;/li&gt;
&lt;li&gt;Push your project&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No extra steps. ✨&lt;/p&gt;


&lt;h2&gt;
  
  
  🧼 Bonus: Keeping Your Token Safe
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Don’t commit &lt;code&gt;.env&lt;/code&gt; files or shell profiles&lt;/strong&gt; to public repos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rotate your token periodically&lt;/strong&gt;, especially if it becomes exposed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use fine-grained tokens&lt;/strong&gt; for more control (GitHub now supports these).&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;Greening aims to make shipping your ideas painless — and this is a big part of that. By setting up your token once, you’ll unlock powerful automation across every new project.&lt;/p&gt;

&lt;p&gt;Happy shipping 🌱&lt;/p&gt;

&lt;p&gt;—&lt;/p&gt;

&lt;p&gt;Got questions? Open an issue or join the discussion at &lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/chris-greening" rel="noopener noreferrer"&gt;
        chris-greening
      &lt;/a&gt; / &lt;a href="https://github.com/chris-greening/greening" rel="noopener noreferrer"&gt;
        greening
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      greening is an opinionated, lightweight project automation tool for solo developers and creative coders.  With just a few commands, you can scaffold a production-ready Python package — complete with docs, tests, GitHub Actions workflows, PyPI packaging, and an auto-deployed GitHub Pages site. No boilerplate. No setup hell. Just instant polish.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;
  &lt;a rel="noopener noreferrer" href="https://github.com/chris-greening/greening/media/logo.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fchris-greening%2Fgreening%2Fmedia%2Flogo.png" width="800px"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;🌱 Greening&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;code&gt;greening&lt;/code&gt; is an opinionated, full-stack Project as Code automation tool for solo developers and creative coders.&lt;/p&gt;

&lt;p&gt;With just a few commands, you can scaffold a production-ready Python package complete with docs, tests, GitHub Actions workflows, PyPI packaging, and an auto-deployed GitHub Pages site
No boilerplate or setup hell, just instant polish.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://pepy.tech/project/greening" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/832ba7129203ca569ad4c1b4d0013584eec5dbe12dbe0eb5808443b556ec38da/68747470733a2f2f7374617469632e706570792e746563682f706572736f6e616c697a65642d62616467652f677265656e696e673f706572696f643d746f74616c26756e6974733d696e7465726e6174696f6e616c5f73797374656d266c6566745f636f6c6f723d677265792672696768745f636f6c6f723d627269676874677265656e266c6566745f746578743d646f776e6c6f616473" alt="Downloads"&gt;&lt;/a&gt;
&lt;a href="https://github.com/chris-greening/greening/issues" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/73a7a8a70549205213d901cc7d56cff5150864e56ac9c64cc6b7841db456ff8b/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6973737565732f63687269732d677265656e696e672f677265656e696e67" alt="Issues"&gt;&lt;/a&gt;
&lt;a href="https://github.com/chris-greening/greening/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/afc9b523e1b7ffbee161e8efeff82d01431d34a66a674a6d620bc6efbd307249/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f63687269732d677265656e696e672f677265656e696e67" alt="License"&gt;&lt;/a&gt;
&lt;a href="https://pypi.org/project/greening/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/6d838be18d9351166a4a987cc0c385bf8ec51da8a10a8b10aed755d28bba733d/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f677265656e696e673f636f6c6f723d627269676874677265656e" alt="Version"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.buymeacoffee.com/chrisgreening" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/9f44ce2dc3b3eecdd02598900866ffc518801df1932849703dae1e5ce5031070/68747470733a2f2f7777772e6275796d6561636f666665652e636f6d2f6173736574732f696d672f637573746f6d5f696d616765732f6f72616e67655f696d672e706e67" alt='"Buy Me A Coffee"'&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Table of Contents&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/chris-greening/greening#why-greening" rel="noopener noreferrer"&gt;🍃 Why &lt;code&gt;greening&lt;/code&gt;?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/chris-greening/greening#key-features" rel="noopener noreferrer"&gt;🌿 Key features&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/chris-greening/greening#getting-started" rel="noopener noreferrer"&gt;🌲 Getting started&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/chris-greening/greening#github-authentication" rel="noopener noreferrer"&gt;🌻 GitHub authentication&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/chris-greening/greening#blog" rel="noopener noreferrer"&gt;🌳 Blog posts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/chris-greening/greening#roadmap" rel="noopener noreferrer"&gt;🌴 Roadmap&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/chris-greening/greening#support" rel="noopener noreferrer"&gt;🍀 Support&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🍃 Why &lt;code&gt;greening&lt;/code&gt;? 
&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;Most devs never ship their tools. Not because the code isn’t good, but because the surrounding friction is too high:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;How do I structure the project?&lt;/li&gt;
&lt;li&gt;How do I set up CI/CD, tests, and linting?&lt;/li&gt;
&lt;li&gt;How do I make it look legit?&lt;/li&gt;
&lt;li&gt;How do I talk about it?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;greening&lt;/code&gt; answers all of that in &lt;strong&gt;one opinionated workflow&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;
  &lt;a rel="noopener noreferrer" href="https://github.com/chris-greening/greening/media/greening_usage_speed.gif"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fchris-greening%2Fgreening%2Fmedia%2Fgreening_usage_speed.gif" alt="User typing in commands greening init, greening new, and greening deploy and rapidly deploying a project" width="600px"&gt;&lt;/a&gt;
&lt;/p&gt;




&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🌿 Key features 
&lt;/h2&gt;

&lt;/div&gt;

&lt;p&gt;&lt;code&gt;greening&lt;/code&gt; automates your project creation pipeline:&lt;/p&gt;

&lt;p&gt;✅ &lt;code&gt;greening init&lt;/code&gt;…&lt;/p&gt;
&lt;/div&gt;


&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/chris-greening/greening" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


</description>
      <category>python</category>
      <category>opensource</category>
      <category>automation</category>
      <category>tooling</category>
    </item>
    <item>
      <title>Open Source is Soil: The Greening Philosophy</title>
      <dc:creator>Chris Greening</dc:creator>
      <pubDate>Mon, 07 Apr 2025 16:00:00 +0000</pubDate>
      <link>https://forem.com/chrisgreening/open-source-is-soil-the-greening-philosophy-3beh</link>
      <guid>https://forem.com/chrisgreening/open-source-is-soil-the-greening-philosophy-3beh</guid>
      <description>&lt;p&gt;Open source is soil. It’s not just where we build — it’s where things grow.&lt;/p&gt;

&lt;p&gt;The name Greening carries meaning on many levels.&lt;/p&gt;

&lt;p&gt;Yes, it's my last name — but more importantly, it reflects the philosophy behind the project and the process it encourages. Greening is an action. A transformation. The turning of raw space into fertile ground.&lt;/p&gt;

&lt;p&gt;This project is an attempt to bottle what has worked for me: an opinionated framework, tuned through experience, designed to help ideas take root with clarity and speed.&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://www.christophergreening.com/" rel="noopener noreferrer" class="c-link"&gt;
            Chris Greening - Software Developer
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            Hey! My name's Chris Greening and I'm a software developer from the New York metro area with a diverse range of engineering experience - beam me a message and let's build something great!
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.christophergreening.com%2Fstatic%2Ffavicon.png"&gt;
          christophergreening.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;





&lt;h2&gt;
  
  
  🌱 Growth Through Iteration
&lt;/h2&gt;

&lt;p&gt;In nature, growth is uneven. Shoots twist toward the light. Some seeds don’t sprout. But the garden keeps expanding. The same is true in software. Version 0.1.0 isn’t perfect — but it’s alive.&lt;/p&gt;

&lt;p&gt;Greening exists to make that early stage effortless — to remove friction from the planting process so developers can ship sooner and iterate faster. The first version doesn’t have to be flawless. It just has to start growing.&lt;/p&gt;




&lt;h2&gt;
  
  
  🌰 Tools Are Seeds
&lt;/h2&gt;

&lt;p&gt;Every scaffold, every config, every deploy is a seed — small, but full of potential. Greening gives you tools that sprout quickly, so you can spend less time building the planter and more time tending the plant.&lt;/p&gt;

&lt;p&gt;With expressive syntax and beautiful defaults, it clears the weeds so your work can flourish.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;greening&lt;/span&gt; &lt;span class="n"&gt;new&lt;/span&gt;
&lt;span class="n"&gt;greening&lt;/span&gt; &lt;span class="n"&gt;deploy&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🌿 Open Source Is Soil
&lt;/h2&gt;

&lt;p&gt;The open-source ecosystem is a living commons. Code evolves. Ideas hybridize. Communities self-seed. In this shared soil, a single contribution can propagate far beyond its roots.&lt;/p&gt;

&lt;p&gt;Greening is built for that environment. It’s not just an automation tool — it’s a substrate for creative, scalable, repeatable growth. Tweak it. Fork it. Grow your own extensions. Contribute back.&lt;/p&gt;


&lt;h2&gt;
  
  
  🌾 Greening, Together
&lt;/h2&gt;

&lt;p&gt;This project is opinionated — not because there’s one way to build, but because strong soil grows strong roots. Greening reflects one approach that’s worked — and makes it easy to remix for your own.&lt;/p&gt;

&lt;p&gt;If you're here, you’re already in the garden. Let’s see what we can grow.&lt;/p&gt;



&lt;p&gt;Follow the project on GitHub:&lt;br&gt;
👉 &lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/chris-greening" rel="noopener noreferrer"&gt;
        chris-greening
      &lt;/a&gt; / &lt;a href="https://github.com/chris-greening/greening" rel="noopener noreferrer"&gt;
        greening
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      greening is an opinionated, lightweight project automation tool for solo developers and creative coders.  With just a few commands, you can scaffold a production-ready Python package — complete with docs, tests, GitHub Actions workflows, PyPI packaging, and an auto-deployed GitHub Pages site. No boilerplate. No setup hell. Just instant polish.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;
  &lt;a rel="noopener noreferrer" href="https://github.com/chris-greening/greening/media/logo.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fchris-greening%2Fgreening%2Fmedia%2Flogo.png" width="800px"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;🌱 Greening&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;code&gt;greening&lt;/code&gt; is an opinionated, full-stack Project as Code automation tool for solo developers and creative coders.&lt;/p&gt;

&lt;p&gt;With just a few commands, you can scaffold a production-ready Python package complete with docs, tests, GitHub Actions workflows, PyPI packaging, and an auto-deployed GitHub Pages site
No boilerplate or setup hell, just instant polish.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://pepy.tech/project/greening" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/832ba7129203ca569ad4c1b4d0013584eec5dbe12dbe0eb5808443b556ec38da/68747470733a2f2f7374617469632e706570792e746563682f706572736f6e616c697a65642d62616467652f677265656e696e673f706572696f643d746f74616c26756e6974733d696e7465726e6174696f6e616c5f73797374656d266c6566745f636f6c6f723d677265792672696768745f636f6c6f723d627269676874677265656e266c6566745f746578743d646f776e6c6f616473" alt="Downloads"&gt;&lt;/a&gt;
&lt;a href="https://github.com/chris-greening/greening/issues" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/73a7a8a70549205213d901cc7d56cff5150864e56ac9c64cc6b7841db456ff8b/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6973737565732f63687269732d677265656e696e672f677265656e696e67" alt="Issues"&gt;&lt;/a&gt;
&lt;a href="https://github.com/chris-greening/greening/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/afc9b523e1b7ffbee161e8efeff82d01431d34a66a674a6d620bc6efbd307249/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f63687269732d677265656e696e672f677265656e696e67" alt="License"&gt;&lt;/a&gt;
&lt;a href="https://pypi.org/project/greening/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/6d838be18d9351166a4a987cc0c385bf8ec51da8a10a8b10aed755d28bba733d/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f677265656e696e673f636f6c6f723d627269676874677265656e" alt="Version"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.buymeacoffee.com/chrisgreening" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/9f44ce2dc3b3eecdd02598900866ffc518801df1932849703dae1e5ce5031070/68747470733a2f2f7777772e6275796d6561636f666665652e636f6d2f6173736574732f696d672f637573746f6d5f696d616765732f6f72616e67655f696d672e706e67" alt='"Buy Me A Coffee"'&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Table of Contents&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/chris-greening/greening#why-greening" rel="noopener noreferrer"&gt;🍃 Why &lt;code&gt;greening&lt;/code&gt;?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/chris-greening/greening#key-features" rel="noopener noreferrer"&gt;🌿 Key features&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/chris-greening/greening#getting-started" rel="noopener noreferrer"&gt;🌲 Getting started&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/chris-greening/greening#github-authentication" rel="noopener noreferrer"&gt;🌻 GitHub authentication&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/chris-greening/greening#blog" rel="noopener noreferrer"&gt;🌳 Blog posts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/chris-greening/greening#roadmap" rel="noopener noreferrer"&gt;🌴 Roadmap&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/chris-greening/greening#support" rel="noopener noreferrer"&gt;🍀 Support&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🍃 Why &lt;code&gt;greening&lt;/code&gt;? 
&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;Most devs never ship their tools. Not because the code isn’t good, but because the surrounding friction is too high:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;How do I structure the project?&lt;/li&gt;
&lt;li&gt;How do I set up CI/CD, tests, and linting?&lt;/li&gt;
&lt;li&gt;How do I make it look legit?&lt;/li&gt;
&lt;li&gt;How do I talk about it?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;greening&lt;/code&gt; answers all of that in &lt;strong&gt;one opinionated workflow&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;
  &lt;a rel="noopener noreferrer" href="https://github.com/chris-greening/greening/media/greening_usage_speed.gif"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fchris-greening%2Fgreening%2Fmedia%2Fgreening_usage_speed.gif" alt="User typing in commands greening init, greening new, and greening deploy and rapidly deploying a project" width="600px"&gt;&lt;/a&gt;
&lt;/p&gt;




&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🌿 Key features 
&lt;/h2&gt;

&lt;/div&gt;

&lt;p&gt;&lt;code&gt;greening&lt;/code&gt; automates your project creation pipeline:&lt;/p&gt;

&lt;p&gt;✅ &lt;code&gt;greening init&lt;/code&gt;…&lt;/p&gt;
&lt;/div&gt;


&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/chris-greening/greening" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


</description>
      <category>python</category>
      <category>opensource</category>
      <category>tooling</category>
      <category>automation</category>
    </item>
    <item>
      <title>Greening is looking for beginner open source contributors!</title>
      <dc:creator>Chris Greening</dc:creator>
      <pubDate>Sun, 06 Apr 2025 18:56:56 +0000</pubDate>
      <link>https://forem.com/chrisgreening/greening-is-looking-for-beginner-open-source-contributors-3gf3</link>
      <guid>https://forem.com/chrisgreening/greening-is-looking-for-beginner-open-source-contributors-3gf3</guid>
      <description>&lt;p&gt;Hello!&lt;/p&gt;

&lt;p&gt;I'm the creator of &lt;a href="https://chris-greening.github.io/greening/" rel="noopener noreferrer"&gt;Greening&lt;/a&gt;, a lightweight CLI that automates launching new open source projects. It handles everything from scaffolding your folder structure to setting up a GitHub repo and deploying a GitHub Pages site all from a single &lt;code&gt;greening.yaml&lt;/code&gt; config.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🌱 TL;DR: It's a dev automation tool designed to help you ship beautiful software fast.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F14dpdn30m68v7igbe8sp.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F14dpdn30m68v7igbe8sp.gif" alt="Text editor with user typing commands from Greening tool to scaffold a project"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🧩 What is Greening?
&lt;/h2&gt;

&lt;p&gt;Greening is for folks who build lots of small tools, libraries, or creative experiments and want to avoid the tedious boilerplate every time. It's especially useful for beginners, solo devs, makers, and people who love polished projects but hate setup tasks.&lt;/p&gt;

&lt;p&gt;Here's what it can do:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;greening init    # create greening.yaml with intelligent defaults
greening new     # scaffold your project, venv, and GitHub repo
greening deploy  # auto-generate a GitHub Pages site
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/chris-greening" rel="noopener noreferrer"&gt;
        chris-greening
      &lt;/a&gt; / &lt;a href="https://github.com/chris-greening/greening" rel="noopener noreferrer"&gt;
        greening
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      greening is an opinionated, lightweight project automation tool for solo developers and creative coders.  With just a few commands, you can scaffold a production-ready Python package — complete with docs, tests, GitHub Actions workflows, PyPI packaging, and an auto-deployed GitHub Pages site. No boilerplate. No setup hell. Just instant polish.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;
  &lt;a rel="noopener noreferrer" href="https://github.com/chris-greening/greening/media/logo.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fchris-greening%2Fgreening%2Fmedia%2Flogo.png" width="800px"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;🌱 Greening&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;code&gt;greening&lt;/code&gt; is an opinionated, full-stack Project as Code automation tool for solo developers and creative coders.&lt;/p&gt;

&lt;p&gt;With just a few commands, you can scaffold a production-ready Python package complete with docs, tests, GitHub Actions workflows, PyPI packaging, and an auto-deployed GitHub Pages site
No boilerplate or setup hell, just instant polish.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://pepy.tech/project/greening" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/832ba7129203ca569ad4c1b4d0013584eec5dbe12dbe0eb5808443b556ec38da/68747470733a2f2f7374617469632e706570792e746563682f706572736f6e616c697a65642d62616467652f677265656e696e673f706572696f643d746f74616c26756e6974733d696e7465726e6174696f6e616c5f73797374656d266c6566745f636f6c6f723d677265792672696768745f636f6c6f723d627269676874677265656e266c6566745f746578743d646f776e6c6f616473" alt="Downloads"&gt;&lt;/a&gt;
&lt;a href="https://github.com/chris-greening/greening/issues" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/73a7a8a70549205213d901cc7d56cff5150864e56ac9c64cc6b7841db456ff8b/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6973737565732f63687269732d677265656e696e672f677265656e696e67" alt="Issues"&gt;&lt;/a&gt;
&lt;a href="https://github.com/chris-greening/greening/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/afc9b523e1b7ffbee161e8efeff82d01431d34a66a674a6d620bc6efbd307249/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f63687269732d677265656e696e672f677265656e696e67" alt="License"&gt;&lt;/a&gt;
&lt;a href="https://pypi.org/project/greening/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/6d838be18d9351166a4a987cc0c385bf8ec51da8a10a8b10aed755d28bba733d/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f677265656e696e673f636f6c6f723d627269676874677265656e" alt="Version"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.buymeacoffee.com/chrisgreening" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/9f44ce2dc3b3eecdd02598900866ffc518801df1932849703dae1e5ce5031070/68747470733a2f2f7777772e6275796d6561636f666665652e636f6d2f6173736574732f696d672f637573746f6d5f696d616765732f6f72616e67655f696d672e706e67" alt='"Buy Me A Coffee"'&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Table of Contents&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/chris-greening/greening#why-greening" rel="noopener noreferrer"&gt;🍃 Why &lt;code&gt;greening&lt;/code&gt;?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/chris-greening/greening#key-features" rel="noopener noreferrer"&gt;🌿 Key features&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/chris-greening/greening#getting-started" rel="noopener noreferrer"&gt;🌲 Getting started&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/chris-greening/greening#github-authentication" rel="noopener noreferrer"&gt;🌻 GitHub authentication&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/chris-greening/greening#blog" rel="noopener noreferrer"&gt;🌳 Blog posts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/chris-greening/greening#roadmap" rel="noopener noreferrer"&gt;🌴 Roadmap&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/chris-greening/greening#support" rel="noopener noreferrer"&gt;🍀 Support&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🍃 Why &lt;code&gt;greening&lt;/code&gt;? 
&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;Most devs never ship their tools. Not because the code isn’t good, but because the surrounding friction is too high:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;How do I structure the project?&lt;/li&gt;
&lt;li&gt;How do I set up CI/CD, tests, and linting?&lt;/li&gt;
&lt;li&gt;How do I make it look legit?&lt;/li&gt;
&lt;li&gt;How do I talk about it?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;greening&lt;/code&gt; answers all of that in &lt;strong&gt;one opinionated workflow&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;
  &lt;a rel="noopener noreferrer" href="https://github.com/chris-greening/greening/media/greening_usage_speed.gif"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fchris-greening%2Fgreening%2Fmedia%2Fgreening_usage_speed.gif" alt="User typing in commands greening init, greening new, and greening deploy and rapidly deploying a project" width="600px"&gt;&lt;/a&gt;
&lt;/p&gt;




&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🌿 Key features 
&lt;/h2&gt;

&lt;/div&gt;

&lt;p&gt;&lt;code&gt;greening&lt;/code&gt; automates your project creation pipeline:&lt;/p&gt;

&lt;p&gt;✅ &lt;code&gt;greening init&lt;/code&gt;…&lt;/p&gt;
&lt;/div&gt;


&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/chris-greening/greening" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;





&lt;h2&gt;
  
  
  🌿 I'm Looking for Beginner-Friendly Contributors!
&lt;/h2&gt;

&lt;p&gt;Whether you're new to open source or just looking for a welcoming project to contribute to, I’d love to have you on board.&lt;/p&gt;

&lt;p&gt;There are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🟢 Labeled issues for &lt;strong&gt;first-time contributors&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;📦 Opportunities to improve CLI help output, flags, and structure&lt;/li&gt;
&lt;li&gt;🧪 Testing-related tasks (unit tests, GitHub Actions)&lt;/li&gt;
&lt;li&gt;🌍 Docs, blog posts, and site improvements&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You don’t need to be a senior dev. If you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Know a bit of Python&lt;/li&gt;
&lt;li&gt;Are curious about open source&lt;/li&gt;
&lt;li&gt;Want to build something real that helps other developers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You’re in the right place.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔗 How to Get Started
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Head to the &lt;a href="https://github.com/chris-greening/greening/issues" rel="noopener noreferrer"&gt;issues tab&lt;/a&gt; and look for &lt;code&gt;good first issue&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Drop a comment and say hi! Or open a discussion if you want to pitch ideas&lt;/li&gt;
&lt;li&gt;Feel free to fork + start exploring&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you need help setting up your environment or getting comfortable with the code, I’m happy to walk through it with you!&lt;/p&gt;




&lt;h2&gt;
  
  
  🙌 Why Contribute?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;You'll learn how to structure CLI tools, package Python projects, and automate real dev workflows.&lt;/li&gt;
&lt;li&gt;You'll get real GitHub contribution experience.&lt;/li&gt;
&lt;li&gt;You'll see your name in the README and commits of a growing tool and community&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Plus, the tool you help build will help &lt;em&gt;other devs&lt;/em&gt; build faster and better.&lt;/p&gt;




&lt;p&gt;💬 Drop a comment below if you’re interested, or jump into the GitHub issues and claim one!&lt;/p&gt;

&lt;p&gt;Let’s build something cool together 🌱&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://www.christophergreening.com/" rel="noopener noreferrer" class="c-link"&gt;
            Chris Greening - Software Developer
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            Hey! My name's Chris Greening and I'm a software developer from the New York metro area with a diverse range of engineering experience - beam me a message and let's build something great!
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.christophergreening.com%2Fstatic%2Ffavicon.png"&gt;
          christophergreening.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


</description>
      <category>opensource</category>
      <category>python</category>
      <category>contributorswanted</category>
      <category>beginners</category>
    </item>
    <item>
      <title>The Philosophy Behind Greening: Developer Momentum</title>
      <dc:creator>Chris Greening</dc:creator>
      <pubDate>Sat, 05 Apr 2025 16:00:00 +0000</pubDate>
      <link>https://forem.com/chrisgreening/the-philosophy-behind-greening-developer-momentum-26i9</link>
      <guid>https://forem.com/chrisgreening/the-philosophy-behind-greening-developer-momentum-26i9</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"The best time to build is when you're most excited — so why does setup always get in the way?"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;When I started building &lt;strong&gt;Greening&lt;/strong&gt;, it wasn’t just to automate project scaffolding. It was to protect something much more fragile: &lt;strong&gt;momentum&lt;/strong&gt;.&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://www.christophergreening.com/" rel="noopener noreferrer" class="c-link"&gt;
            Chris Greening - Software Developer
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            Hey! My name's Chris Greening and I'm a software developer from the New York metro area with a diverse range of engineering experience - beam me a message and let's build something great!
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.christophergreening.com%2Fstatic%2Ffavicon.png"&gt;
          christophergreening.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;





&lt;h2&gt;
  
  
  ⚙️ The Hidden Cost of Boilerplate
&lt;/h2&gt;

&lt;p&gt;Every time I start a new project, I hit the same wall:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Creating a README&lt;/li&gt;
&lt;li&gt;Spinning up a virtual environment&lt;/li&gt;
&lt;li&gt;Configuring GitHub Actions&lt;/li&gt;
&lt;li&gt;Deploying to GitHub Pages&lt;/li&gt;
&lt;li&gt;Setting up analytics, docs, versioning...&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of this is hard — but &lt;strong&gt;it's all friction&lt;/strong&gt;. And that friction adds up right at the moment you're most energized and ready to create.&lt;/p&gt;

&lt;p&gt;By the time everything's wired together, the excitement fades, and the magic of that initial idea gets buried under boilerplate.&lt;/p&gt;




&lt;h2&gt;
  
  
  🌱 Greening Is Built for Momentum
&lt;/h2&gt;

&lt;p&gt;Greening is my attempt to &lt;strong&gt;codify that initial burst of energy&lt;/strong&gt; — and make sure nothing slows it down.&lt;/p&gt;

&lt;p&gt;With a single command like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;greening new
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;You're not just scaffolding a folder. You're generating:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A working GitHub project&lt;/li&gt;
&lt;li&gt;A committed Git repo (optionally pushed)&lt;/li&gt;
&lt;li&gt;GitHub Actions wired up&lt;/li&gt;
&lt;li&gt;A PyPI-ready Python package&lt;/li&gt;
&lt;li&gt;Documentation deployed to GitHub Pages&lt;/li&gt;
&lt;li&gt;Optional Google Analytics tracking&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No decisions to make. No boilerplate to copy. You can go from idea → working, publishable project in &lt;strong&gt;seconds&lt;/strong&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  🛠 Tools Are Philosophy
&lt;/h2&gt;

&lt;p&gt;I’ve come to believe that developer tools encode values.&lt;/p&gt;

&lt;p&gt;Greening encodes a belief that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Starting should be fast&lt;/li&gt;
&lt;li&gt;Publishing should be default&lt;/li&gt;
&lt;li&gt;Projects should look polished right out of the gate&lt;/li&gt;
&lt;li&gt;Repetition should be automated&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because the sooner we can remove friction, the sooner we can get to &lt;strong&gt;the good stuff&lt;/strong&gt; — the real creative work.&lt;/p&gt;


&lt;h2&gt;
  
  
  🚀 What’s Next?
&lt;/h2&gt;

&lt;p&gt;Greening is still early, but it’s growing fast. I’m working on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Plugin support for different stacks&lt;/li&gt;
&lt;li&gt;Automatic changelog generation&lt;/li&gt;
&lt;li&gt;Custom templates for repeatable custom GitHub Pages deployments&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're someone who wants to spend less time setting up and more time shipping, I’d love your feedback.&lt;/p&gt;

&lt;p&gt;Follow the project on GitHub!:&lt;br&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/chris-greening" rel="noopener noreferrer"&gt;
        chris-greening
      &lt;/a&gt; / &lt;a href="https://github.com/chris-greening/greening" rel="noopener noreferrer"&gt;
        greening
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      greening is an opinionated, lightweight project automation tool for solo developers and creative coders.  With just a few commands, you can scaffold a production-ready Python package — complete with docs, tests, GitHub Actions workflows, PyPI packaging, and an auto-deployed GitHub Pages site. No boilerplate. No setup hell. Just instant polish.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;
  &lt;a rel="noopener noreferrer" href="https://github.com/chris-greening/greening/media/logo.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fchris-greening%2Fgreening%2Fmedia%2Flogo.png" width="800px"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;🌱 Greening&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;code&gt;greening&lt;/code&gt; is an opinionated, full-stack Project as Code automation tool for solo developers and creative coders.&lt;/p&gt;

&lt;p&gt;With just a few commands, you can scaffold a production-ready Python package complete with docs, tests, GitHub Actions workflows, PyPI packaging, and an auto-deployed GitHub Pages site
No boilerplate or setup hell, just instant polish.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://pepy.tech/project/greening" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/832ba7129203ca569ad4c1b4d0013584eec5dbe12dbe0eb5808443b556ec38da/68747470733a2f2f7374617469632e706570792e746563682f706572736f6e616c697a65642d62616467652f677265656e696e673f706572696f643d746f74616c26756e6974733d696e7465726e6174696f6e616c5f73797374656d266c6566745f636f6c6f723d677265792672696768745f636f6c6f723d627269676874677265656e266c6566745f746578743d646f776e6c6f616473" alt="Downloads"&gt;&lt;/a&gt;
&lt;a href="https://github.com/chris-greening/greening/issues" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/73a7a8a70549205213d901cc7d56cff5150864e56ac9c64cc6b7841db456ff8b/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6973737565732f63687269732d677265656e696e672f677265656e696e67" alt="Issues"&gt;&lt;/a&gt;
&lt;a href="https://github.com/chris-greening/greening/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/afc9b523e1b7ffbee161e8efeff82d01431d34a66a674a6d620bc6efbd307249/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f63687269732d677265656e696e672f677265656e696e67" alt="License"&gt;&lt;/a&gt;
&lt;a href="https://pypi.org/project/greening/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/6d838be18d9351166a4a987cc0c385bf8ec51da8a10a8b10aed755d28bba733d/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f677265656e696e673f636f6c6f723d627269676874677265656e" alt="Version"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.buymeacoffee.com/chrisgreening" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/9f44ce2dc3b3eecdd02598900866ffc518801df1932849703dae1e5ce5031070/68747470733a2f2f7777772e6275796d6561636f666665652e636f6d2f6173736574732f696d672f637573746f6d5f696d616765732f6f72616e67655f696d672e706e67" alt='"Buy Me A Coffee"'&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Table of Contents&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/chris-greening/greening#why-greening" rel="noopener noreferrer"&gt;🍃 Why &lt;code&gt;greening&lt;/code&gt;?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/chris-greening/greening#key-features" rel="noopener noreferrer"&gt;🌿 Key features&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/chris-greening/greening#getting-started" rel="noopener noreferrer"&gt;🌲 Getting started&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/chris-greening/greening#github-authentication" rel="noopener noreferrer"&gt;🌻 GitHub authentication&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/chris-greening/greening#blog" rel="noopener noreferrer"&gt;🌳 Blog posts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/chris-greening/greening#roadmap" rel="noopener noreferrer"&gt;🌴 Roadmap&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/chris-greening/greening#support" rel="noopener noreferrer"&gt;🍀 Support&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🍃 Why &lt;code&gt;greening&lt;/code&gt;? 
&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;Most devs never ship their tools. Not because the code isn’t good, but because the surrounding friction is too high:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;How do I structure the project?&lt;/li&gt;
&lt;li&gt;How do I set up CI/CD, tests, and linting?&lt;/li&gt;
&lt;li&gt;How do I make it look legit?&lt;/li&gt;
&lt;li&gt;How do I talk about it?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;greening&lt;/code&gt; answers all of that in &lt;strong&gt;one opinionated workflow&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;
  &lt;a rel="noopener noreferrer" href="https://github.com/chris-greening/greening/media/greening_usage_speed.gif"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fchris-greening%2Fgreening%2Fmedia%2Fgreening_usage_speed.gif" alt="User typing in commands greening init, greening new, and greening deploy and rapidly deploying a project" width="600px"&gt;&lt;/a&gt;
&lt;/p&gt;




&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🌿 Key features 
&lt;/h2&gt;

&lt;/div&gt;

&lt;p&gt;&lt;code&gt;greening&lt;/code&gt; automates your project creation pipeline:&lt;/p&gt;

&lt;p&gt;✅ &lt;code&gt;greening init&lt;/code&gt;…&lt;/p&gt;
&lt;/div&gt;


&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/chris-greening/greening" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;





&lt;p&gt;&lt;strong&gt;Let's spend less time on boilerplate and more time building.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
That’s the heart of Greening.&lt;/p&gt;

</description>
      <category>python</category>
      <category>opensource</category>
      <category>automation</category>
      <category>tooling</category>
    </item>
    <item>
      <title>How to Enable Google Analytics Tracking in Your Greening-Deployed Site</title>
      <dc:creator>Chris Greening</dc:creator>
      <pubDate>Sat, 05 Apr 2025 02:05:32 +0000</pubDate>
      <link>https://forem.com/chrisgreening/how-to-enable-google-analytics-tracking-in-your-greening-deployed-site-4830</link>
      <guid>https://forem.com/chrisgreening/how-to-enable-google-analytics-tracking-in-your-greening-deployed-site-4830</guid>
      <description>&lt;p&gt;Want to track visitors to your open-source project site or personal portfolio? Greening makes it easy to wire up &lt;strong&gt;Google Analytics&lt;/strong&gt; — no manual editing required.&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://www.christophergreening.com/" rel="noopener noreferrer" class="c-link"&gt;
            Chris Greening - Software Developer
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            Hey! My name's Chris Greening and I'm a software developer from the New York metro area with a diverse range of engineering experience - beam me a message and let's build something great!
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.christophergreening.com%2Fstatic%2Ffavicon.png"&gt;
          christophergreening.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;With just a few lines in your &lt;code&gt;greening.yaml&lt;/code&gt; config, you can automatically include a Google Analytics tracking ID in your deployed GitHub Pages site.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧠 Why This Is Useful
&lt;/h2&gt;

&lt;p&gt;Traditional static site setups (Jekyll, Hugo, etc.) require you to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Manually edit template files or &lt;code&gt;_config.yml&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Copy and paste Google scripts&lt;/li&gt;
&lt;li&gt;Hope nothing breaks in the build&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Greening skips all that.&lt;/strong&gt; Just provide your tracking tag, and it handles the rest.&lt;/p&gt;

&lt;h2&gt;
  
  
  📈 What You’ll Need
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;A &lt;strong&gt;Google Analytics 4&lt;/strong&gt; property&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;Measurement ID&lt;/strong&gt; (e.g., &lt;code&gt;G-XXXXXXXXXX&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;A Greening project with a configured &lt;code&gt;greening.yaml&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  ✏️ Step 1: Grab Your Tracking Tag
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;a href="https://analytics.google.com/" rel="noopener noreferrer"&gt;Google Analytics&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Select or create a GA4 property&lt;/li&gt;
&lt;li&gt;Navigate to &lt;strong&gt;Admin → Data Streams → Web&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Copy the &lt;strong&gt;Measurement ID&lt;/strong&gt; (starts with &lt;code&gt;G-&lt;/code&gt;)&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  📄 Step 2: Paste It into &lt;code&gt;greening.yaml&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;In your project’s root directory, open or create a &lt;code&gt;greening.yaml&lt;/code&gt; file and add:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;google_analytics&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;G-XXXXXXXXXX&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Replace &lt;code&gt;G-XXXXXXXXXX&lt;/code&gt; with your actual tag.&lt;/p&gt;
&lt;h2&gt;
  
  
  🚀 Step 3: Deploy Your Site
&lt;/h2&gt;

&lt;p&gt;Run the following command to generate and publish your GitHub Pages site:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;greening deploy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Greening will:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Render your site using Jekyll and the Minimal Mistakes theme&lt;/li&gt;
&lt;li&gt;Inject your analytics tag automatically&lt;/li&gt;
&lt;li&gt;Push it to the &lt;code&gt;gh-pages&lt;/code&gt; branch&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  ✅ You’re Done!
&lt;/h2&gt;

&lt;p&gt;Visit your site, and you’ll start seeing traffic data appear in your GA4 dashboard — no manual setup, no scripts to mess with.&lt;/p&gt;



&lt;p&gt;Greening’s mission is to make launching, documenting, and deploying projects &lt;strong&gt;fast, beautiful, and automated&lt;/strong&gt;. Adding analytics should never be the bottleneck.&lt;/p&gt;

&lt;p&gt;You can follow the project or contribute on GitHub:&lt;br&gt;
👉 &lt;a href="https://github.com/chris-greening/greening" rel="noopener noreferrer"&gt;https://github.com/chris-greening/greening&lt;/a&gt;&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/chris-greening" rel="noopener noreferrer"&gt;
        chris-greening
      &lt;/a&gt; / &lt;a href="https://github.com/chris-greening/greening" rel="noopener noreferrer"&gt;
        greening
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      greening is an opinionated, lightweight project automation tool for solo developers and creative coders.  With just a few commands, you can scaffold a production-ready Python package — complete with docs, tests, GitHub Actions workflows, PyPI packaging, and an auto-deployed GitHub Pages site. No boilerplate. No setup hell. Just instant polish.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;
  &lt;a rel="noopener noreferrer" href="https://github.com/chris-greening/greening/media/logo.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fchris-greening%2Fgreening%2Fmedia%2Flogo.png" width="800px"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;🌱 Greening&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;code&gt;greening&lt;/code&gt; is an opinionated, full-stack Project as Code automation tool for solo developers and creative coders.&lt;/p&gt;

&lt;p&gt;With just a few commands, you can scaffold a production-ready Python package complete with docs, tests, GitHub Actions workflows, PyPI packaging, and an auto-deployed GitHub Pages site
No boilerplate or setup hell, just instant polish.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://pepy.tech/project/greening" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/832ba7129203ca569ad4c1b4d0013584eec5dbe12dbe0eb5808443b556ec38da/68747470733a2f2f7374617469632e706570792e746563682f706572736f6e616c697a65642d62616467652f677265656e696e673f706572696f643d746f74616c26756e6974733d696e7465726e6174696f6e616c5f73797374656d266c6566745f636f6c6f723d677265792672696768745f636f6c6f723d627269676874677265656e266c6566745f746578743d646f776e6c6f616473" alt="Downloads"&gt;&lt;/a&gt;
&lt;a href="https://github.com/chris-greening/greening/issues" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/73a7a8a70549205213d901cc7d56cff5150864e56ac9c64cc6b7841db456ff8b/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6973737565732f63687269732d677265656e696e672f677265656e696e67" alt="Issues"&gt;&lt;/a&gt;
&lt;a href="https://github.com/chris-greening/greening/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/afc9b523e1b7ffbee161e8efeff82d01431d34a66a674a6d620bc6efbd307249/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f63687269732d677265656e696e672f677265656e696e67" alt="License"&gt;&lt;/a&gt;
&lt;a href="https://pypi.org/project/greening/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/6d838be18d9351166a4a987cc0c385bf8ec51da8a10a8b10aed755d28bba733d/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f677265656e696e673f636f6c6f723d627269676874677265656e" alt="Version"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.buymeacoffee.com/chrisgreening" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/9f44ce2dc3b3eecdd02598900866ffc518801df1932849703dae1e5ce5031070/68747470733a2f2f7777772e6275796d6561636f666665652e636f6d2f6173736574732f696d672f637573746f6d5f696d616765732f6f72616e67655f696d672e706e67" alt='"Buy Me A Coffee"'&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Table of Contents&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/chris-greening/greening#why-greening" rel="noopener noreferrer"&gt;🍃 Why &lt;code&gt;greening&lt;/code&gt;?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/chris-greening/greening#key-features" rel="noopener noreferrer"&gt;🌿 Key features&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/chris-greening/greening#getting-started" rel="noopener noreferrer"&gt;🌲 Getting started&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/chris-greening/greening#github-authentication" rel="noopener noreferrer"&gt;🌻 GitHub authentication&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/chris-greening/greening#blog" rel="noopener noreferrer"&gt;🌳 Blog posts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/chris-greening/greening#roadmap" rel="noopener noreferrer"&gt;🌴 Roadmap&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/chris-greening/greening#support" rel="noopener noreferrer"&gt;🍀 Support&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🍃 Why &lt;code&gt;greening&lt;/code&gt;? 
&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;Most devs never ship their tools. Not because the code isn’t good, but because the surrounding friction is too high:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;How do I structure the project?&lt;/li&gt;
&lt;li&gt;How do I set up CI/CD, tests, and linting?&lt;/li&gt;
&lt;li&gt;How do I make it look legit?&lt;/li&gt;
&lt;li&gt;How do I talk about it?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;greening&lt;/code&gt; answers all of that in &lt;strong&gt;one opinionated workflow&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;
  &lt;a rel="noopener noreferrer" href="https://github.com/chris-greening/greening/media/greening_usage_speed.gif"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fchris-greening%2Fgreening%2Fmedia%2Fgreening_usage_speed.gif" alt="User typing in commands greening init, greening new, and greening deploy and rapidly deploying a project" width="600px"&gt;&lt;/a&gt;
&lt;/p&gt;




&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🌿 Key features 
&lt;/h2&gt;

&lt;/div&gt;

&lt;p&gt;&lt;code&gt;greening&lt;/code&gt; automates your project creation pipeline:&lt;/p&gt;

&lt;p&gt;✅ &lt;code&gt;greening init&lt;/code&gt;…&lt;/p&gt;
&lt;/div&gt;


&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/chris-greening/greening" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


</description>
      <category>python</category>
      <category>opensource</category>
      <category>automation</category>
      <category>tooling</category>
    </item>
    <item>
      <title>Introducing Greening: Ship Beautiful Software, Fast</title>
      <dc:creator>Chris Greening</dc:creator>
      <pubDate>Fri, 04 Apr 2025 15:00:00 +0000</pubDate>
      <link>https://forem.com/chrisgreening/introducing-greening-ship-beautiful-software-fast-55do</link>
      <guid>https://forem.com/chrisgreening/introducing-greening-ship-beautiful-software-fast-55do</guid>
      <description>&lt;p&gt;I built &lt;strong&gt;Greening&lt;/strong&gt; because I was tired of boilerplating the same setup over and over again. GitHub Actions, README templates, virtualenvs, docs, deployment pipelines — it adds up fast. And even worse, it slows you down right at the moment you're most excited to build something new.&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://www.christophergreening.com/" rel="noopener noreferrer" class="c-link"&gt;
            Chris Greening - Software Developer
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            Hey! My name's Chris Greening and I'm a software developer from the New York metro area with a diverse range of engineering experience - beam me a message and let's build something great!
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.christophergreening.com%2Fstatic%2Ffavicon.png"&gt;
          christophergreening.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Greening&lt;/strong&gt; is an open source automation tool that eliminates the friction of starting, documenting, and shipping your next software project. Whether it's a Python package, a portfolio project, or a polished GitHub Pages site, Greening handles the scaffolding, Git setup, documentation, and even optional Google Analytics integration — all in one command.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I Built It
&lt;/h2&gt;

&lt;p&gt;As a solo dev, context-switching kills momentum. I found myself avoiding small projects simply because I didn't want to spend an hour setting up the boilerplate. So I asked:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What if I could &lt;em&gt;automate the launch of my projects&lt;/em&gt; just like I automate my tests, builds, and deployments?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Greening grew from that idea.&lt;/p&gt;

&lt;h2&gt;
  
  
  What It Does
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;📁 &lt;code&gt;greening new&lt;/code&gt; creates a new project, scaffolds a clean structure, and optionally sets up Git, virtual environments, and GitHub remotes.&lt;/li&gt;
&lt;li&gt;🌐 &lt;code&gt;greening deploy&lt;/code&gt; generates and deploys a beautiful Jekyll-based GitHub Pages site — perfect for project documentation.&lt;/li&gt;
&lt;li&gt;📊 Google Analytics integration? Just drop your tag into the config, and you're done.&lt;/li&gt;
&lt;li&gt;⚙️ Customizable YAML-based config with opinionated defaults that get out of your way.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Philosophy
&lt;/h2&gt;

&lt;p&gt;Greening is built on a few key ideas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ship fast.&lt;/strong&gt; Don’t let tooling slow down your ideas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Repeatable and scalable.&lt;/strong&gt; Make every project look clean and polished from day one.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Beautiful by default.&lt;/strong&gt; Your software deserves a good first impression.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automation-first.&lt;/strong&gt; If you’ve done it more than twice, Greening should probably do it for you.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What’s Next
&lt;/h2&gt;

&lt;p&gt;I’m working toward a plugin-based ecosystem so you can extend Greening to match your exact workflow. Want to auto-generate CHANGELOGs? Autodoc your Python code? Auto-post releases to social media? That’s where we’re headed.&lt;/p&gt;




&lt;p&gt;You can check out the project on GitHub here 👉&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/chris-greening" rel="noopener noreferrer"&gt;
        chris-greening
      &lt;/a&gt; / &lt;a href="https://github.com/chris-greening/greening" rel="noopener noreferrer"&gt;
        greening
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      greening is an opinionated, lightweight project automation tool for solo developers and creative coders.  With just a few commands, you can scaffold a production-ready Python package — complete with docs, tests, GitHub Actions workflows, PyPI packaging, and an auto-deployed GitHub Pages site. No boilerplate. No setup hell. Just instant polish.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;
  &lt;a rel="noopener noreferrer" href="https://github.com/chris-greening/greening/media/logo.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fchris-greening%2Fgreening%2Fmedia%2Flogo.png" width="800px"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;🌱 Greening&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;code&gt;greening&lt;/code&gt; is an opinionated, full-stack Project as Code automation tool for solo developers and creative coders.&lt;/p&gt;

&lt;p&gt;With just a few commands, you can scaffold a production-ready Python package complete with docs, tests, GitHub Actions workflows, PyPI packaging, and an auto-deployed GitHub Pages site
No boilerplate or setup hell, just instant polish.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://pepy.tech/project/greening" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/832ba7129203ca569ad4c1b4d0013584eec5dbe12dbe0eb5808443b556ec38da/68747470733a2f2f7374617469632e706570792e746563682f706572736f6e616c697a65642d62616467652f677265656e696e673f706572696f643d746f74616c26756e6974733d696e7465726e6174696f6e616c5f73797374656d266c6566745f636f6c6f723d677265792672696768745f636f6c6f723d627269676874677265656e266c6566745f746578743d646f776e6c6f616473" alt="Downloads"&gt;&lt;/a&gt;
&lt;a href="https://github.com/chris-greening/greening/issues" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/73a7a8a70549205213d901cc7d56cff5150864e56ac9c64cc6b7841db456ff8b/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6973737565732f63687269732d677265656e696e672f677265656e696e67" alt="Issues"&gt;&lt;/a&gt;
&lt;a href="https://github.com/chris-greening/greening/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/afc9b523e1b7ffbee161e8efeff82d01431d34a66a674a6d620bc6efbd307249/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f63687269732d677265656e696e672f677265656e696e67" alt="License"&gt;&lt;/a&gt;
&lt;a href="https://pypi.org/project/greening/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/6d838be18d9351166a4a987cc0c385bf8ec51da8a10a8b10aed755d28bba733d/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f677265656e696e673f636f6c6f723d627269676874677265656e" alt="Version"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.buymeacoffee.com/chrisgreening" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/9f44ce2dc3b3eecdd02598900866ffc518801df1932849703dae1e5ce5031070/68747470733a2f2f7777772e6275796d6561636f666665652e636f6d2f6173736574732f696d672f637573746f6d5f696d616765732f6f72616e67655f696d672e706e67" alt='"Buy Me A Coffee"'&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Table of Contents&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/chris-greening/greening#why-greening" rel="noopener noreferrer"&gt;🍃 Why &lt;code&gt;greening&lt;/code&gt;?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/chris-greening/greening#key-features" rel="noopener noreferrer"&gt;🌿 Key features&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/chris-greening/greening#getting-started" rel="noopener noreferrer"&gt;🌲 Getting started&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/chris-greening/greening#github-authentication" rel="noopener noreferrer"&gt;🌻 GitHub authentication&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/chris-greening/greening#blog" rel="noopener noreferrer"&gt;🌳 Blog posts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/chris-greening/greening#roadmap" rel="noopener noreferrer"&gt;🌴 Roadmap&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/chris-greening/greening#support" rel="noopener noreferrer"&gt;🍀 Support&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🍃 Why &lt;code&gt;greening&lt;/code&gt;? 
&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;Most devs never ship their tools. Not because the code isn’t good, but because the surrounding friction is too high:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;How do I structure the project?&lt;/li&gt;
&lt;li&gt;How do I set up CI/CD, tests, and linting?&lt;/li&gt;
&lt;li&gt;How do I make it look legit?&lt;/li&gt;
&lt;li&gt;How do I talk about it?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;greening&lt;/code&gt; answers all of that in &lt;strong&gt;one opinionated workflow&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;
  &lt;a rel="noopener noreferrer" href="https://github.com/chris-greening/greening/media/greening_usage_speed.gif"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fchris-greening%2Fgreening%2Fmedia%2Fgreening_usage_speed.gif" alt="User typing in commands greening init, greening new, and greening deploy and rapidly deploying a project" width="600px"&gt;&lt;/a&gt;
&lt;/p&gt;




&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🌿 Key features 
&lt;/h2&gt;

&lt;/div&gt;

&lt;p&gt;&lt;code&gt;greening&lt;/code&gt; automates your project creation pipeline:&lt;/p&gt;

&lt;p&gt;✅ &lt;code&gt;greening init&lt;/code&gt;…&lt;/p&gt;
&lt;/div&gt;


&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/chris-greening/greening" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


</description>
      <category>python</category>
      <category>opensource</category>
      <category>showdev</category>
      <category>automation</category>
    </item>
    <item>
      <title>Simulating simple CRT and glitch effects in Pygame</title>
      <dc:creator>Chris Greening</dc:creator>
      <pubDate>Sun, 23 Mar 2025 17:13:39 +0000</pubDate>
      <link>https://forem.com/chrisgreening/simulating-simple-crt-and-glitch-effects-in-pygame-1mf1</link>
      <guid>https://forem.com/chrisgreening/simulating-simple-crt-and-glitch-effects-in-pygame-1mf1</guid>
      <description>&lt;p&gt;For my retro-style arcade shooter &lt;strong&gt;Planetoids&lt;/strong&gt;, I wanted to give the visuals a nostalgic kick—like you were staring at a dusty CRT screen in an '80s arcade.&lt;/p&gt;

&lt;p&gt;I also wanted &lt;strong&gt;VHS-style glitch effects&lt;/strong&gt; that make the screen &lt;em&gt;feel alive&lt;/em&gt;—shaking, flickering, distorting—especially when something chaotic is happening in-game.&lt;/p&gt;

&lt;p&gt;In this post, I’ll walk through how I implemented all of that using &lt;strong&gt;plain Pygame&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔧 Overview: &lt;code&gt;apply_crt_effect&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Here's the single entry point we use every frame:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;apply_crt_effect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;screen&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;intensity&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;medium&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pixelation&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;minimum&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This applies multiple visual layers that can be configured through the settings screen:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Scanlines
&lt;/li&gt;
&lt;li&gt;Pixelation
&lt;/li&gt;
&lt;li&gt;Flicker
&lt;/li&gt;
&lt;li&gt;Glow
&lt;/li&gt;
&lt;li&gt;VHS-style glitch effects (jitter, static, color separation)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Let’s break each one down.&lt;/p&gt;


&lt;h2&gt;
  
  
  1. &lt;code&gt;Scanlines&lt;/code&gt;: Simulating CRT Lines
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_apply_scanlines&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;screen&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;screen&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_size&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;scanline_surface&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pygame&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Surface&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;pygame&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SRCALPHA&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;pygame&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;draw&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;line&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;scanline_surface&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

    &lt;span class="n"&gt;screen&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;blit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;scanline_surface&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This draws semi-transparent horizontal black lines across the screen, spaced every 4 pixels, simulating the horizontal scanlines seen on CRT monitors.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Want more intense lines? Decrease the spacing or increase alpha.
&lt;/li&gt;
&lt;li&gt;It adds an immediate analog vibe and subtly breaks up the digital sharpness.&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  2. &lt;code&gt;Pixelation&lt;/code&gt;: Deliberate Resolution Downgrade
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fak7ey4hnzgseky5en6d4.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fak7ey4hnzgseky5en6d4.gif" alt="Image description" width="708" height="400"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_apply_pixelation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;screen&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pixelation&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;pixelation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;minimum&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;medium&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;maximum&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;}.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pixelation&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;screen&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_size&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;small_surf&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pygame&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;scale&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;screen&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;width&lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="n"&gt;pixelation&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="n"&gt;pixelation&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;screen&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;blit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pygame&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;scale&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;small_surf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This temporarily shrinks the screen resolution and scales it back up, creating a pixelated, low-res effect.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;We use this &lt;em&gt;after rendering everything else&lt;/em&gt; so the whole frame gets affected.
&lt;/li&gt;
&lt;li&gt;Makes the game feel more gritty and less digital-clean.&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  3. &lt;code&gt;Flicker&lt;/code&gt;: A Soft Glow Pulse
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_apply_flicker&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;screen&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;randint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;flicker_surface&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pygame&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Surface&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;screen&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_size&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;pygame&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SRCALPHA&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;flicker_surface&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fill&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="n"&gt;screen&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;blit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;flicker_surface&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Every so often (about 5% of frames), a subtle white overlay is applied.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;This simulates the fluctuating brightness of a CRT bulb.
&lt;/li&gt;
&lt;li&gt;Super subtle, but it makes the screen &lt;em&gt;feel&lt;/em&gt; alive, especially when combined with glow.&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  4. &lt;code&gt;Glow&lt;/code&gt;: Simulated Light Bleed
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_apply_glow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;screen&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;screen&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_size&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;glow_surf&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pygame&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;smoothscale&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;screen&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;width&lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;glow_surf&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pygame&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;smoothscale&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;glow_surf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;glow_surf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set_alpha&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;screen&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;blit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;glow_surf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This creates a soft bloom/glow effect by:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Downscaling the screen (blurring it),
&lt;/li&gt;
&lt;li&gt;Upscaling it again,
&lt;/li&gt;
&lt;li&gt;Layering it back on top.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;It's an easy way to fake blur and create that soft glow old CRTs had when they burned too bright.&lt;/p&gt;


&lt;h2&gt;
  
  
  5. &lt;code&gt;VHS Glitch&lt;/code&gt;: The Controlled Chaos
&lt;/h2&gt;

&lt;p&gt;This section ties everything together by adding movement, noise, and distortion.&lt;/p&gt;
&lt;h3&gt;
  
  
  5.1 Horizontal Slice Glitches
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_add_glitch_effect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;glitch_surface&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;intensity&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;shift_amount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;minimum&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;medium&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;maximum&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;}.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;intensity&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;random&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;y_start&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;randint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;slice_height&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;randint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;offset&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;randint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;shift_amount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;shift_amount&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;slice_area&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pygame&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Rect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_start&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;slice_height&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;slice_copy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;glitch_surface&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;subsurface&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;slice_area&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;copy&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;glitch_surface&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;blit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;slice_copy&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;offset&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_start&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Random slices of the screen are offset left or right—mimicking VHS tracking issues or old screen flickers.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Triggered randomly per frame.
&lt;/li&gt;
&lt;li&gt;Intensity controls how far the lines can jump.&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  5.2 RGB Color Separation
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_add_color_separation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;screen&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;glitch_surface&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;intensity&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;color_shift&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;minimum&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;medium&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;maximum&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;}.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;intensity&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;random&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mf"&gt;0.05&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;x_offset&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;randint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;color_shift&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color_shift&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;y_offset&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;randint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;color_shift&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color_shift&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;color_shift_surface&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;glitch_surface&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;copy&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="n"&gt;color_shift_surface&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fill&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
            &lt;span class="n"&gt;color_shift_surface&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;blit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;glitch_surface&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x_offset&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_offset&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
            &lt;span class="n"&gt;screen&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;blit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;color_shift_surface&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;special_flags&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;pygame&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BLEND_ADD&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This simulates the separation of red, green, and blue channels for &lt;em&gt;glitchy VHS color bleed.&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Only triggers occasionally.
&lt;/li&gt;
&lt;li&gt;Intensity controls how far apart the color layers get.&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  5.3 Rolling Static
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_add_rolling_static&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;screen&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;intensity&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;static_chance&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;minimum&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;medium&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;maximum&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.8&lt;/span&gt;&lt;span class="p"&gt;}.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;intensity&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;static_surface&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pygame&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Surface&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;pygame&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SRCALPHA&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;random&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;static_chance&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;pygame&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;draw&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;line&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;static_surface&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;randint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

    &lt;span class="n"&gt;screen&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;blit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;static_surface&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;special_flags&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;pygame&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BLEND_ADD&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;A final touch: horizontal white noise lines that appear and disappear in random rows.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Like old static interference rolling up the screen.
&lt;/li&gt;
&lt;li&gt;Controlled by &lt;code&gt;intensity&lt;/code&gt;, which raises or lowers the frequency.&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  🧠 Final Thoughts
&lt;/h2&gt;

&lt;p&gt;All of this runs in &lt;strong&gt;real time&lt;/strong&gt; using Pygame’s surface tools.&lt;/p&gt;

&lt;p&gt;None of it requires shaders, OpenGL, or special GPU code and is a fairly lightweight approach for integrating into 2D games.&lt;/p&gt;

&lt;p&gt;These effects make Planetoids &lt;em&gt;feel like an experience&lt;/em&gt;—not just a game. When the screen distorts after a power-up or flickers from a near-death explosion, you don’t just see it you &lt;em&gt;feel&lt;/em&gt; it.&lt;/p&gt;


&lt;h2&gt;
  
  
  🚀 Try It Out
&lt;/h2&gt;

&lt;p&gt;You can install Planetoids via pip:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;planetoids-game
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;then start right from the command line&lt;br&gt;
&lt;br&gt;
 &lt;code&gt;&amp;gt; planetoids&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/chris-greening" rel="noopener noreferrer"&gt;
        chris-greening
      &lt;/a&gt; / &lt;a href="https://github.com/chris-greening/planetoids" rel="noopener noreferrer"&gt;
        planetoids
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Planetoids is a fast-paced, retro-inspired arcade space shooter built in Python with Pygame. Dodge asteroids and experience a vintage arcade feel with CRT effects, glitch animations, and pixel-perfect scaling.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;
&lt;strong&gt;Planetoids&lt;/strong&gt;: A Retro-Inspired Space Shooter&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;
  &lt;a rel="noopener noreferrer" href="https://github.com/chris-greening/planetoidsmedia/planetoids.gif"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fchris-greening%2Fplanetoidsmedia%2Fplanetoids.gif" alt="GIF of Planetoids gameplay showing asteroids, a spaceship, and CRT visual effects"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;&lt;strong&gt;What is it?&lt;/strong&gt;&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Planetoids&lt;/strong&gt; is a fast-paced, retro-inspired &lt;strong&gt;arcade space shooter&lt;/strong&gt; built in Python with &lt;strong&gt;Pygame&lt;/strong&gt;.&lt;br&gt;
Dodge asteroids and experience a vintage arcade feel with CRT effects, glitch animations, and pixel-perfect scaling.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/chris-greening/planetoids/issues" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/b3e698668830d29cd4c82a03d00bb21d0a16d85ac1b754fc5222aba2b0404860/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6973737565732f63687269732d677265656e696e672f706c616e65746f696473" alt="Issues"&gt;&lt;/a&gt;
&lt;a href="https://github.com/chris-greening/planetoidsLICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/be0968cfcb4a9461185b844a17de5bbad00b9be303dd0a37e6ce09b997acd31a/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f63687269732d677265656e696e672f706c616e65746f696473" alt="License"&gt;&lt;/a&gt;
&lt;a href="https://pepy.tech/projects/planetoids-game" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/b1086ea4ce6ab2cbf657309ba2fdb571909a4f1ed3847332f18f919ced0450b5/68747470733a2f2f7374617469632e706570792e746563682f62616467652f706c616e65746f6964732d67616d65" alt="PyPI Downloads"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.buymeacoffee.com/chrisgreening" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/0b448aabee402aaf7b3b256ae471e7dc66bcf174fad7d6bb52b27138b2364e47/68747470733a2f2f7777772e6275796d6561636f666665652e636f6d2f6173736574732f696d672f637573746f6d5f696d616765732f6f72616e67655f696d672e706e67" alt='"Buy Me A Coffee"'&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;&lt;strong&gt;🪐 Key Features&lt;/strong&gt;&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Fast-paced asteroid destruction&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Smooth FPS-independent physics&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Retro CRT visual effects &amp;amp; glitch animations&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Classic arcade gameplay mechanics&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Power-ups and increasing difficulty&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pixel-perfect scaling for all screen sizes&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
  &lt;a rel="noopener noreferrer" href="https://github.com/chris-greening/planetoidsmedia/crt_effect.gif"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fchris-greening%2Fplanetoidsmedia%2Fcrt_effect.gif" alt="CRT visual effect applied to gameplay"&gt;&lt;/a&gt;
&lt;/p&gt;




&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;&lt;strong&gt;💾 Installation&lt;/strong&gt;&lt;/h2&gt;

&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;&lt;strong&gt;🔹 Install from PyPI (Recommended)&lt;/strong&gt;&lt;/h3&gt;

&lt;/div&gt;

&lt;p&gt;The easiest way to install &lt;strong&gt;Planetoids&lt;/strong&gt; is through &lt;strong&gt;pip&lt;/strong&gt;:&lt;/p&gt;

&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;pip install planetoids-game&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Once installed, launch the game by running:&lt;/p&gt;

&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;planetoids&lt;/pre&gt;

&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;&lt;strong&gt;🔹 Install from Source&lt;/strong&gt;&lt;/h3&gt;

&lt;/div&gt;

&lt;p&gt;If you want the latest development version, you can install directly from GitHub:&lt;/p&gt;

&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;git clone https://github.com/chris-greening/planetoids-game.git
&lt;span class="pl-c1"&gt;cd&lt;/span&gt; planetoids-game
pip install -e &lt;span class="pl-c1"&gt;.&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Then, start the game with:&lt;/p&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;planetoids&lt;/pre&gt;

&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;&lt;strong&gt;🚀 Running the Game&lt;/strong&gt;&lt;/h2&gt;

&lt;/div&gt;

&lt;p&gt;Once installed, you can start &lt;strong&gt;Planetoids&lt;/strong&gt; in one of the following ways:&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;&lt;strong&gt;🔹 Run from Source&lt;/strong&gt;&lt;/h3&gt;

&lt;/div&gt;

&lt;p&gt;If…&lt;/p&gt;
&lt;/div&gt;


&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/chris-greening/planetoids" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;p&gt;Follow along for more devlogs, insights, and behind-the-scenes experiments.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Thanks so much for reading&lt;/strong&gt; and if you liked my content, be sure to check out some of my other work or &lt;strong&gt;connect&lt;/strong&gt; with me on social media or my &lt;a href="https://www.christophergreening.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;personal website&lt;/strong&gt;&lt;/a&gt; 😄&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://www.christophergreening.com/" rel="noopener noreferrer" class="c-link"&gt;
          Chris Greening - Software Developer
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;p class="truncate-at-3"&gt;
          Hey! My name's Chris Greening and I'm a software developer from the New York metro area with a diverse range of engineering experience - beam me a message and let's build something great!
        &lt;/p&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
          &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.christophergreening.com%2Fstatic%2Ffavicon.png" width="16" height="16"&gt;
        christophergreening.com
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Cheers!&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/chrisgreening" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F482393%2F52b5179a-7754-451f-a6bf-233266e3a62f.jpg" alt="chrisgreening"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/chrisgreening/draw-beautiful-geometric-visualizations-with-python-and-spyrograph-4eec" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Draw beautiful geometric visualizations with Python and Spyrograph&lt;/h2&gt;
      &lt;h3&gt;Chris Greening ・ Mar 12 '23&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#python&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#math&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#opensource&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#showdev&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;div class="ltag__link"&gt;
  &lt;a href="/chrisgreening" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F482393%2F52b5179a-7754-451f-a6bf-233266e3a62f.jpg" alt="chrisgreening"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/chrisgreening/i-added-a-javascript-arcade-game-to-my-portfolio-s-homepage-1jmf" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;I added a JavaScript arcade game to my portfolio's homepage&lt;/h2&gt;
      &lt;h3&gt;Chris Greening ・ Jun 8 '21&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#showdev&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#javascript&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#webdev&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#blogging&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>python</category>
      <category>gamedev</category>
      <category>pygame</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Planetoids! - my first attempt at indie game dev in Python</title>
      <dc:creator>Chris Greening</dc:creator>
      <pubDate>Thu, 20 Mar 2025 12:30:00 +0000</pubDate>
      <link>https://forem.com/chrisgreening/planetoids-my-first-attempt-at-indie-game-dev-in-python-1o2p</link>
      <guid>https://forem.com/chrisgreening/planetoids-my-first-attempt-at-indie-game-dev-in-python-1o2p</guid>
      <description>&lt;p&gt;A couple of weeks ago, I visited a retro arcade packed with classic cabinets from the ‘70s and ‘80s—&lt;strong&gt;Space Invaders&lt;/strong&gt;, &lt;strong&gt;Centipede&lt;/strong&gt;, &lt;strong&gt;Joust&lt;/strong&gt;, you name it. Growing up, one of my favorite memories was playing &lt;strong&gt;Galaga&lt;/strong&gt; every Friday at a diner while visiting my grandparents, so I’ve always had a soft spot for old arcade games.&lt;/p&gt;

&lt;p&gt;After that arcade trip, I left with a thought:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"I should try making one of these myself."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I’d been meaning to learn &lt;a href="https://www.pygame.org/docs/" rel="noopener noreferrer"&gt;Pygame&lt;/a&gt; for years, so this felt like the perfect excuse. At first, I considered tackling one of my absolute favorites &lt;strong&gt;Defender&lt;/strong&gt;, but after realizing how complex the scrolling mechanics were for my first attempt, I pivoted to something simpler—(yet another 😅) Asteroids clone.&lt;/p&gt;

&lt;p&gt;A couple dozen hours later, I’ve got &lt;strong&gt;Planetoids&lt;/strong&gt;—a fast-paced, glitchy, take on the classic. It’s a full-on &lt;strong&gt;retro space shooter&lt;/strong&gt; with juicy explosions, ricocheting lasers, power-ups, and plenty of chaotic moments.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0p00t72jrlq5czchweef.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0p00t72jrlq5czchweef.gif" alt="Image description" width="800" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you want to check it out, it’s up on PyPI (&lt;code&gt;pip install planetoids-game&lt;/code&gt;) and available on &lt;a href="https://github.com/chris-greening/planetoids" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Thanks so much for reading&lt;/strong&gt; and if you liked my content, be sure to check out some of my other work or &lt;strong&gt;connect&lt;/strong&gt; with me on social media or my &lt;a href="https://www.christophergreening.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;personal website&lt;/strong&gt;&lt;/a&gt; 😄&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://www.christophergreening.com/" rel="noopener noreferrer" class="c-link"&gt;
          Chris Greening - Software Developer
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;p class="truncate-at-3"&gt;
          Hey! My name's Chris Greening and I'm a software developer from the New York metro area with a diverse range of engineering experience - beam me a message and let's build something great!
        &lt;/p&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
          &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.christophergreening.com%2Fstatic%2Ffavicon.png" width="16" height="16"&gt;
        christophergreening.com
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Cheers!&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/chrisgreening" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F482393%2F52b5179a-7754-451f-a6bf-233266e3a62f.jpg" alt="chrisgreening"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/chrisgreening/draw-beautiful-geometric-visualizations-with-python-and-spyrograph-4eec" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Draw beautiful geometric visualizations with Python and Spyrograph&lt;/h2&gt;
      &lt;h3&gt;Chris Greening ・ Mar 12 '23&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#python&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#math&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#opensource&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#showdev&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;div class="ltag__link"&gt;
  &lt;a href="/chrisgreening" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F482393%2F52b5179a-7754-451f-a6bf-233266e3a62f.jpg" alt="chrisgreening"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/chrisgreening/i-added-a-javascript-arcade-game-to-my-portfolio-s-homepage-1jmf" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;I added a JavaScript arcade game to my portfolio's homepage&lt;/h2&gt;
      &lt;h3&gt;Chris Greening ・ Jun 8 '21&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#showdev&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#javascript&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#webdev&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#blogging&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
    </item>
    <item>
      <title>Calculating weighted averages with numpy and Python!</title>
      <dc:creator>Chris Greening</dc:creator>
      <pubDate>Tue, 22 Aug 2023 13:00:00 +0000</pubDate>
      <link>https://forem.com/chrisgreening/calculating-weighted-averages-with-numpy-and-python-4m79</link>
      <guid>https://forem.com/chrisgreening/calculating-weighted-averages-with-numpy-and-python-4m79</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Navigating the world of data often means operating in scenarios where &lt;strong&gt;not all data points have the same importance&lt;/strong&gt; as one another&lt;/p&gt;

&lt;p&gt;This is where the &lt;strong&gt;weighted average&lt;/strong&gt;, a statistical tool that assigns importance to each value, helps us incorporate the &lt;strong&gt;context of a situation&lt;/strong&gt; into our average calculations!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;numpy&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;With Python's &lt;strong&gt;versatile ecosystem&lt;/strong&gt; we're able to leverage tools such as &lt;code&gt;numpy&lt;/code&gt; to quickly and efficiently calculate the weighted average in our analyses and data projects&lt;/p&gt;
&lt;h2&gt;
  
  
  Table of contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Prerequisites and installation&lt;/li&gt;
&lt;li&gt;What is the weighted average?&lt;/li&gt;
&lt;li&gt;Examining a simple example&lt;/li&gt;
&lt;li&gt;Using np.average to calculate weighted mean&lt;/li&gt;
&lt;li&gt;Conclusion&lt;/li&gt;
&lt;li&gt;Additional resources&lt;/li&gt;
&lt;/ul&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://www.christophergreening.com/" rel="noopener noreferrer" class="c-link"&gt;
          Chris Greening - Software Developer
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;p class="truncate-at-3"&gt;
          Hey! My name's Chris Greening and I'm a software developer from the New York metro area with a diverse range of engineering experience - beam me a message and let's build something great!
        &lt;/p&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
          &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.christophergreening.com%2Fstatic%2Ffavicon.png" width="16" height="16"&gt;
        christophergreening.com
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;



&lt;h2&gt;
  
  
  Prerequisites and installation &lt;a src="#prerequisites"&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;The following package is a &lt;strong&gt;prerequisite installation&lt;/strong&gt; for following along with this blog post!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://numpy.org/" rel="noopener noreferrer"&gt;numpy&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To install it open your preferred &lt;strong&gt;terminal/console&lt;/strong&gt; and run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip3 &lt;span class="nb"&gt;install &lt;/span&gt;numpy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  What is the weighted average? &lt;a src="#what-is-the-weighted-average"&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://www.wikihow.com/Calculate-Weighted-Average" rel="noopener noreferrer"&gt;weighted average&lt;/a&gt; is an extension of a typical arithmetic mean that includes the importance (or &lt;strong&gt;weight&lt;/strong&gt;) of each data point when calculating the average&lt;/p&gt;

&lt;p&gt;In scenarios where all data points have the same importance, the weighted average &lt;strong&gt;simplifies&lt;/strong&gt; to the standard arithmetic mean. However, when the significance of each data point varies the &lt;strong&gt;weighted average&lt;/strong&gt; becomes a vital tool&lt;/p&gt;
&lt;h2&gt;
  
  
  Examining a simple example &lt;a src="#examining-a-simple-example"&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Let's consider an example where we are a &lt;strong&gt;data scientist&lt;/strong&gt; employed by a university to calculate the average student grade across all classes in the school&lt;/p&gt;

&lt;p&gt;To preserve the privacy of individual students we are only provided data &lt;strong&gt;aggregated&lt;/strong&gt; at the class level and are thus given each individual class'&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;average grade&lt;/li&gt;
&lt;li&gt;number of students&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Our initial instinct might be to just take the usual average across all classes but what happens when comparing small classes to very large classes?&lt;/p&gt;

&lt;p&gt;If a class has an average test score of 20/100 but only has 4 students is it fair to compare it to a class that has an average test score of 93 and 500 students? No!&lt;/p&gt;

&lt;p&gt;If we did that the small class would be given an &lt;strong&gt;outsized&lt;/strong&gt; level of importance as the test grades of just 4 students should not impact the overall mean as much as 500 students&lt;/p&gt;

&lt;p&gt;So how do we incorporate the number of students into our university grade average? &lt;/p&gt;

&lt;p&gt;With the &lt;strong&gt;weighted average&lt;/strong&gt;!&lt;/p&gt;
&lt;h2&gt;
  
  
  Using np.average to calculate weighted average &lt;a src="#using-np-average"&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Continuing with the previous example let's say these are the &lt;code&gt;grades&lt;/code&gt; and their respective &lt;code&gt;number_of_students&lt;/code&gt; per class:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;grades&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;93&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;56&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;79&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;86&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;number_of_students&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;93&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;274&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;To get the weighted average across the entire university using &lt;code&gt;numpy&lt;/code&gt; all we have to do is incorporate the weights into the &lt;a href="https://numpy.org/doc/stable/reference/generated/numpy.average.html" rel="noopener noreferrer"&gt;&lt;code&gt;np.average&lt;/code&gt;&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;numpy&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;
&lt;span class="n"&gt;university_average&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;average&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;grades&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;weights&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;number_of_students&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;university_average&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="mf"&gt;84.57174151150055&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Conclusion &lt;a src="#conclusion"&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;And just like that we're able to quickly incorporate the weighted average into our projects by leveraging the &lt;code&gt;np.average&lt;/code&gt;'s &lt;code&gt;weights&lt;/code&gt; argument&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Thanks so much for reading&lt;/strong&gt; and if you liked my content, be sure to check out some of my other work or &lt;strong&gt;connect&lt;/strong&gt; with me on social media or my &lt;a href="https://www.christophergreening.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;personal website&lt;/strong&gt;&lt;/a&gt; 😄&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://www.christophergreening.com/" rel="noopener noreferrer" class="c-link"&gt;
          Chris Greening - Software Developer
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;p class="truncate-at-3"&gt;
          Hey! My name's Chris Greening and I'm a software developer from the New York metro area with a diverse range of engineering experience - beam me a message and let's build something great!
        &lt;/p&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
          &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.christophergreening.com%2Fstatic%2Ffavicon.png" width="16" height="16"&gt;
        christophergreening.com
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;Cheers!&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/chrisgreening" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F482393%2F52b5179a-7754-451f-a6bf-233266e3a62f.jpg" alt="chrisgreening"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/chrisgreening/effortlessly-scrape-html-tables-into-python-using-pdreadhtml-559p" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Effortlessly scrape HTML tables into Python using pd.read_html!&lt;/h2&gt;
      &lt;h3&gt;Chris Greening ・ Aug 8 '23&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#python&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#datascience&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#webscraping&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#tutorial&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;div class="ltag__link"&gt;
  &lt;a href="/chrisgreening" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F482393%2F52b5179a-7754-451f-a6bf-233266e3a62f.jpg" alt="chrisgreening"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/chrisgreening/completing-missing-combinations-of-categories-in-our-data-with-pandasmultiindex-26jn" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Completing missing combinations of categories in our data with pandas.MultiIndex!&lt;/h2&gt;
      &lt;h3&gt;Chris Greening ・ Feb 4 '23&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#python&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#datascience&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#tutorial&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#pandas&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>python</category>
      <category>tutorial</category>
      <category>datascience</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
