Mail Software Projects for You

Working through the tail of Run Your Own Mail Server has led me to a couple things I’d like to see. Maybe some reader would like to hack on one of them.

1) The best way to generate a list of hosts that should bypass Postfix’s intrusive protocol checks, or anything that resembling greylisting, is the postwhite. Postwhite has been abandoned for years, though. This isn’t exactly a problem, as it’s feature-complete and does the job. The configuration is clunky, though. It supports a long-obsolete list of Yahoo mailer addresses. The list of domains it generates lists for is hard-coded in the script, and artificially broken up into categories like “legit bulk mailers,” “social media,” and so on. You should not have to edit the script to remove a domain, because who accepts mail from LinkedIn these days? You shouldn’t have to edit the script for anything. The last edit to this was six years ago, so I suspect it’s basically abandoned.

Moving the domains to an external file and dropping the defunct Yahoo page would be good. If you have to fork it, using a meaningful name like “greyskip” or somesuch would be nice.

2) Postfix on FreeBSD supports blacklistd. That’s grand. Log parsers are inherently fragile, and libblacklist is the smart way for an application to declare that an IP address is misbehaving. The Postfix support only applies to authentication attempts on smtpd, however. I’m in favor of that, but I’d also like to see postscreen grow libblacklistd support. A host on a trusted DNSBL pokes our mail port? Block it.

I could do #1, but I lack the time and refuse to recommend my fault-oblivious code for production. I lack both skills and time for #2.

The truth is, we’ve limped along like this for years. We could limp for many more years. But hey, someone out there might want to make the world suck slighly less.

Block list vs black list in my books

Open source software has been adjusting its language. In a world without systemic racism, technologists could use words like “master” and “slave” without worries. While the Internet’s primordial developers chose those words without malice1, we don’t live in that world. Much of the software in Run Your Own Mail Server is older, however. Many people who don’t speak English natively don’t fully understand the implications of “black list” and “white list” and don’t want to go through the annoyance of changing them in large code bases.

Part of my job is to be easily approachable to all readers who connect with my voice.2 That means using language correctly. block list.

Another part of my job is to tell the truth. The software calls it black list. No matter how hard you search, you will not find rspamd’s block list.

I’m not going to reject rspamd or postwhite because of their language. To do so would inflict extra pain on my readers. So I’m putting this (raw, unedited) text in Chapter 0.

Today, we use the term “allow list” for entities that are permitted to skip a layer of protections, and “block list” for entities that are categorically refused. Many older programs and some software developed by non-native English speakers, still use the older blacklist and whitelist. This book uses modern language except when configuring those programs. Do please encourage your favorite developers to update their language to the 21st century, however.

This is the same approach I used in the latest Absolute FreeBSD with my beloved blacklistd, but made explicit. Also, blacklistd has been renamed. Even we greybeards can do better.

I much prefer using consistent language throughout, but reality has its own opinions.

Comments defending the old language will be summarily deleted. You also acted without malice? Fine. Now you know better. Do better.

January’s Jalousie Sausage

(This post went to Patronizers at the beginning of January, and to the public at the beginning of February.)

The beginning of the year. Time to not only contemplate last year’s failures, but to select next year’s failures. Not that I’m cynical. Truly, what’s the point of setting goals you know you will accomplish? The trick is to pick goals that are fail-forward. If you decide to lose a hundred pounds but only lose thirty–you still lost thirty!

In that spirit, I’m planning to publish eight books next year: two nonfiction, six fiction. Chunks of five are already written, I just have to clean them up. If I fail, I will have published something. It will require stability and certainty, however. In 2024, I will focus not on making words, but on maintaining the conditions needed to make words. That means taking the time for exercising regularly, preparing large meals that leave lots of leftovers, and stepping back from things I can’t change. It’s an election year here in the US, but we already know which candidates we get to choose between and I’ve already decided who I’m voting against. I don’t need to know about the latest stupidity there. I need to work on things only I can do, because ain’t nobody else in the world mad enough to write a book on email or the novels I’ve had in-progress since 2019. I need to settle back into the writing pattern I know works well: write fiction for two hours in the morning, write nonfiction all afternoon, relax on weekends. The pandemic made all of this difficult, especially as my wife is a nurse practitioner and is regularly exposed to idiots.

