Photograph of a Fogknife sticker on a laptop lid.A housekeeping note: I have quietly ended the experiment to entice charitable giving among Fogknife’s readership with the promise of free stickers. Six months after launching the program, I have received exactly zero responses.

And, honestly, this is just fine. This blog’s regular readership is quite modest; according to my own measurements, between 150 and 200 individuals regularly read Fogknife (either through manual visits or via RSS), amongst a larger cloud of one-time or occasional visitors. These numbers have held stable in the two years since I started tracking them. That’s enough to help keep me writing, but clearly not enough to launch any kind of reader-participation activities more complex than the occasional conversation.

In the meantime, I still have this sheet of little vinyl Fogknife stickers sitting in my desk drawer. So: if you’d like one or two, please email me your mailing address, and I’ll slide a couple in your direction. (As my memory often fails me, please also note in your email that you’d like a Fogknife sticker.) In the perhaps unlikely event that I run out of stickers — which will occur only if a dozen readers take me up on this offer — I’ll update this post appropriately.

Thanks, as always, for reading.

How to respond to this post.

Photograph of a red, white, and blue-striped flag flying from the decorated stern of a ship, against a clear blue sky.
“Batavia” by edwardlich is licensed under CC0 1.0

Today I learned a practical lesson on how, when investigating software bugs, simplifying the problem space as much as possible matters — and so does thoroughly exploring every angle offered by that simplified space, no matter how unlikely it seems.

A client wished to test a new version of a certain system that another system of theirs, one under my control, regularly contacts through a simple, HTTP-based API. We found a strange problem: it rejected all attempts at communication from the system I oversee — let’s call it “MySystem” — always sending back HTTP 403 responses, signifying an access-permission failure of some kind. However, it was happy to talk to every other computer on the internet. It would even greet manual pokes sent through a web browser. From my point of view, the test system was pleased to receive messages from everyone in the world except for MySystem, the one system that my client required it to listen to.

Step one of investigating any mystery like this often means writing a program that replicates the problem as simply as possible. And so, I knit up a stand-alone script that invoked the same code libraries and techniques that MySystem uses to make web requests. Even though they came from my own computer, the remote system helpfully rejected these requests as well. Progress, of a sort!

As coincidence would have it, I had recently begun reading brian d foy’s new book Mojolicious Web Clients, which opens with several simple examples of tiny command-line web-requesters that print the full text of their work to the terminal as they go. Out of curiosity, I aimed one of these little ready-to-go programs at the target, from the very same computer — and the remote server welcomed the request, sending back the correct response.

At this point I had two simple test programs. One used the thoroughly modern web toolkit for the Perl programming language called Mojolicious (“Mojo” for short); the other used the decades-old LWP, which the similarly venerable MySystem employs. The former could make requests of the target with no problem, and the latter had all its requests summarily rejected instead. The requests came from the same machine, and asked for the same URL, using the same HTTP method. What was going on?

I had no access to the server’s logs, so I didn’t know what complaint it might have had with the LWP-based requests. Nothing to do, then, but dig into this problem myself, seeing what difference existed between the requests the two toolkits sent to the remote server. Time for another simple script that tried the trick with both libraries, printing out the full text of the request made, and the HTTP code of the response. The result looked like this (if you’ll pardon my obvious obfuscation of the client’s URL):

Trying with Mojo:

GET /some/path HTTP/1.1
User-Agent: Mojolicious (Perl)
Host: api.jmacs-client.com
Content-Length: 0
Accept-Encoding: gzip

Result with Mojo: 200

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Trying with LWP:

GET https://api.jmacs-client.com/some/path
User-Agent: libwww-perl/6.43

Result with LWP: 403

(Note that an HTTP 200 code means a successful request.)

All right, some obvious differences between the two requests, then. Mojo seems to attach several more headers to outbound HTTP requests, by default, than LWP does; my program specified no headers in either case. I saw that Mojo also split its reported target URL into a Host header and a path, compared to LWP’s simpler-looking GET of the full URL, and didn’t know offhand what any of that meant. And, of course, the User-Agent headers are different, with the two toolkits taking the opportunity to identify themselves by their full names.

Mojo’s additional headers were easy enough to try with LWP, so I started my experimentation there, adding the three extra headers — Host, Content-Length, and Accept-Encoding — to the LWP request and running the program again. Same result, other than seeing those new headers printed out. This made the different ways that Mojo and LWP phrased the GET line more suspicious, and I frowned; that would be harder to experiment with, requiring research into the reasons for the dissimiliar displays.

But before moving on to that deeper layer, and just to satisfy myself that I really had made the headers of the two requests as similar as I could, I tried the program again with the LWP request claiming a User-Agent of Mojolicious (Perl). In my experience*, the value of the User-Agent header never has any mechanical effect on server behavior; it exists merely as a way for particular clients to leave a “calling card” in server logs, if they wish — just a bit of information that might prove useful, from time to time, when reviewing logs by hand. So I expected no change; I just wanted to tidy up and make both sets of headers truly identical, for aesthetic reasons as much as any other, before continuing the investigation.

