About Me

My name is Chris Wellons, though I sometimes use the handle skeeto. I am a professional software engineer with a passion for software development. In my day job I regularly develop internal data processing and data reduction tools, optimize software performance, and mentor students. Occasionally I also do web development and data visualization.

However, this blog — ongoing since 2007 — is largely about what I do outside of my day job. Here I explain topics that I’ve recently learned, share software development techniques I’ve discovered or even invented, showcase cool demos, and discuss my contributions to open source.

In general, each of my articles should be unique on the internet at the time they’re published. I will not write a tutorial on some topic if there already exist good, reliable tutorials. If I notice a gap on a topic when learning it myself, then later, once I get the hang of it, I’ll fill that gap by publishing an article or two.

This blog is 100% transparent. Its complete source is in a Git repository. From there you can see every single correction and update I make.

Interviews

Open Source Projects

Here are some of the more well known open source projects I’ve started.

I have hundreds more open source projects, but these are the most popular ones.

Licensing

I’m a strong believer in the public domain. A healthy society needs a rich and growing public domain.

Software licenses annoy me and cause significant, unnecessary friction. Whenever possible, I put public domain dedications on all my open source projects, generally via the Unlicense. This very blog has a public domain dedication notice at the bottom of each page. Even my personal dotfiles are in the public domain.

If you use my work I do appreciate getting credit, but I do not legally mandate it.

Some of my most popular articles:

I also have a published paper: ROP Gadget Prevalence and Survival under Compiler-based Binary Diversification Schemes

Donations

Occasionally someone is particularly happy with my open source work or articles, and they’ll ask if they can somehow donate money in support. I make a very comfortable living outside of my blog, so such donations are neither needed nor motivating. I’d much prefer your donation go to more beneficial and effective causes than be wasted on a stingy miser like me. So, instead, donate to GiveWell. It’s a sort of meta-charity that continuously analyzes where donations will have the greatest impact in the world and directs your money in that direction.

Software Preferences

In general I stick to smaller, simpler tools — especially those I can modify and compile for myself. Sometimes this isn’t possible (e.g. web browsers), so I just use what’s popular despite it being neither.

My preferred operating system is Debian. It has a great philosophy and rock solid package ecosystem. Since I don’t like software changing underneath me, I strictly run the stable distribution. Of course I can still be productive on other Linux distributions or even any of the various BSDs. My dotfiles are quite portable and mostly work across all of them.

Contrast to earlier in my career, Windows has grown on me as a development platform. It’s better than Linux on some dimensions, particularly as a target, and for graphical applications. Though Windows has steadily grown worse since 2012, and at an accelerating pace. w64devkit snapshots my preferred development environment for any platform, even if lacking a few important capabilities, such as fuzz testing. My long-term goal is to correct that situation.

For text editing, I exclusively use Vim. That includes composing blog articles and mail. I’ve never learned how to extend it, and probably never will.

I use Openbox as my window manager, without adornments (panels, taskbar, etc.).

My favorite programming language is C, and I’ve acquired my own personal style. It’s fast, simple, and compiles at lightning speed. Unlike most languages, it’s quite reasonable for an individual to have a comprehensive understanding of the entire language. C++ written in a C style is also acceptable. While my day job requires mastery of a variety of languages and technologies, for my own purposes I find little reason to write software in anything other than C.

I use Mutt for reading email. It’s not perfect, but it’s close enough. OpenPGP and email encryption are a technological dead end, so I don’t bother with it. I’ve never needed end-to-end encrypted communication with strangers, so I haven’t investigated the alternatives.

For consuming multimedia, I use mpv. I love how I can drive it completely and precisely from the keyboard. If anything, its minimal interface is still too cluttered for my tastes. Combined with yt-dlp, I watch more (ad-free) YouTube than is probably healthy.

Contact

For most email related to my blog and projects, I have a public inbox serving as a public forum. Consider using this first. For private or personal messages, use my personal email address listed at the top of this page.

I accept patches in both my private and public inboxes. This means you can contribute changes without, say, a GitHub account.

Cryptographic Identity

This is the key I use to sign important pieces of information, such as Git tags and software releases. It interoperates perfectly with my verification script.

-----BEGIN PGP PUBLIC KEY BLOCK-----

xjMEAAAAABYJKwYBBAHaRw8BAQdAFBg8KN4P+OO3PW166sz9PVYoss4nXgdaxVSH
ieFHPdTNLUNocmlzdG9waGVyIFdlbGxvbnMgPHdlbGxvbnNAbnVsbHByb2dyYW0u
Y29tPsJhBBMWCAATBQIAAAAACRCv0VA6jI/0KgIbAwAAnC4A/jEr7DsBKzQ9ZkQf
P6debpDKDf/oTa0gUg7xYhetIBcEAP9p4R4IS2Om1ewd7muZ2Vz2JDZdQQS42N5q
Bd8c6WSnAQ==
=x6Nt
-----END PGP PUBLIC KEY BLOCK-----

Isn’t that a little short for a PGP key?

  1. It’s an elliptic curve key, which has better security in a smaller package. You’ll need newer software in order to use it.
  2. It’s a sign-only primary key with no subkeys. If you want to send me an encrypted message, I’ll send you a short-term encryption subkey first.
  3. I generated this key using my own software, so it lacks the unnecessary cruft normally attached to public keys. Further, the secret key is never stored in any medium and is instead generated on demand when computing signatures.

Here’s an example cleartext signature to try it out.

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256

My website: https://nullprogram.com/
My GitHub account: https://github.com/skeeto
My favorite color: Orange

-----BEGIN PGP SIGNATURE-----

wnUEARYIACcFAl1cV4oJEK/RUDqMj/QqFiEEXuuMjVBpxOm5SqhSr9FQOoyP9CoA
APSAAP4+Z0enXNnvEhOgT5kEoXH65RQQoR0Optjzdh+8JgaUKQEAqURrvXq+eaTt
Go9D+1vs/OY1xx126X850nJD7aJ8CQs=
=BwbG
-----END PGP SIGNATURE-----

It’s wonderful having such concise keys and signatures!

null program

Chris Wellons

wellons@nullprogram.com (PGP)
~skeeto/public-inbox@lists.sr.ht (view)