I just did the annual accounting, and: despite all that, I managed to keep my 2023 income flat with 2022 and 2019. 2021 and 2022 were “fever years,” where my income spiked for reasons beyond my control. Having everyone locked inside with nothing to do but read is great for my business, but not so much for civilization. I achieved Enough, so I’m good. All I have to do is keep publishing.

Speaking of publishing: I’m debating how to publish Run Your Own Mail Server.

For OpenBSD Mastery: Filesystems, I did direct pre-orders from my web store. It worked. People were happy. I could do that again, or I could run it through Kickstarter. Kickstarter gave me great results for my wildly niche nonfiction. I don’t want to do both, however. Many of y’all will get the ebook free1 through your Patronizer benefits or through sponsorships, or even print copies, so I don’t expect you to take either route. If I do direct sales, I control the whole process. That’s nice. Kickstarter is not a sales platform, though. It is a discovery platform, the Sixth Circle of the nine-circle Customer Acquisition Funnel. You know, the outermost district of Dis, on the banks of the River Styx. Okay, fine, if I ever write “How I Make a Living Writing” I’ll use a “Dante’s Inferno” theme. Where was I? Oh, right. Discovery platform. Every time I run a Kickstarter, a few folks sign up for my mailing lists and buy other books. On the other hand, RYOMS is my best-sponsored book ever. How much crowdfunding do I really want to drag people through?

So, do I want solid money now, or less money and the chance of a broader readership?

Put that way, the answer’s obvious. Kickstarter it is. I’ll start to assemble that once I get the book to tech edit. The book is written with a Star Wars motif, so it’s tempting to try to do a promo video with actual production values. I need to resist that temptation, however. Mind you, if I ever do a book with a John Carpenter theme, I might revisit that decision. “This is not a dream. We are warning you of this book in hope that you can prevent it from being published” seems on-brand.

I guess that’s the secret to “How I Make A Living Writing.” I beg for money, but in a slightly entertaining manner.

So in 2024 that’s one Kickstarter for RYOMS, one for the giant fiction thing, perhaps a second edition of Networking for Systems Administrators if I can identify out a reasonable cross-platform netcat-alike with a consistent command line and TLS support, another nonfiction Secret Project, plus some classic art with mushrooms that could be parodied with Beastie and Tux, a small Kickstarter for the new Letters to ed(1). The FreeBSD Journal column will hit six years old this summer, so I’ll probably pull the years 1-3 book from print and replace it with years 1-6. I’ll probably keep that up for four more years, and let it die at ten. I can’t see the gag lasting much longer than that. Maybe the ten-year omnibus Kickstarter will feature a back-exclusive edition where I restore all the obscenity. Don’t worry, Patronizers are always considered backers, you’ll get the appropriate edition for your tier. I’m not going to offer a special edition of N4SA bound in Cisco salesman spleen and not send copies to my print-level Patronizers!

If all works out well, in 2024 I’ll be slamming out a big non-BSD book for a trad publisher. I’ve said before that I love win-win deals, and I think we’ve negotiated one. More details as events warrant.

This is the plan. Reality has its own plans. Those plans involve phrases like “monomolecular tripwires” and “release the hounds.” We’ll see who wins. I put $20 on reality.

But this month, I plan to finish the first draft of RYOMS. All that’s left is DMARC, webmail, touching on rspamd, and detritus like nolisting. I have the greatest of all gifts, which is hope!

Which means I’m gonna quit writing this now. Take care, y’all.

At long last: the MWL Title Index

I try to hold down the amount of information on this site. I truly do. I also try to keep the menus at the top no more than one layer deep. But finding individual titles on my web site has become increasingly difficult. People complain that they can’t find titles. Everything is filed logically, but logic is limited. Is “PAM Mastery” a sysadmin tool or an operating system reference? Should “$ git commit murder” be filed under crime novels or software crimes?

I maintain the official title list in my OID, accessible to the world via a trivial SNMP query. That MIB doesn’t have links, though. It never will. I’m not rewriting my OID if I need to reorganize my web site.

Here’s the brand-new comprehensive title index. Tech books, short stories and novels, the Canadian Version of ZFS Mastery, TTRPGs, it’s all there. Sort by title or release date or length or genre, you can find it all and a link to the book’s entry.