And, as you have no doubt already predicted, this change made both requests succeed.

Quite surprised and confused, I experimented with different values of User-Agent. Within a few minutes, I’d deduced that the remote server rejected all requests whose User-Agent value contained, anywhere within it, the substring libwww-perl. Removing or modifying that substring let the request succeed. This accounted for the success of the Mojo request — and the failure of the MySystem system’s requests, which used a lightly edited version of LWP’s default value for this header.

It seemed, at this point, that the customer’s web server intentionally rejected with prejudice any request made by a program using the LWP toolkit — at least, those that didn’t bother to change outgoing User-Agent values to something other than the default. Since at this point I had enough information to formulate a short question, I presented the problem to the sages at the #perl channel on Freenode. And as they often do, the denizens answered accurately within moments: some corners of the cybersecurity world have recommended blocking all requests from agents identifying as libwww-perl, and some servers duly accept this advice. This stance sees this substring as a flag flown by a filthy bot, one that didn’t even bother to set a non-default name for itself. Not exactly flying the Jolly Roger, but not troubling to provide a nation (or project URL) of origin, either — and therefore deserving of suspicion to the point of summary dismissal.

A most unexpected outcome! In my whole career as a web programmer, I’d never imagined the User-Agent header employed by automated scripts for any purposes other than curiosity (when reviewing my own server logs) or amusement (when writing a program that would go mark up some other server’s log). As a younger hacker I took pleasure in always setting the agent string to something unique to my project, imagining the calling cards my software left in server logs around the world; more recently, I have seldom bothered. What a surprise, then, to at last encounter a good reason to change the value to something other than the default.

Or, you know, to just carry on with my plans to retire LWP from all my Perl-based projects going forward and just use Mojo instead, since that apparently works just as well…

See also: A little jaunt through the bitwise.


* As several readers have pointed out to me, this speaks to my particular experience as one who has never needed to care much about website appearances during the start of the smartphone era, or the waning years of MSIE 6 — both times when serving different content depending upon user agent were de rigueur.

Share or reply to this post on Twitter, or elsewhere.

I feel compelled to write a short post just to acknowledge my support last year for impeaching President Trump. I have just now reread that post, as well as the Yoni Applebaum feature in the Atlantic that persuaded me at the time.

It feels far too early to start wailing in despair that the whole thing was a mistake and we were all wrong. Applebaum’s article used the impeachment and acquittal of Andrew Johnson as its augur, and by this measure he predicted a period of celebration and a flare of support for Trump after his own acquittal — as obvious an outcome in January of last year as it was last month.

And lo: Trump has, as I write this, begun to celebrate in his favorite way, going beyond obvious gloating (though there’s plenty of that too) and immediately delighting in the retaliation of all who wronged him through either political opposition or mere disloyalty. Not just individuals, mind you, but also their families, their constituents, and the very lands they call home.

Applebaum’s stated hopes that the act of impeachment would corrode the president’s support in the Senate, of course, proved entirely unfounded. Instead, senate Republicans just shrug, either too cowardly to protest or openly supportive of the executive’s rampant and overt abuses of power. Certainly, they do nothing at all to temper my own earlier assessment that the modern Republican party stands against human progress, or even its long-term survival.

So we all look ahead to November, once again. I do not, at this time, consider any candidate, the president included, a lock-in; I expect that Trump’s steady unpopularity balances both his incumbent advantage and his eagerness to fight dirty, including using the powers of his office to harass his political opponents. It seems currently that if the president’s impeachment carries any effect on the looming election, then it will take the form of citizens’ reaction to his unsubtly vindictive rampages upon his preordained acquittal. Now that he has little left to fear, we witness this president at his most unmasked.

We should forgive those who voted for Trump in 2016. I know my parents would have done it, were they still alive. Hillary Clinton was the second-least popular presidential candidate since such things have been tracked — losing that mantle only to her opponent — and countless people beyond die-hard Republican supporters had no love for her. I have sympathy for those who thought, not entirely unreasonably, that a jokey novelty president would shake things up and give us a few years of amusing pro-wrestling kayfabe from the White House while conducting business more or less as usual behind the scenes.

I feel plenty of reason to hope that enough of these people recognize their error and have no taste for repeating it, and will quietly make amends in the privacy of the voting booth this fall. Even if that happens, it will be impossible to say how much impact the impeachment-and-acquittal dance had. And I have to acknowledge how frustrating and sad this rare scrap of foreknowledge feels, at a time when the world needs sure-footed leadership more than ever.

Share or reply to this post on Twitter, or elsewhere.

The Fraidycat logo, two low-polygon cats walking along with 'fraidycat' displayed over them

In December I started using Fraidycat, a new, free and open-source feedreader by Kicks Condor. While I last summer voiced anticipation for its impending release, I did not expect how immediately and wholeheartedly I would appreciate and enjoy it once I began to use it. Fraidycat, just-born warts and all, quickly became my favorite feedreader program, entirely supplanting my use of ReadKit — and even giving my favorite Twitter client a run for its money, in some use-cases.

