commit 5337caee31a193405c158b48e473606af6f30784
parent b6c817e08c7230004abbecec1ca97020f761deea
Author: _listen-bot <_listen-bot@chappelle.dev>
Date: Thu, 14 May 2026 09:28:47 -0700
Merge branch 'main' of /var/git/verso2
Diffstat:
14 files changed, 401 insertions(+), 125 deletions(-)
diff --git a/README b/README
@@ -9,13 +9,22 @@ Verso_2
=======
After creating Verso, which aimed for a spa-style site with heavy utilization
-of javascript, I have come here to reform my ways and offer up a simpler
-solution.
+of javascript, I have come here to reform my ways and implement simpler
+solution. Please accept my humble offering.
Introducing verso_2. It should be self explanatory on how to use it based on
the example here (which is also my personal site).
-Dependent on the lowdown markdown parser.
+Dependent on the lowdown markdown parser, but could be adapted to use a plethora of options.
+
+Notes
+-----
+
+In blog posts, which will be within the generated feed.xml, make sure to use absolute urls to adhere to RSS standards.
+
+In another vein of RSS standards, make sure to use RFC822 formatting for the date field within blog posts.
+
+Verso2 will probably break at some point, so be ready to fix it. You should probably not use this if you just want something to work.
License
-------
diff --git a/build.sh b/build.sh
@@ -365,7 +365,9 @@ generate_rss() {
cat > "$rss_file" << EOF
<?xml version="1.0" encoding="UTF-8"?>
-<rss version="2.0">
+<rss
+ version="2.0"
+ xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<title>${SITE_TITLE}</title>
<link>${SITE_URL}</link>
@@ -399,7 +401,7 @@ done | sort -r | head -n 20 | while IFS='|' read date title slug file; do
<link>${url}</link>
<guid>${url}</guid>
<pubDate>${date}</pubDate>
-<author>${AUTHOR}</author>
+<dc:creator>${AUTHOR}</dc:creator>
<description><![CDATA[
${body_html}
]]></description>
diff --git a/content/assets/sitint.jpg b/content/assets/sitint.jpg
Binary files differ.
diff --git a/content/assets/style.css b/content/assets/style.css
@@ -1,14 +1,24 @@
/* Layout & Typography */
html {
- margin: 1em auto;
- max-width: 42em;
- font-family: sans-serif;
- line-height: 1.5;
+ background-image: url("sitint.jpg");
+ background-repeat: no-repeat;
+ background-size: cover;
+ background-position: center;
+ background-attachment: fixed;
+ image-rendering: pixelated;
+ image-rendering: -moz-crisp-edges;
+ image-rendering: crisp-edges;
}
body {
- margin: auto 8px 20px 8px;
- background: #fff;
+ margin: 0 auto;
+ padding: 1.5em;
+ min-height: 100vh;
+ max-width: 43em;
+
+ background: #FFF;
color: #000;
+
+ font-family: sans-serif;
}
/* Header and Navigation (Table-based) */
diff --git a/content/blog/aerc-google-workspace.md b/content/blog/aerc-google-workspace.md
@@ -0,0 +1,173 @@
+---
+title: Configuring Aerc to Work with Google Workspace via OAuth2
+author: Nathaniel Chappelle
+date: Thu, 12 Feb 2026 21:45:00 -0800
+---
+
+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.
+
+Google no longer allows basic username/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.
+
+Unfortunately, I couldn't find any guides that were complete and relevant,
+except for [this one](https://lukaswerner.com/post/2024-07-08@aerc-outlook),
+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 `oauth2` script.
+
+I wanted a setup that was:
+
+- Secure (no stored passwords)
+- Durable (not dependent on someone else’s client ID)
+- Fully functional for both IMAP and SMTP
+- Compatible with aerc’s native xoauth2 support
+
+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.
+
+## Prerequisites
+
+This guide assumes some certain aspects of your environment:
+
+- A Linux operating system (I use [Void](https://voidlinux.org/))
+- A Python installation (< Python 3.7)
+- [aerc](https://aerc-mail.org/), a pretty good email client
+- The
+ [`mutt_ouath2.py`](https://gitlab.com/muttmua/mutt/-/blob/master/contrib/mutt_oauth2.py)
+ script
+- GPG keys set up (technically optional but super recommended)
+
+## Creating OAuth Credentials in Google Cloud
+
+So our first step is to obtain vaid Google OAuth2 client ID's via the Google
+Cloud Console. This is pretty simple:
+
+1. Open the [clients](https://console.cloud.google.com/auth/clients) page of the
+ Google Cloud Console.
+2. Click the create a client button, and select 'Desktop App' as the application
+ type from the dropdown.
+3. Give your client a good name (like [jmail](https://jmail.world/))
+4. 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.
+5. If you created the OAuth2 credentials with your personal Google account, but
+ your work account is the one you're trying to connect with aerc you will have
+ to navigate to the [audience](https://console.cloud.google.com/auth/audience)
+ tab and add your work account as a user.
+
+Now you have your OAuth2 credentials, and we can move on to configuring aerc and
+the OAuth2 script.
+
+## Configuring the Script
+
+I would place a copy of the `mutt_oauth2.py` script in your aerc config
+directory, and then open it with your favorite text editor. Navigate to the
+Google section of the `registrations` object. It should look something like
+this:
+
+```python
+ 'google': {
+ 'authorize_endpoint': 'https://accounts.google.com/o/oauth2/auth',
+ 'devicecode_endpoint': 'https://oauth2.googleapis.com/device/code',
+ 'token_endpoint': 'https://accounts.google.com/o/oauth2/token',
+ 'redirect_uri': 'urn:ietf:wg:oauth:2.0:oob',
+ 'imap_endpoint': 'imap.gmail.com',
+ 'pop_endpoint': 'pop.gmail.com',
+ 'smtp_endpoint': 'smtp.gmail.com',
+ 'sasl_method': 'OAUTHBEARER',
+ 'scope': 'https://mail.google.com/',
+ 'client_id': '',
+ 'client_secret': '',
+ },
+```
+
+Now, I hope it is evident what you should do next, but in case it isn't just
+copy the `client_id` and `client_secret` you saved earlier into their respective
+positions within the object.
+
+Additionally, make sure to input your GPG identity in the encryption and
+decryption pipe arrays.
+
+```python
+ENCRYPTION_PIPE = ['gpg', '--encrypt', '--recipient', 'you@yourdomain.com']
+DECRYPTION_PIPE = ['gpg', '--decrypt']
+```
+
+### Why Is This Important?
+
+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.
+
+But if you prefer simplicity, you can bypass encryption by replacing the GPG
+pipes with something like:
+
+```python
+ENCRYPTION_PIPE = ['tee']
+DECRYPTION_PIPE = ['cat']
+```
+
+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.
+
+## First Time Authentication
+
+Now you should be ready to create your local tokens. In your aerc configuration
+directory you can run
+`python3 mutt_oauth2.py --authorize you@yourdomain.com.tokens`. The script will
+launch and take you through a interactive menu. It is self-explanatory except at
+the auth-flow section. Here I chose `authcode` but you will probably be
+successful with any of the choices. Assuming you chose `authcode`, the script
+will then give you a url. Open it in a browser and be ready to copy the url
+you'll be redirected to. Once you get that url, find the section which has
+`code=` and copy the code. Paste that back into the script and the token file
+will be created.
+
+You can test it with `python3 mutt_oauth2.py you@yourdomain.com.tokens --test`.
+If you don't see any errors you should be good to continue and start configuring
+aerc.
+
+## Configuring aerc
+
+Aerc uses a very simple toml style configuration. The key aspects we're going to
+to need to focus on is to use `xoauth2` for our `imaps` and `smtp`, as well as
+using the `mutt_oauth2.py` script pointed towards the authentication tokens for
+the `source-cred-cmd`. Here's what my config ended up looking like:
+
+```toml
+[yourdomain]
+source = imaps+xoauth2://you%40yourdomain.com@imap.gmail.com:993
+source-cred-cmd = "python3 /home/username/.config/aerc/oauth2.py /home/username/.config/aerc/you@yourdomain.com.tokens"
+outgoing = smtp+xoauth2://you%40yourdomain.com@smtp.gmail.com:587
+outgoing-cred-cmd = "python3 /home/username/.config/aerc/oauth2.py /home/username/.config/aerc/you@yourdomain.com.tokens"
+default = INBOX
+cache-headers = true
+from = "Last Name, First Name" <you@yourdomain.com>
+check-mail = 5m
+```
+
+Gmail uses implicit TLS for IMAP on port 993 and STARTTLS for SMTP on port 587,
+both of which are handled automatically by aerc.
+
+That should be all you need. You can now start aerc and your Google Workspace
+emails should start loading in.
+
+## Conclusion
+
+Setting up OAuth2 with aerc is more involved than pasting in a password, but it
+results in a cleaner and more future-proof configuration.
+
+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.
+
+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.
diff --git a/content/blog/intro.md b/content/blog/intro.md
@@ -1,9 +1,30 @@
---
title: Introduction: My First Blog Post
author: Nathaniel Chappelle
-date: 2026-01-04
+date: Sun, 08 Feb 2026 23:52:00 -0800
---
Hi there! I wanted to quickly introduce this blog/feed/website.
-WIP.
+We're going to focus on software, technology, social issues, and other things
+the editor (myself) deems relevant.
+
+Some quick disclaimers:
+
+I am not a professional writer, so don't expect an form of regularity to be
+going on here.
+
+There is no complicated CMS, framework, or any similar thing backing this
+feed/site up. It's just a shoddy shell script I wrote, so if there is an
+erraneous post or weird formatting issues you're agreeing to that risk by not
+unsubscribing right now.
+
+If you ever want to respond to something I've said, please don't fail to
+[contact](https://chappelle.dev/contact/) me. I really wanted to implement a
+reading list instead of an RSS feed (I still might) since I believe they're a
+much better method of sharing information and discourse. However email is too
+much of a PITA and I didn't really want to spend my time getting that right.
+
+## In Conclusion
+
+I hope you get something out of what I have to say. Thanks for reading this far.
diff --git a/content/contact.md b/content/contact.md
@@ -3,18 +3,14 @@ title: Contact
show_meta: no
---
-Feel free to reach out:
-
-- Email: nathaniel at any of my domains.
+- Email: nathaniel at this domain.
- 37AF 9835 E4CD AC40
-- XMPP: [binkd@xmpp.is](xmpp:binkd@xmpp.is)
-
-I'm always happy to chat about systems programming, performance optimization, or
-interesting technical problems. If you think I could get something done for you,
-let me know!
+- Find me on irc in [#derive](irc.ergo.chat)
-You can find my projects here:
+You can find my code here:
-- Personal Git Mirror: [git.chappelle.dev](https://git.chappelle.dev)
-- GitHub: [github.com/Binkersss](https://github.com/Binkersss)
-- Codeberg: [coderberg.org/binkd](https://codeberg.org/binkd)
+- [git.chappelle.dev](https://git.chappelle.dev) (soon to be deprecated b/c git
+ hosting is hard)
+- [coderberg.org/binkd](https://codeberg.org/binkd)
+- [github.com/Binkersss](https://github.com/Binkersss) (soon to be deprecated
+ b/c microslop)
diff --git a/content/current.md b/content/current.md
@@ -1,76 +0,0 @@
----
-title: Current
-show_meta: no
----
-
-Here's what I'm currently working on:
-
-## [Stamail](https://git.chappelle.dev/stamail/log.html)
-
-A [suckless](https://suckless.org) static site generator for mailing list
-archives
-
-Current state:
-
-- Parses maildir into s-expression using notmuch
-- Creates abstract syntax tree from s-expression
-- Creates message lists and thread trees from s-expression
-- HTML rendered parses lists and trees into a static webpage
-
-Current bugs:
-
-- ~~Generating empty erraneous message nodes~~
-- Threading HTML is _ugly_
-- Navigation of site, and aesthetic, isn't where it should be
-
-## [Gromacs-LS](https://github.com/vanegasj/gromacs-ls-2025.4)
-
-A fork of [Gromacs](https://www.gromacs.org), a moluecular dynamics simulation
-engine, with support for local stress and elasticity simulation. The project is
-authored and maintained by Juan Vanegas, a Biophysics professor and researcher
-at OSU.
-
-- Focusing on:
- - Porting Gromacs-LS from v2016.3 of Gromacs to v2025.4
-- Advising team members on:
- - Implementation of automatic-differentiation into the
- [MDStress](https://vanegaslab.org/software) library.
- - Performance profiling of MDStress library, including:
- - Actual CPU time and memory space
- - Interpretation of compiler generated assembly
-
-## [verso_2](https://git.chappelle.dev/verso2/log.html)
-
-A minimal, unix-centric, and easy static site generator. It's what this site is
-built on
-
-Currently:
-
-- Working out the kinks as I create posts, add content, and expand the
- capabilities
-- Exploring ways to integrate my [stagit](https://git.chappelle.dev) instance
- into the site, as well as other cool bonuses
-
-Current bugs:
-
-- RSS feed is not really up to snuff
-- Date/Timestamp management needs to be thought about harder
-
-## Computer Architecture
-
-Currently taking High Performance Computer Architectures (CS 570 at OSU) as well
-as exploring creating a Verilog design of my own out-of-order RISC-V cpu
-
-- Focusing on:
- - Out-of-order pipelines
- - Branch prediction optimizations
-
-## Privacy and Security
-
-Currently taking a class on Privacy and Surveillance (CS 577 at OSU)
-
-- Focusing on:
- - [Privacy in Context](https://www.sup.org/books/law/privacy-context) by Helen
- Nissebaum
- - How changing contexts define how we feel about technologies, whether the
- technology is explicitly for surveillance or not
diff --git a/content/current/archive.md b/content/current/archive.md
@@ -0,0 +1,62 @@
+---
+title: Archive
+show_meta: no
+---
+
+Here's what I used to work on, but got distracted/busy.
+
+## **ON HOLD** [Stamail](https://git.chappelle.dev/stamail/log.html)
+
+A [suckless](https://suckless.org) static site generator for mailing list
+archives
+
+Current state:
+
+- Parses maildir into s-expression using notmuch
+- Creates abstract syntax tree from s-expression
+- Creates message lists and thread trees from s-expression
+- HTML rendered parses lists and trees into a static webpage
+
+Current bugs:
+
+- ~~Generating empty erraneous message nodes~~
+- Threading HTML is _ugly_
+- Navigation of site, and aesthetic, isn't where it should be
+
+## **Finished** [Gromacs-LS](https://github.com/vanegasj/gromacs-ls-2025.4)
+
+A fork of [Gromacs](https://www.gromacs.org), a molecular dynamics simulation
+engine, with support for local stress and elasticity simulation. The project is
+authored and maintained by Juan Vanegas, a Biophysics professor and researcher
+at OSU.
+
+- Focusing on:
+ - Porting Gromacs-LS from v2016.3 of Gromacs to v2025.4
+- Advising team members on:
+ - Implementation of automatic-differentiation into the
+ [MDStress](https://vanegaslab.org/software) library.
+ - Performance profiling of MDStress library, including:
+ - Actual CPU time and memory space
+ - Interpretation of compiler generated assembly
+
+## Computer Architecture
+
+~~Currently taking~~ Took High Performance Computer Architectures (CS 570 at
+OSU) as well as exploring creating a Verilog design of my own out-of-order
+RISC-V cpu
+
+- Focusing on:
+ - Out-of-order pipelines
+ - Branch prediction optimizations
+
+Also a few other computer architecture courses.
+
+## Privacy and Security
+
+Currently taking a class on Privacy and Surveillance (CS 577 at OSU)
+
+- Focusing on:
+ - [Privacy in Context](https://www.sup.org/books/law/privacy-context) by Helen
+ Nissebaum
+ - How changing contexts define how we feel about technologies, whether the
+ technology is explicitly for surveillance or not
diff --git a/content/current/index.md b/content/current/index.md
@@ -0,0 +1,43 @@
+---
+title: Current
+show_meta: no
+---
+
+Here's what I'm currently working on. To see past projects (complete, on hold,
+or otherwise echeck the [archive](archive/)):
+
+## [Wayland](https://wayland.fyi/)
+
+Building [bswc](https://codeberg.org/binkd/bswc), a master-stack style dynamic
+wayland compsitor, and many other related todos/side-projects.
+
+## Operating Systems
+
+Really enjoying learning more about operating systems, and thinking of ways to
+incorporate distributed operating systems into real life
+([9front](https://9front.org), ambient computing, etc.).
+
+Specific topics:
+
+- Distributed memory hierarchy
+- Userspace drivers and microkernels
+- MicroVMs
+- Minimalist Linux as IDE ([derive](https://derivelinux.org) and
+ [alpine](https://alpinelinux.org))
+
+## [verso_2](https://git.chappelle.dev/verso2/log.html)
+
+A minimal, unix-centric, and easy static site generator. It's what this site is
+built on
+
+Currently:
+
+- Working out the kinks as I create posts, add content, and expand the
+ capabilities
+- Exploring ways to integrate my [stagit](https://git.chappelle.dev) instance
+ into the site, as well as other cool bonuses
+
+Current bugs:
+
+- RSS feed is not really up to snuff
+- Date/Timestamp management needs to be thought about harder
diff --git a/content/gists/index.md b/content/gists/index.md
@@ -0,0 +1,9 @@
+---
+title: Gists
+show_meta: no
+---
+
+This is a place where I put things that need to be shared, but don't deserve a
+blog post and aren't a standalone codebase.
+
+- [Reticulum Quickstart](./reticulum)
diff --git a/content/gists/reticulum.md b/content/gists/reticulum.md
@@ -0,0 +1,34 @@
+---
+title: Reticulum QuickStart
+author: Nathaniel Chappelle
+date: Mon, 23 Feb 2026 14:11:20 -0800
+---
+
+This document serves as a guide to quickly accessing the reticulum network with
+minimal configuration.
+
+Start with this:
+
+```sh
+python3 -m venv .venv
+
+source .venv/bin/activate
+
+pip install rns nomadnet
+
+# Adding peers to the RNS configuration
+curl https://letsdecentralize.org/rollcall/reticulum.txt >> ~/.reticulum/config
+```
+
+Now you have the necessary network utils and RNS browser. Start `rnsd`, then in
+another terminal window start `nomadnet`.
+
+Read the introductory materials on that populate on the first launch of
+`nomadnet`. Now you're ready to start exploring!
+
+For example, you can navigate to the network tab and announce your local node,
+or connect to another peer like
+`3b5bc6888356193f1ac1bfb716c1beef:/page/index.mu`. Just hit `ctrl+u` and enter
+that address (thanks [qbit](https://mammothcirc.us/@qbit)!)
+
+It's seriously that simple. Decentralize yourself.
diff --git a/content/index.md b/content/index.md
@@ -3,27 +3,21 @@ title: About Me
show_meta: no
---
-I'm a systems developer and Masters Student at Oregon State University who loves
-thinking about what it takes to build fast, minimal software. I spend most of my
-time working on:
+AKA binkd.
+
+Systems developer. I do:
- Philosophy of CS
-- Computing Architectures
+- Computing architectures
- Distributed systems
-- Performance optimization
-
-When I'm not thinking, designing or programming you'll find me cycling the
-gravel forest roads of the Oregon Coast Range, splitboarding in the Oregon
-Cascades, or riding my skateboard for the British Downhill Skateboarding team.
-
-Checkout [Current](current/) to hear more about my current technical and
-non-technical interests!
+- Parllelism and other performance optimization
-Checkout my [blog](blog/) to read more about my thoughts, projects, and
-experiences.
+I try to do:
-## Background
+- Math
+- Neuroscience
+- Ethics
+- [Downhill skateboarding](https://youtu.be/rkWOLEI4vFk)
-I've been programming for over 4 years, primarily in C, Go, Python, and Rust. I
-believe in writing simple, maintainable, and composable code that does one thing
-well.
+Read [current](current/) to see what I'm working on right now, and read the
+[blog](blog/) to see what I've been thinking about.
diff --git a/content/projects.md b/content/projects.md
@@ -3,19 +3,18 @@ title: Projects
show_meta: no
---
-Here are some things I've built:
+Here are some things I've built that I am proud of:
## [Feather-Virt](https://github.com/binkersss/feather-virt)
A container runtime and hypervisor for inference at the edge. Still a WIP, and
figuring out where I want to go with this.
-## [Stamail](https://git.chappelle.dev/stamail/log.html)
-
-An easy and minimal mailing list archive viewer. Still a WIP, but feel free to
-try it out! Requires some sort of mdir/mbox files.
-
## [verso_2](https://git.chappelle.dev/verso2/log.htm)
A minimal static site generator. It's how you're seeing this site right now!
Checkout its predecessor [Verso](https://github.com/binkersss/verso)
+
+## [bswc](https://codeberg.org/binkd/bswc)
+
+A dynamic Wayland compositor. WIP.