Most short stories that were released as standalones were pulled into collections, so those entries link to the collection. The point of the index is so that you can acquire a Thing, whatever the Thing is. Or learn that the Thing is utterly unavailable.

This also served as a double-check of my web site. To my shock, everything I know about has an entry. I’m not saying this is everything–I have no idea what I’ve forgotten. But what I know about, I have claimed.

Why do this now? I had to hire help to accomplish it. No way I was dredging through all this crap.

Las Vegas NV Gelato Meetup, 17 February 2024

Been a while since I’ve done this.

Family events are taking me to Las Vegas. The schedule’s pretty booked, but about 7PM on Saturday, 17 February, I’ll be getting gelato somewhere around the Paris hotel on the Strip. I won’t have books or anything, I’m just hanging out.

I haven’t picked a spot. I’ll be looking for somewhere sheltered but airy, with good gelato. Choosing a location will require extensive hands-on evaluation of the many available options.

More details when I find a place.

You want to meet me, this is your chance. Otherwise, consider yourself warned.

Terry Pratchett Discworld Bundle vs DRM

Terry Pratchett was one of the most brilliant writers of the last hundred years. I own everything he ever published, in print, a worthy investment of several feet of precious shelf space. Tattered SFBC hardcovers from the 1980s with feebly-glued pages covered in faded dust jackets, battered paperbacks smuggled from Canada, spiffy hardcovers from when the world realized his work was amazing. I have it all. (If you’ve never read Pratchett, Wikipedia has a handy flowchart to help you decide where to start.)

HarperCollins launched a Terry Pratchett Discworld ebook Humble Bundle. You can get all the Discworld novels for $18, minus the oddities like “The Science of Discworld.” I’ve been waiting for an ebook bundle like this. I naturally grabbed it.

BUT–getting the actual ebook files is a right pain.

HarperCollins is one of those big publishers that think everything needs DRM, and they came up with a convoluted dance to comply with it. Sort of.

The books are delivered via Kobo. You don’t need a Kobo account, although if you have one that’s dandy. You can download the books, except what you download isn’t the book. You download an Adobe DRM file, usable by Adobe Digital Editions. Open that file in ADE, and Adobe sends you an unencumbered epub.

I had to switch to the Windows machine to do this. ADE is so clunky, halfway through downloading these 38 books I had to reboot the whole computer. Then I passed them through Calibre’s DeDRM_tools plugin to get the actual files.

Pratchett is worth it, of course. But he deserves better. And so do we.

If HC wants to compete with stolen ebooks, they need a better system.

My web store does not do everything I would hope. Ideally, you would give me money and the epub would appear on your device automagically. But at the moment, “give me money and get a link to the epub” is looking pretty dang good.

Blog Archive

For a few years now, I’ve wanted a date/title index for my blog. I searched for a plugin to do that easily and simply, and couldn’t find one. I hired an earnest flunky to do so. He couldn’t find one either. I decided to live with the current situation, and stop wasting my time searching for a tool. But every so often, I’d search again anyway. Find nothing. Remind myself to stop wasting time.

A couple days ago, one such search turned up Simple Yearly Archive. Which is on release 2.2, and has been around for years.

Anyway, the blog now has an archive page under the “Blog” menu.

This whole incident has reminded me that search engines are useless. It has also trained me to waste time.

December’s Defiant Sausage

This post went to Patronizers at the beginning of December, and the public at the beginning of January.

The longer I run this thing, the more I regret calling a buck a month “See the Sausage Being Made.” Because it inevitably gets shortened to “sausage,” and that leads nowhere good.

Similarly, I shouldn’t have named that one level “Video Chat.” Obviously, it should have been named “Meet the Rats.”

And my web store should never have used the word “chapbooks.” That’s technically correct, but nobody knows what it means. “Short fiction”–everybody understands that.

Oh well, I’ll have to change all of these in my Copious Free Time. A clear illustration that it’s better to do everything correctly the first time, which means extensive planning, which means never accomplishing anything.

But here we are. Last month of the year, and not dead yet. On to what’s going on.