Fraidycat’s novel philosophies about fetching and displaying new content from disparate web-based sources respect one’s attention more, I do believe, than the long-prevailing single-stream news feed model. I have felt no qualms about leaving it running all day long for the past several weeks, where it serves with equal utility as an at-a-glance summary of what’s new among all my favorite blogs and such, as well as a conduit for diving deeper into any single source’s recent articles.

The progam’s core differences from a typical feedreader:

It does not fetch or display any item’s content, instead retrieving only minimal metadata from each source. It grabs items’ titles, URLs, and last-updated timestamps, plus a little extra metadata about the source itself. To read an item, click its title in Fraidycat’s window, and your usual web browser will fetch and display it in that source’s home environment.

For display purposes, Fraidycat groups items by source, rather than the traditional strategy of pouring all received items into a single feed ordered by time-of-arrival. Furthermore, it flattens sources such that each one occupies only two rows of Fraidycat’s window: one for the source’s name and icon, the other a horizontal list of its most recent items’ titles, truncated to fit. (You can tap a button to temporarily see a single source’s items as a traditional vertical list.)

When Fraidycat receives a new item, it “bumps” its source’s display-row up to the top of the source-list. Due to its grouping and display rules, though, that source’s articles don’t take up any more total vertical space in the window than they did before the new items’ arrival.

Finally, Fraidycat only shows up to ten items from any source (I think?), and furthermore doesn’t track whether you’ve clicked on anything or not. Things just flow by, faster for chattier sources. When items become stale, they quietly vanish. Nothing anywhere tallies up how many unread items you have piled up, because there is no pile.

Combined, these rules remove the anxiety that a traditional news feed presents of always running behind. Instead of a vertical tower of articles growing faster than you can possibly read them, you have a tidy list of favored sources that never changes shape — it just re-orders itself from time to time, swapping out the “front-page headline” for the affected source-row as needed. You can dip into any with a click, but if you don’t, the quiet passage of unread older items into the past no longer feels like a personal failure; it brings no more heartbreak than seeing yesterday’s newspaper go into the bin . It is so refreshing.

Fraidycat also prides itself on its ability to let you tune how often it checks in with a given source. If a website proves so chatty with new and updated items that it stays affixed to the top of Fraidycat’s window, you can ask the program to check in with it less often — only daily, say, or weekly — in order to give other sources a chance to bob up to the fore now and again. You can also segregate items into tagged categories, so that e.g. Twitter-based sources get to race around in their own view, apart from slower blogs or online magazines. (Fraidycat does indeed support not just RSS-based sources but Twitter accounts, Instagram feeds, and a surprising array of other stuff I haven’t tried.)

This leads to my one significant critique with Fraidycat’s current design: I don’t think that sources set to have less frequent check-ins should necessarily get relegated to separate views. Currently, each tag-based Fraidycat tab has sub-views for “Daily”, “Weekly”, and so on, as well as the default “Real-time” view. When you set a source to anything other than “Real-time”, Fraidycat banishes its display to that sub-view.

I think this plays a little too much into the program’s shyness about mixing too many sources into one list. As it stands, I tend to forget that any of the “rate-limited” views even exist, within a given tag-view. I don’t mind clicking around in between the category-tags according to my mood, but further clicking around between checking-rates doesn’t feel the same. These rates don’t denote any difference in content or quality from its neighboring sources, after all; I just want to see them presented a little less prominently.

Update: I note with amusement that, according to the project’s rejected-features page, this does indeed describe how the first versions of Fraidycat used to work — but early testers hated it, it seems! Regardless, Fogknife stands by its assessment.

Even though Fraidycat’s interface remains a bit rough around the edges, I find it quite a pleasure to explore. After I imported my old RSS reader’s blog-list into it, I discovered some fascinating side effects from the way it sees websites not as cannons that fire out content continuously until they at last fall silent, but repositories that last for as long as their URLs resolve. I thus found several bittersweet signing-off announcements from blogs that had long since wrapped up their work, and which in every case had gotten buried in the flood of my combined RSS feed. Fraidycat will give one source’s year-old item equal billing to another’s hour-old one, if that’s its most recent update — while also making clear, at a glace, the relative age of each item. I like that a lot.

All told, I find Fraidycat a most interesting new way to keep up with the web without either the guilty futility associated with traditional feedreaders, or the anxious addiction that social-media monoliths encourage. I quite look forward to following this program’s ongoing development.

(I use Fraidycat’s stand-alone macOS edition, even though it seems primarily intended for use as a Firefox or Chrome plugin. Linux and Windows stand-alone editions are also available.)

This article was also posted to the “web” section of Indieweb.xyz.

8 reactionsShare or reply to this post on Twitter, or elsewhere.

The following ran in last Saturday’s edition of the Bangor Daily News.

Peter Stuart McIntosh, 61, died on January 22, 2020 in Bangor.

He was born in Framingham, Massachusetts on June 23, 1958 to Dorothy and Richard McIntosh. He grew up alongside his older brother Richard Jr., and helped raise younger brother Jason years later.

After graduating from American International College, Pete held roles ranging from hotel cook to night watchman before finding his true calling, assisting adults with severe autism. He worked at special-needs homes throughout Maine, where his deep and devoted caring touched many lives.

