verso2

A simple web framework.
git clone git://git.chappelle.dev/verso2.git
Log | Files | Refs | README | LICENSE

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:
MREADME | 15++++++++++++---
Mbuild.sh | 6++++--
Acontent/assets/sitint.jpg | 0
Mcontent/assets/style.css | 22++++++++++++++++------
Acontent/blog/aerc-google-workspace.md | 173+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mcontent/blog/intro.md | 25+++++++++++++++++++++++--
Mcontent/contact.md | 20++++++++------------
Dcontent/current.md | 76----------------------------------------------------------------------------
Acontent/current/archive.md | 62++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/current/index.md | 43+++++++++++++++++++++++++++++++++++++++++++
Acontent/gists/index.md | 9+++++++++
Acontent/gists/reticulum.md | 34++++++++++++++++++++++++++++++++++
Mcontent/index.md | 30++++++++++++------------------
Mcontent/projects.md | 11+++++------
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.