<?xml version="1.0" encoding="UTF-8"?>
<rss 
  version="2.0"
  xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<title>Chappelle.dev</title>
<link>https://chappelle.dev</link>
<description>A simple website</description>
<language>en</language>
<item>
<title>Linkedin Sucks</title>
<link>https://chappelle.dev/blog//linkedin-sucks/</link>
<guid>https://chappelle.dev/blog//linkedin-sucks/</guid>
<pubDate>Tue, 17 Feb 2026 16:00:00 -0800</pubDate>
<dc:creator>Nathaniel Chappelle</dc:creator>
<description><![CDATA[
  <article>
<p>Recently I&#8217;ve experienced the pleasure of searching for and applying to jobs, so
I&#8217;ve had some inevitable contact with Linkedin. What used to be a great platform
for announcing your achievements, gaining industry exposure, and keeping in
&#8216;connection&#8217; with past and present colleagues has turned into a cesspool of
self-promotion, mindless ai-slop, and social media marketing. Linkedin has
fufilled the prophecy that has been set before every other major social media.</p>
  </article>
]]></description>
</item>
<item>
<title>Configuring Aerc to Work with Google Workspace via OAuth2</title>
<link>https://chappelle.dev/blog//aerc-google-workspace/</link>
<guid>https://chappelle.dev/blog//aerc-google-workspace/</guid>
<pubDate>Thu, 12 Feb 2026 21:45:00 -0800</pubDate>
<dc:creator>Nathaniel Chappelle</dc:creator>
<description><![CDATA[
  <article>
<p>I recently set up aerc with Google Workspace, and like most people attempting
this in 2026 I ran straight into the challenges of modern authentication.</p>
<p>Google no longer allows basic username&#47;password authentication for IMAP and SMTP
on most accounts. App passwords are increasingly restricted, especially in
managed Workspace environments. If you want your terminal mail client to keep
working, you need OAuth2.</p>
<p>Unfortunately, I couldn&#8217;t find any guides that were complete and relevant,
except for <a href="https://lukaswerner.com/post/2024-07-08@aerc-outlook">this one</a>,
ironically written by a student of the same university I attend. This guide was
for Office365 emails, but it was a good starting point and pointed me towards
the <code>oauth2</code> script.</p>
<p>I wanted a setup that was:</p>
<ul>
<li>Secure (no stored passwords)</li>
<li>Durable (not dependent on someone else’s client ID)</li>
<li>Fully functional for both IMAP and SMTP</li>
<li>Compatible with aerc’s native xoauth2 support</li>
</ul>
<p>This post walks through the complete process of registering your own OAuth
client in Google Cloud, generating tokens using the OAuth2 script, and
configuring aerc to authenticate cleanly with STARTTLS.</p>
<h2 id="prerequisites">Prerequisites</h2>
<p>This guide assumes some certain aspects of your environment:</p>
<ul>
<li>A Linux operating system (I use <a href="https://voidlinux.org/">Void</a>)</li>
<li>A Python installation (&#60; Python 3.7)</li>
<li><a href="https://aerc-mail.org/">aerc</a>, a pretty good email client</li>
<li>The
<a href="https://gitlab.com/muttmua/mutt/-/blob/master/contrib/mutt_oauth2.py"><code>mutt_ouath2.py</code></a>
script</li>
<li>GPG keys set up (technically optional but super recommended)</li>
</ul>
<h2 id="creating-oauth-credentials-in-google-cloud">Creating OAuth Credentials in Google Cloud</h2>
<p>So our first step is to obtain vaid Google OAuth2 client ID&#8217;s via the Google
Cloud Console. This is pretty simple:</p>
<ol>
<li>Open the <a href="https://console.cloud.google.com/auth/clients">clients</a> page of the
Google Cloud Console.</li>
<li>Click the create a client button, and select &#8216;Desktop App&#8217; as the application
type from the dropdown.</li>
<li>Give your client a good name (like <a href="https://jmail.world/">jmail</a>)</li>
<li>This step is important. When you create the client ID a pop-up will show you
your new client-id and client-secret. Make sure to save these in a good
place.</li>
<li>If you created the OAuth2 credentials with your personal Google account, but
your work account is the one you&#8217;re trying to connect with aerc you will have
to navigate to the <a href="https://console.cloud.google.com/auth/audience">audience</a>
tab and add your work account as a user.</li>
</ol>
<p>Now you have your OAuth2 credentials, and we can move on to configuring aerc and
the OAuth2 script.</p>
<h2 id="configuring-the-script">Configuring the Script</h2>
<p>I would place a copy of the <code>mutt_oauth2.py</code> script in your aerc config
directory, and then open it with your favorite text editor. Navigate to the
Google section of the <code>registrations</code> object. It should look something like
this:</p>
<pre><code class="language-python">  &#39;google&#39;: {
      &#39;authorize_endpoint&#39;: &#39;https:&#47;&#47;accounts.google.com&#47;o&#47;oauth2&#47;auth&#39;,
      &#39;devicecode_endpoint&#39;: &#39;https:&#47;&#47;oauth2.googleapis.com&#47;device&#47;code&#39;,
      &#39;token_endpoint&#39;: &#39;https:&#47;&#47;accounts.google.com&#47;o&#47;oauth2&#47;token&#39;,
      &#39;redirect_uri&#39;: &#39;urn:ietf:wg:oauth:2.0:oob&#39;,
      &#39;imap_endpoint&#39;: &#39;imap.gmail.com&#39;,
      &#39;pop_endpoint&#39;: &#39;pop.gmail.com&#39;,
      &#39;smtp_endpoint&#39;: &#39;smtp.gmail.com&#39;,
      &#39;sasl_method&#39;: &#39;OAUTHBEARER&#39;,
      &#39;scope&#39;: &#39;https:&#47;&#47;mail.google.com&#47;&#39;,
      &#39;client_id&#39;: &#39;&#39;,
      &#39;client_secret&#39;: &#39;&#39;,
  },
</code></pre>
<p>Now, I hope it is evident what you should do next, but in case it isn&#8217;t just
copy the <code>client_id</code> and <code>client_secret</code> you saved earlier into their respective
positions within the object.</p>
<p>Additionally, make sure to input your GPG identity in the encryption and
decryption pipe arrays.</p>
<pre><code class="language-python">ENCRYPTION_PIPE = [&#39;gpg&#39;, &#39;--encrypt&#39;, &#39;--recipient&#39;, &#39;you@yourdomain.com&#39;]
DECRYPTION_PIPE = [&#39;gpg&#39;, &#39;--decrypt&#39;]
</code></pre>
<h3 id="why-is-this-important">Why Is This Important?</h3>
<p>The token file created by mutt_oauth2.py contains your refresh token, which can
be used to generate new access tokens without your password or MFA. Because
OAuth tokens are bearer credentials, anyone who obtains that file can access
your mailbox. Encrypting it with GPG ensures that even if the file is copied,
synced, or backed up, it cannot be used without your private key.</p>
<p>But if you prefer simplicity, you can bypass encryption by replacing the GPG
pipes with something like:</p>
<pre><code class="language-python">ENCRYPTION_PIPE = [&#39;tee&#39;]
DECRYPTION_PIPE = [&#39;cat&#39;]
</code></pre>
<p>This works because the script simply pipes JSON through those commands. However,
doing so stores the refresh token in plaintext, meaning security relies entirely
on filesystem permissions.</p>
<h2 id="first-time-authentication">First Time Authentication</h2>
<p>Now you should be ready to create your local tokens. In your aerc configuration
directory you can run
<code>python3 mutt_oauth2.py --authorize you@yourdomain.com.tokens</code>. The script will
launch and take you through a interactive menu. It is self-explanatory except at
the auth-flow section. Here I chose <code>authcode</code> but you will probably be
successful with any of the choices. Assuming you chose <code>authcode</code>, the script
will then give you a url. Open it in a browser and be ready to copy the url
you&#8217;ll be redirected to. Once you get that url, find the section which has
<code>code=</code> and copy the code. Paste that back into the script and the token file
will be created.</p>
<p>You can test it with <code>python3 mutt_oauth2.py you@yourdomain.com.tokens --test</code>.
If you don&#8217;t see any errors you should be good to continue and start configuring
aerc.</p>
<h2 id="configuring-aerc">Configuring aerc</h2>
<p>Aerc uses a very simple toml style configuration. The key aspects we&#8217;re going to
to need to focus on is to use <code>xoauth2</code> for our <code>imaps</code> and <code>smtp</code>, as well as
using the <code>mutt_oauth2.py</code> script pointed towards the authentication tokens for
the <code>source-cred-cmd</code>. Here&#8217;s what my config ended up looking like:</p>
<pre><code class="language-toml">[yourdomain]
source            = imaps+xoauth2:&#47;&#47;you%40yourdomain.com@imap.gmail.com:993
source-cred-cmd   = "python3 &#47;home&#47;username&#47;.config&#47;aerc&#47;oauth2.py &#47;home&#47;username&#47;.config&#47;aerc&#47;you@yourdomain.com.tokens"
outgoing          = smtp+xoauth2:&#47;&#47;you%40yourdomain.com@smtp.gmail.com:587
outgoing-cred-cmd = "python3 &#47;home&#47;username&#47;.config&#47;aerc&#47;oauth2.py &#47;home&#47;username&#47;.config&#47;aerc&#47;you@yourdomain.com.tokens"
default           = INBOX
cache-headers     = true
from              = "Last Name, First Name" &#60;you@yourdomain.com&#62;
check-mail        = 5m
</code></pre>
<p>Gmail uses implicit TLS for IMAP on port 993 and STARTTLS for SMTP on port 587,
both of which are handled automatically by aerc.</p>
<p>That should be all you need. You can now start aerc and your Google Workspace
emails should start loading in.</p>
<h2 id="conclusion">Conclusion</h2>
<p>Setting up OAuth2 with aerc is more involved than pasting in a password, but it
results in a cleaner and more future-proof configuration.</p>
<p>Once configured, tokens refresh automatically, no passwords are stored in
plaintext, and aerc behaves like any other mail client, just faster , more
ergonomic, and entirely contained within the terminal.</p>
<p>Email authentication may be more complex than it used to be, but with the right
setup, it doesn’t have to get in the way of a minimal and keyboard-driven
workflow.</p>
  </article>
]]></description>
</item>
<item>
<title>Introduction: My First Blog Post</title>
<link>https://chappelle.dev/blog//intro/</link>
<guid>https://chappelle.dev/blog//intro/</guid>
<pubDate>Sun, 08 Feb 2026 23:52:00 -0800</pubDate>
<dc:creator>Nathaniel Chappelle</dc:creator>
<description><![CDATA[
  <article>
<p>Hi there! I wanted to quickly introduce this blog&#47;feed&#47;website.</p>
<p>We&#8217;re going to focus on software, technology, social issues, and other things
the editor (myself) deems relevant.</p>
<p>Some quick disclaimers:</p>
<p>I am not a professional writer, so don&#8217;t expect an form of regularity to be
going on here.</p>
<p>There is no complicated CMS, framework, or any similar thing backing this
feed&#47;site up. It&#8217;s just a shoddy shell script I wrote, so if there is an
erraneous post or weird formatting issues you&#8217;re agreeing to that risk by not
unsubscribing right now.</p>
<p>If you ever want to respond to something I&#8217;ve said, please don&#8217;t fail to
<a href="https://chappelle.dev/contact/">contact</a> me. I really wanted to implement a
reading list instead of an RSS feed (I still might) since I believe they&#8217;re a
much better method of sharing information and discourse. However email is too
much of a PITA and I didn&#8217;t really want to spend my time getting that right.</p>
<h2 id="in-conclusion">In Conclusion</h2>
<p>I hope you get something out of what I have to say. Thanks for reading this far.</p>
  </article>
]]></description>
</item>
</channel>
</rss>