Pete was devoted also to his wife Janice, married in 2002, his companion in every aspect of life. She predeceased him after a long illness in 2014, with Pete willingly becoming her full-time caretaker in the end.

Pete continued life after this loss by joining the Bangor chapter of Clubhouse International, a nonprofit advocate for adults with mental illness, and he made many dear friends in this community.

For his whole life Pete loved paperback novels, superhero comics, and Boston sports teams. He instilled in Jason a love of reading, whether Spider-Man or Steven King.

Peter is survived by his brothers Richard and Jason and his cat Moxie.

In lieu of flowers, those who wish to honor Pete’s memory may make a donation to the American Stroke Association or to Clubhouse International.

This represents the third family obituary I have written in seven years. I suppose it benefits from this past experience, but it differs from the previous two in that I didn’t enter the month expecting to write it. I had to scramble to pull a first draft together before the paper’s weekend deadline while juggling every other sudden responsibility that fell to me upon my brother’s wholly unexpected death. My first try proved far too lengthy, and with friends’ help I ground it down below the $300 mark (at the paper’s $1.25-a-word rate).

As such, much remains unstated here, including the cause of Pete’s death. A car struck him as he crossed the street while walking home after dark. Within hours surgeons had set to work repairing his many broken bones. They could see brain injuries as well, but imperiled brains often surprise doctors with their resilience, so we waited for days to see if he’d regain consciousness. He did not, and the long sleep plus the nature of the injury meant that he almost certainly never would. His family agreed to let his body slip away, joining the personality that the car probably obliterated on impact.

This oblique stroke cut short an already tragic life. The obituary’s first draft contained no details of the accident or its aftermath, but it did put more words towards the complete and permanent devastation he had experienced six years before with the loss of his wife Janice six years ago. Her death tore him apart, and he never really came back together.

Pete triggered the previous time I had to race to Bangor in an emergency mode, which I detailed in a cotemporary post on my old LiveJournal. In short, after I rescued him from despair-driven homelessness, he proceeded to live an utterly enervated existence, defined primarily by mourning, for years to come. I can reveal now that “Hank” in my angry and self-loathing Gameshelf post about the Walking Dead video games was Pete. These articles from a half-decade ago accurately and frankly show the poisonous frustration I felt for my brother, my will to sympathize with his terrible loss balanced with my inability to understand why he couldn’t move on from it.

In time he came partway out of this state, largely thanks to Clubhouse International, whose Bangor chapter helped him out a great deal, and even set him up with a dishwashing job for a little while. But Janice’s ghost never, ever left his sight. No conversation with Pete could happen without mention of her, right up through the last time I spoke with him this month. If he laughed at a joke, he’d often catch himself, horrified, and explain that his laughter doesn’t mean that he’s forgotten Janice. When he got confused while paying for his groceries, he’d mumble apologies to the cashier about how he hasn’t thought straight since his wife died. Death made her larger, infinitely large, Pete’s whole universe, forever.

On Tuesday, having done everything I could in Bangor until the spring thaw — when I plan to lay Pete’s ashes to rest by his wife’s, in her northern Maine home town — I returned home by train. The landscape smearing past the window invited my mind to drift, for the first time in two weeks, to contemplate my own loss. I wondered if Pete had time to turn to face Janice in his final conscious moment, to send out a radar-pulse of love to her memory as he abruptly transitioned into memory himself. Without thinking too much I summoned up “The Commander Thinks Aloud” by The Long Winters on my phone, a deeply sad and beautiful song about the last thoughts of someone perishing in a sudden, violent accident. The lyrics reflect not pain or fear but longing, an ultimate unrequited longing. Can you feel it, we’re almost home sang its voice, as my tears ran freely, and Connecticut rumbled on past.

I carry the terrible ambiguity that in my final conversation with Pete, on the telephone a week before the hospital called me, he sounded quite upbeat. As the years went on, he never stopped living every moment for Janice, but he gradually got better at the living part. He made friends, he started attending church again, and he got back into reading. He also struggled — letting bills pile up, frequently losing his housekeys, and developing balance issues that forced him to stop driving, and then stop working. He sometimes called me in confusion or desperation, but that last time he felt calm and hopeful.

And underneath surged an impossible longing for his lost partner, a roaring river of it, wider and deeper than anything I’ve ever felt, maybe more than anything I am capable of feeling. I needed a song to unlock this revelation, and to glimpse the tragedy of so suddenly losing someone capable of feeling so much love, so much love that it may well have drowned him.

5 reactionsShare or reply to this post on Twitter, or elsewhere.

Van Gogh's 'The Starry Night', all swirls and spires.I quite enjoyed Max Tegmark’s Our Mathematical Universe on a number of levels. While I thrilled at its concise and entertaining summaries of recent, consensus-backed theories about the observable universe — what a relief to finally understand the importance and implications of cosmic background radiation — I didn’t begin to grasp his much more personal ideas about reality’s ultimate nature until some weeks after finishing the book. This has given me a new, meditative model of the world and my place in it, and thinking upon it has provided a source of quiet comfort in turbulent times.