I contemplated doing a Black Friday sale. This year, the Black Friday sales were more numerous than ever. It was overwhelming, and useless. There is no way to penetrate the noise. If I do a sale, it should be for something like Sysadmin Appreciation Day. Or perhaps for March 24, National Gelato Day. Yes, it’s an Italian holiday, but y’all are global and I respect a people who know how to celebrate the important things in life.

I’ve dragged “Run Your Own Mail Server” up to the rspamd section, where it immediately stopped dead. Work hasn’t stopped, but wordcount has. Rspamd is the right solution and many folks use it, but the documentation is designed for people who already know the tool. It’s gonna take me a bit to pull the software apart and see how it fits together from a sysadmin perspective, rather than the developer’s. Why do I say it’s developer-centric? It’s configured in UCL, Universal Configuration Language. I love UCL. UCL is brilliant. It lets you write configuration files in several different formats, including a plain text format inspired by nginx.

Rspamd’s configuration examples… are in JSON. Sysadmins might know some JSON, we can probably read it, but we don’t routinely write it.

You’re not supposed to edit the configuration files by hand? Fine. But the docs take us through them.

And don’t get me started on redis’ official docs. The first part I stumbled across was well done, which set artificially high expectations for the rest.

It’s not just these projects. The problem is endemic across the entire industry.

I guess that’s why y’all back me. I rage at basic software so you don’t have to. You can save your raging for higher-level software.

Rage is also why I write the orc stories. I got the baseball story I owe the orc Kickstarter backers written. It’ll go to copyedit this week, and then to my backers. Yes, y’all are my backers.

Speaking of stories, my Christmas tale Heart of Coal comes out today. I never knew that my life needed the phrase “tell Santa to stick it up his ho-ho-hole” in my life until I wrote it. Anyway, we’re just short of the Longest Dark when orcs traditionally exchange gifts, like meat and rocks and stuff, so I’m offering it to all my Patronizers. Grab a copy from Bookfunnel. As usual, this is for y’all so please don’t share.

I spent a fair amount of time on BSDCan this month. Sponsorship, the CFP system, and the web site all collided simultaneously. I wound up spending a few days in Dan Langille’s 2004-era PHP to get the site updated for 2024. Dan’s code is fine, for 2004-era PHP. I know perfectly well that the number one rule of completing projects is to do the hard part first, yet I let my committee relax about getting the infrastructure ready. I’ll have updates over at the BSDCan blog in the next couple days. I don’t intend to permanently chair the conference. Dan and I are both getting older, and we need to hand these responsibilities off to folks a few years younger. Plus, I have a whole bunch more books to write. Unfortunately, there are few people in the community who could lead the effort to split Dan into multiple parts. Once that’s complete, anyone who knows how to treat colleagues with respect and negotiate can serve as chair. I’m tempted to say “there’s got to be at least, oh, three folks in the BSD community who could do that” but the truth is, there’s a whole bunch of them.

It’s December, and that means I’ll have the usual all-Patronizer hangout. Everyone’s welcome. This year it’ll be in the evening, at least for me, so hopefully folks who haven’t been able to attend before can. Sorry Europe, gotta mix it up a little. I would like to declare that this was the result of deliberate planning rather than screwing up the morning/evening alternation earlier in the year, but that would be a lie.

I hope to see a bunch of you there. Until next month!

2023 Income Sources

Here’s where my income came from in 2023. (For newcomers, I’ve done these posts for the last few years.)

I’m a writer. My income comes from writing books and making them available. I publish both independently and through publishers. I don’t consult. I don’t seek out speaking fees. I desire to make my living as an author, creating and licensing intellectual property. I make my books available in every channel that offers reasonable terms.

Whenever I share actual dollar figures, people inform me that I can’t possibly be making that much, or that I don’t deserve to make that much, or demand I share “the secret.” The first two are not worth my time, and I’ve been trying to tell everyone the dang secret for years: keep writing, with an attitude of deliberate practice. Nothing productive can come from such discussions, so I don’t say.

How did 2023 look?

My income was flat with 2022 and 2019. While the Great Locked Inside Reading Surge of 2020-2021 supplemented my emergency fund, my income is back at its baseline. I’d like more, sure, but I have achieved Enough. Not bad for a year without many books.

Here’s the detail.