Tegmark doesn’t put it in so many words, but I understand the book’s eponymous conjecture this way: All of reality is a single, graphed-out equation, rendered in matter and energy rather than ink on paper.

A tiny equation like x = y describes, in three characters, a very simple yet boundless mathematical structure, in this case an infinite line: easy to conceive, predict, and work with, even if impossible to literally graph in its entirety. Tegmark, a physicist at MIT, feels certain that all of time and space, in its infinite vastness, maps to a mathematical structure with a similarly finite description — one short enough to fit on a T-shirt. (Clearly quite enamored with the notion of wearing the universal equation while a resident of said universe, Tegmark fantasizes about that T-shirt no fewer than three times within the book.)

In this view of reality having a single mathematical source, concepts like the flow of time, or motion, or randomness — or change of any kind — do not objectively exist. We subjectively perceive all these phenomena as living sub-structures within the whole super-structure, and in that sense, in our little line-segment view of our little slice of the graph paper, they are real and meaningful. But ultimate, objective reality contains every possible state of the universe, just like a graphed-out equation contains every possible point for which the equation holds true. These states exist outside of time, in the sense that time itself is just one axis of this graph.

In one latter part of the book, Tegmark invites the reader to consider the lifetime of an object — say, for example, the reader’s own body — as a collection of particles in three dimensional space, moving through time. Graph this phenomenon, and those punctiform particles stretch out along that fourth axis into noodles, all bound together so long as the object remains coherent. Now play it out further in either direction, and watch those noodles bind and braid together when the object comes into existence, and then fray out and go their separate ways when the object concludes its business, some distance upstream. In between these two ends, peer closely to see particle-noodles come and go as the object goes about its daily activity, taking in, transforming, or ejecting little bits of the universe.

If you feel up to it, you can try imagining the unimaginable fifth axis where each noodle bursts out into a fractal bush, representing every possible path through space that every particle can take, moment by moment, according to the law laid down by the one bit of math at the bottom of everything. Got that? Now zoom out a lot — all the way, keep going — so that the graph encompasses not just the one object’s little lifetime, with all its possibilities, but all the objects, everywhere, and everywhen, and everyhow. And when you arrive, there you have it: the single, unmoving, unchanging graph of everything. Bubble-trails in an infinitely complex but utterly static crystal. You are in it; every possible you is in it. And I am in it too, and every copy ever displayed of this blog post is in it (as well as every version I didn’t write but could have), and so’s Jesus and Buddha and Sappho and Carl Yastrzemski and everything that’s gonna happen to the memories of all of us, all together, forever.

To the best of my recollection, Tegmark avoids overt mention of any religion in Our Mathetmatical Universe, but it happens that I read this book in a period of exploration of religious traditions other than those I grew up with, made palatable through cultural filters nearer to hand. This includes Buddhist and Hindu thought as expressed by Alan Watts (discovered, yes, through the video game Everything), recent translations of ancient Chinese texts as guided by audio-book courses, and the color-saturated mashups up Eastern mysticism and contemporary cosmology found in Grant Morrison comics. None of these texts or teachers radically transformed the way I see reality, but I now feel that they made me pliable enough to consider Tegmark’s cosmic model, and find it surprisingly agreeable.

I may also have become more receptive due to some negative input: several months ago, I felt remarkably sour after listening to a radio piece about free will. The interviewer, using a narrow definition of the term, spoke to several physicists who all shot it down as a laughable or childish concept. They saw the universe as a complicated machine operating by wholly deterministic rules, each moment from the Big Bang until the Big Whatever entirely inevitable given the moment before, a ball rolling down a hill. The piece didn’t sit right with me, in part because I thought the question poorly asked, and I have yet to examine my distaste more deeply.

Why, then, does the superficially similar Tegmark model seem so satisfying to me? Clearly I dislike thinking of myself as riding through life on rails, fogged with the mere illusion of meaningful choice. But the alternate thought of every possible reality-state existing at once, which should also obviate the notion of choice, does not at all offend me in the same way.

I have long admired the hypothesis that the digits of π contain every conceivable number sequence, and thus every possible bit of numerically encodable information. The Tegmark model merely takes this one-dimensional concept and stretches it across a few additional directions, such that every possible universal snapshot might also be found, somewhere, in the graph of that elusive ultimate equation.

In this model, I don’t ride through life strapped into a mine-cart of irresistible physics. I don’t go anywhere. I just am, a static and eternal noodly swirl in a vast and unmoving map that is also its own territory that is the whole of everything that ever could be, according to a concise and immutable statement that one day I might indeed wear on a T-shirt.

And that makes me feel very peaceful.

1 reactionShare or reply to this post on Twitter, or elsewhere.

Photograph of a dirt-caked bottle of Tussin DM cough syrup lying in a filthy ditch“Tussin-DM” by danisabella is licensed under CC BY 2.0

I spent the first three days after New Year’s sinking ever deeper into the most suffocating despair I can ever recall feeling. A vague malaise that settled over me on January 2nd had, by the afternoon of the 4th, become a crushing depression. I passed a line where I could take no action more strenuous than lie in bed and leaf through comics, which passed the time but gave me no joy. I let my all my other intended fresh-new-year tasks slide, unable to see any point to them.

The whole time, I assumed I felt sad and hopeless from the top news headlines, which had arguably taken a steep turn for the worse soon after the year began. But I have certainly weathered spikes of upsetting news in recent years — as have we all — so I felt unclear why this most recent storm dampened my spirits so profoundly.

It reached a nadir-crescendo on Saturday afternoon, when I finally talked through my misery with a loved one. An obvious action in retrospect, but one delayed while my depression felt so heavy that I assumed sharing the load would mean crushing someone else under the weight. However, that afternoon I had sunk to a point of such singular despondency that my mental state no longer seemed realistic, or anyway not at all in-character. I began to suspect the presence of some other unwelcome factor.

And lo, just a few words into that talk-through, I realized how my emotional slide tracked quite neatly with the commencement of my taking heavy-duty “nighttime” cold medicine all day long.

I had indeed contracted some gnarly bug on the way home from my holiday travels last month, and so, you see, I had turned to the good stuff, whose ingredients begin with 20-proof alcohol and carry on from there. I don’t drive, and don’t even really have a job at the moment, so I saw no harm in hitting our bottle of blue syrup without seeking its orange complement. For nearly three days I kept myself dosed from wake-up to sleepy-time, careful not the exceed to four-pulls-per-day limit on the label.

In effect, I had unwittingly gone on a day-drinking bender. The medicine-cocktail’s already dissociative side-effects encouraged my mind to drift into cobwebby corners I normally avoid, and its alcoholic kicker gave it that extra little shove into the dark. Sitting alone in the house, stewing in this sauce for days — what other outcome could possibly have happened?

This connection, once made, arced across my perception like electricity, lighting everything up again almost instantly. The bottle’s sat still on my nightstand since then, and the news continues its parade of horrors but it no longer presses my face into the cold mud. I can once again act in spite of it.

Two outcomes from this misadventure:

First, I seem to have let myself acquire a tendency to read food and drug labels with cynical flippancy. I really I ought to check myself, there.

Secondly, this chemically induced experience granted me, I believe, a taste of what my friends with chronic depression live with ordinarily. I don’t mean to trivialize this condition through my story of how I buoyed myself out through a a bit of conversation — I accomplished this precisely because I do not live with real, ongoing depression. I accept this piece of received empathy with humility.

Share or reply to this post on Twitter, or elsewhere.

Having arrived at the concluding day of a year that ends in “9”, I can’t not take stock.

Carrying over from 2009, and throughout the following decade, I’d spend several hours every week at my day job as a software consultant. I did plenty of good work, but all for other peoples’ projects, so I seldom mention it in detail.

2010: Attended PAX East: an amazing experience, and effectively one of the very first larger-scale interactive fiction conferences. (Zarf’s contemporary account of it jibes with my own.) I started to feel like part of a real movement, and then I wrote The Warbler’s Nest.

2011: Taught a game lab at Northeastern University. I did my best and it went okay, but the experience convinced me that I am not a teacher. Officially closed up shop at Volity, the games startup that I’d co-founded years before.

2012: Published a lot of iOS work. I had a great time, but none of it survives today, because I have turned my back on the platform as a developer. (Today, I keep an old iPad on my bookshelf as evidence that these games ever ran at all.) Visited San Diego — flown out for two weeks on a lucrative consulting gig, a unforgettable experience I’ve yet to repeat.

2013: A black hole of a year. My father succumbed to cancer just days after its diagnosis. I suddenly had to take charge of my mother’s care, as — to everyone’s surprise and dismay — she suffered from profound dementia. I learned a lot about arranging medical care and legal protection for elderly parents. After a very challenging six months, we found a home for mom at a “memory care” facility in Maine. Then I hid in New Orleans for a while. While doing so, accepted an invitation to become IFComp’s next organizer.

2014: An exploding nova of a year. Got married (on my 40th birthday), found my destitute brother a home, created Barbetween, organized the 20th IFComp (after rewriting almost all its custom software), created two Twitter bots, moved to Rhode Island, got paid to make a small IF game, spoke and presented work at Wordplay in Toronto, sold my parents’ house, created Plerd, and began blogging regularly.

Starting here, and for the rest of the decade, I’d spend several hours every week writing articles for this website. I didn’t think I’d manage to keep up a weekly-ish pace with it, but somehow I have.

2015: With friends from the Boston IF community, began to gather together what would become IFTF. Spoke at The Perl Conference (née YAPC) about why I made Plerd. Visited Salt Lake City.

2016: Created Bumpyskies, which I now recognize as my masterpiece as a toolmaker. Started to rent an office in Newport. Visited Denmark. Launched IFTF. Spoke at my mother’s funeral. Wracked with waves of acute anxiety after the American elections, I began to see a therapist. Said goodbye to Ada.

Starting here, and for the rest of the decade, I would spend at least a little time every week tending to IFTF.