Amazon – 28.87%
Trad Pub – 17.55%
TWP direct sales – 15.29%
TWP sponsorship – 12.00%
TWP patronizer – 7.42%
IngramSpark – 5.54%
Kickstarter – 5.46%
Patreon – 4.56%
Gumroad – 1.53%
Apple – 0.70%
Kobo – 0.50%
Google – 0.37%
Draft2Digital – 0.17%
Aerio – 0.03%
Barnes & Noble – 0.01%

Can I draw any conclusions from this?

My web site (TWP, or Tilted Windmill Press) is again this year’s star. The combination of direct sales, sponsors, and my homebrew Patreon is 34.71% of my income, a couple points over last year. It’s built on Woocommerce with a handful of commercial plugins that total about $600 a year. My business goal is to get folks to buy directly from me rather than retailers, so I’m content but not satisfied.

Amazon is at 28.87%, down a couple points from last year. There’s reasons for that. They don’t have rights to distribute my newest tech book on Kindle. They’ve retaliated by deprioritizing the title in their listings. I’m not crying; I consider Amazon a discovery platform, an entry point to the Reader Acquisition Funnel. I neither love nor hate Amazon. They’re merely a retailer who offers a nonnegotiable take-it-or-leave-it deal. I accept or reject that deal on a case-by-case basis. Losing them as a channel would send me back to the “yellow zone” emergency budget, but we’d survive just fine.

Kickstarter is down, but I only ran campaigns for short story collections. My private Patronizer program grew a point, but that’s a wobble not a trend. Traditional publishing income is up, thanks to a Humble Bundle.

Then there’s the “below two percent” retailers. Gumroad, because they handle VAT for European readers. I want all the readers and Apple, Kobo, and Google serve readers other retailers don’t reach. They’re small, but those nickels spend. Unless things change, this will be the last year I report Barnes & Noble. I spent many happy hours in the 90s and the 00s wandering their aisles and I would like them to be successful for old times’ sake, but they’re just not managing it and their numbers depress me.

Here’s what the last five years have looked like. I have excluded the tiny channels.

It’s hard to call most of these lines “trends.” If you aggregate the various options from my web site, though, you can see a couple things.

Having fewer entities on this graph makes a couple things clear. I dislike that IngramSpark is shrinking year over year. I use IS to fulfill non-Amazon paperback orders and all hardcovers, so this is either an indication that either brick-and-mortar bookstores are struggling, or that I haven’t released a “hit” in a couple years. Which is it?

It also shows that my direct-to-reader business efforts are working. Readers are willing to do business directly with writers. They like supporting individual authors.

What does the swell in trad pub mean? It means that I need multiple sources of income. I have no way to control which business partner will prosper and which will pull a Wile E Coyote. No matter what, I must be able to pay the mortgage.

How much do I make off of sponsorships and Patronizers, as opposed to retailers? Fair question. Let’s see.

After a few years of growth, the non-retail income is down. Sponsorships and Patronizers were up, but Kickstarter was down (again, because I didn’t run a big one). The vital lesson here is:

if I don’t put broadly interesting product in front of people, I don’t get paid.

Now that I’ve shared the secret, it’s time to double-check last year’s expenses. Income is great, but it’s expenses that destroy you.

My Ebook Store Now Offers Gift Cards

Don’t know exactly what you want as a gift for Your Chosen Winter Solstice Holiday, but you know you want it to include my ebooks?

Tilted Windmill Press now offers gift cards. There’s no physical card, mind you. It’s a digital code that gets emailed to the recipient. But if Amazon calls this a ‘gift card’ I can too.

Yes, this is another lame excuse to take your money. Except it’s not your money, it’s money from your friends and family.

You might note that the cards are good for two years, rather than forever. People have expressed interest in TWP gift cards, but I don’t know if that will translate to actual purchases. I am buying the gift card plugin –yes, I could code something myself, but that’s specifically against my guidelines. I’m committing to buying this plugin until at least December 2025. If I decide to stop offering the gift card, I’ll buy the plugin for at least two years afterwards.

While business doesn’t bring me joy, I do find delight in trying things like this. Anything the big guys can do, I can also do. Next year, I’ll be offering some things that the big guys refuse to do. In the meantime, I have to get back to making words.