2017: Spoke at !!Con about how I made Bumpyskies. Made deep personal connections whose specifics bear no mention here, but they fueled much of my writing at the time. Decided to turn down an opportunity to double down on my consulting work, and instead work on small, fun projects again. This begat stuff like Alisio and Bayamo — neither of which I continue to use much today, but they propelled me on, and I regret nothing.

2018: Moved to Providence. Discovered the IndieWeb and went a little crazy with it. Wrote Bise and Brickfielder, two small fun projects that I do continue to use. Took the reins of IFTF’s accessibility project, leading a great team. Visited England.

2019: Shipped the accessibility project, helped by dozens of volunteer testers. Watched with joy and pride as IFTF ran the first Narrascope, a purpose-built conference for interactive fiction and other narrative games. Joined a writers club in Providence, and thought about switching careers. Launched Sweat. Visited Paris. Moved to New York.


In all honesty, I did not see until just now the obvious bookends — nay, the arc — formed by the semi-accidental IF conference in 2010 and the extremely intentional one in 2019, with IFTF’s genesis smackdab in the middle. I would not say that my drive to support interactive fiction defined my decade, but it does rather seem to have formed the backbone of it.

I have often wondered, in more recent years, if I’ll ever have an explosively creative year like 2014 again. Maybe I don’t want one; maybe it required what came before. I think I would prefer stability over going through all that again.

What else is there to say? We’ve been through a lot together. I’m glad you’re still here, and I hope you stay. See you tomorrow.

2 reactionsShare or reply to this post on Twitter, or elsewhere.

Detail of a canvas painting of a swimmer, focusing on their yellow-flippered feet, against an ocean-blue backdrop.
“Ocean Paintings 2015” by antoine renault is licensed under CC BY-NC-ND 4.0

Subnautica is the best console-based video game I played in 2019. Despite the low likelihood that I will ever actually finish it, I would heartily recommend it to anyone comfortable with typical FPS controls and who could afford to spend a few days-to-weeks exploring an engaging and accessible survival/crafting sim, and perhaps the best “low-HUD” immersive adventure I have ever dove into.

Allow me to unpack that latter term, since I just now made it up. (And please do tell me if better label already exists for this!) By “low-HUD”, I mean an open-world adventure game with FPS controls but not an ever-present Skyrim-style on-screen readout, painting compasses and mini-maps and task-lists and floating arrows in the sky and glowing markers in the road telling you precisely where go to next and who to talk to and/or stab. I understand why games — successful games, great games! — have these, and I do not like them.

In real life, you gain much less familiarity with a neighborhood if you navigate solely through a GPS device whispering meter-precise directions to you, versus having a short list of more ambiguous landmarks to look for and recognize. Often you want the easy way, of course — when you just have to pick up a bag of cat food or whatever and then get back to work, you don’t always desire an adventure of urban exploration in the process.

But when I play an adventure game, I always want that! In fact, I feel resentful and even a little sad that the designers crafted this beautiful and enormous world full of things to do and places to see and people to talk to, and then all but insist that I follow a pre-written to-do list while my character somehow knows exactly which person wandering around this town is the man I’m looking for, or precisely which drawer in which desk of which room on which floor of this building I learned about just five minutes ago has the secret code I need, because in all cases the Green Map Pointer of Destiny decrees it. As a result, these games feel less like exploring than just gulping down content by way of exploration-like activity. I still have to make my dude walk around, after all, and he can go in any direction I please — but going in any direction other than directly towards the next Green Map Pointer feels like a bizarre waste of time, like rewinding and rewatching the same scene of a movie repeatedly in a pointless attempt to make that scene longer instead of just letting it play as intended.

But if Skyrim (or Witcher 3 or Outer Worlds and on and on) didn’t have that hyperactive HUD, few people outside of hardcore adventure-game fans would have played it. It would have been too hard! I’m not even sure it would have been possible, in fact; surely the game was designed from the outset under the assumption that players would allow the game to continuously act both as Dungeon Master and as personal assistant, removing as much friction as possible from getting the player to their next joyful Quest Complete! fanfare and the extention of their to-do list by another page.

This personal distaste means that some of my favorite games over the last several years have included immersive 3D exploration games that do not lean heavily on all this on-screen metadata — hence my label of “low-HUD” games. And I have played and enjoyed plenty: Gone Home, The Vanishing of Ethan Carter, and Soma, to name three very different examples. The first confines itself to a single, large suburban house, and involves mainly self-paced, no-stakes poking around while it tells you a story. The latter two present more substantial open worlds to explore and simple puzzles to solve — and in Soma’s case, creepy monsters to evade. All three games leave it up to the player to map out their respective territories, though; none give you radars and compasses and GPS bing-bongs when you need to turn left. And I glommed onto each experience the moment it began, thinking Ah, at last, this is what I want!

Subnautica, also a member of this low-HUD club, raises itself above any other I have played due to its uncanny success at mixing in a real-time survival-simulator, a genre I’ve wanted to like for years but have always only bounced off, whether the venerable Minecraft, the blunt Don’t Starve, or the swiftly cruel The Long Dark. Subnautica takes elements from those games — hunger/thirst timers, hostile wildlife — in order to set its basic, initial stakes. In due course, Subnautica’s focus shifts from such immediate challenges to learning to live as a castaway, with an eventual — very eventual — goal of escape and ultimate victory. I have unironically called it the best adaptation of The Martian into a video game I could ever hope for.

The magical turn, for me, happens with this sequence of early-game observations and realizations:

  1. The very first time you pop out of the crashed pod to look around, you see the burning wreck of the mile-long starship it had ejected from taking up much of the horizon in a certain direction. “Ah, yes, mise-en-scène, very good,” you think to yourself, and then disregard the wreck as window-dressing.

  2. You want to make note of some interesting underwater features you find while exploring. You always know your depth and how far you are from your pod, but you have no compass, no sense of bearing. But you do have an enormous crashed starship parked on the horizon. This piece of scenery suddenly gets a new role: “north”. You can now make crude triangulations of any feature based on its objective distance to your pod and what direction you travel relative to the line between your pod and the ship.

    Nothing in the game tells you to do this, and nothing in the game “knows” that you’ve made this connection, much less scribbling your notes into a paper notebook as I began to do. But you inevitably start thinking of the ship in these terms anyway anyway, and it feels awesome, becauase that’s you thinking like a survivor for real, even just a little bit.

  3. If you swim in the direction of the ship, you get some blather about deadly radiation from its busted-up engines — and anyway, it’s very far away from the safety of your pod. “Ah, of course, diegetic limitation on the game’s explorable area, very good.” But then you learn to swim faster, and then you discover ways to ward off radiation, and then you start receiving nudges that the ship holds material and information you need to order to continue the overall quest.

    The wreck thus undergoes a second transformation from scenery to useful scenery to complete explorable area that has rested in front of you this whole time with its own dangers and realities and rewards. This floored me. Some real design magic, here!

Once I thoroughly explored the ship — and completed the plot-critical task it contains — the game blew up for me, in the sense of my character’s ability to widen their explorable hemisphere even further (and deeper), their motivation for doing so, and my own confidence as a worthy player of this difficult game. And the game paced right along with all this, giving me many more sequences of mystery and discovery and mastery much like this initial, long-paced encounter with the shipwreck, and all still in the same, seamless, open world stretching around that smelly old life-pod. It is very good, and I played it for weeks.

This all happened last summer, right after I shipped a knot of projects for both my dayjob and for IFTF that had consumed nearly my attention for several months. I needed a vacation, and Subnautica gave me a seaside holiday really unlike anything I’d ever experienced in its medium. Alas, holidays have to end sometime, and after around 200 hours of play I felt it time to return home — making a cliffhanger out of my poor aquanaut, who we last saw plodding a thermally shielded mech suit through a vast undersea volcanic system, searching for a rumored cave network. Continuing from this point would mean sinking many more hours into building a scanning-base rated for the proper crush depth, and I love that I know that, and I just can’t. I knew that I had eaten my fill of this wonderful game, and had reached the extent of my appetite.

We do sometimes return to vacation spots we treasure. Maybe the time will come when I cannot resist blocking out a couple more weeks to climb back into my lead-lined wetsuit and see how much deeper Subnautica goes. But until then — and even if I never do — my time on Planet 4546B will always be some of the very finest I’ve ever spent holding a game controller.

(For further reading, see also Matt Weise’s review of the game from a narrative perspective.)

This article was also posted to the “games” section of Indieweb.xyz.

5 reactionsShare or reply to this post on Twitter, or elsewhere.

According to Mainer, the University of Maine College Republicans has lost its status as an active student group — and thus also lost its eligibility to receive university resources — after professor Amy Fried abruptly ended her role as its faculty advisor, with no clear successor. This came in response to UMCR’s invitation to the authoritarian agitator Michelle Malkin to speak on-campus, as well as to the group’s ongoing use of social media to embrace a white-nationalist, anti-immigrant stance.

As one who wrote a public demand two months ago that UMCR have its platform withdrawn, I applaud Fried’s decision. I had aimed my appeal at the university’s leadership, but I find myself much more satisfied with this outcome than I would have had UMaine declared UMCR unwelcome by fiat. Instead, the group’s mandatory adult supervisor exercised her right to end her voluntary connection with with it, and in so doing cut the university’s official ties with it as well.

I do not imagine that this decision brought Fried any joy; it must have felt like a professional failure, to some degree. I have to assume that her action came at the end of an unsuccessful string of attempts to advise UMCR away from complete contempt for pluralistic democracy. But the group clearly chose to let president Trump — with his coterie of always-online, conspiracy-minded boosters — to act as UMCR’s one true advisor. I imagine that her decision to finally cut them loose must have hurt, a very small-scale echo of the way that impeaching a president hurts. In both cases, a sign that something has gone terribly wrong, and that a political body — be it a small state university or a super-powered nation — must injure itself in an attempt to right things.

I suppose, then, that I don’t applaud Fried’s decision so much as I approve of it, with a grim nod.

2 reactionsHow to respond to this post.


Previous post: I made a now page