For a couple years now, maxwelljoslyn.com has been sorely in need of a facelift and some new functionality for user-friendliness. Over the last few weeks I've finally gotten around to that, and if you're reading this, you're on the new version of the site.
The rest of this post is a showcase comparing what the site looked like before and after mid-September 2026, for the sake of future visitors (including me).
A Better Homepage
The homepage is a better experience for new and returning readers alike. "Greatest Hits" comes first, is updated for 2026, and is slimmed down to make room for a photo gallery! After that, we segue cleanly into new posts.
I've imported my old blog, 21st Century D&D, into this website, tagging the posts with "21stcenturydnd".
I wrote that blog during the second half of undergrad, give or take. While doing QA on the import program, I reread all the posts to gauge how I've changed since 2016-2018.
I've improved as a programmer and game designer, and there are ideas in those posts that turned out to be dead ends, or which are chiefly of historical interest as signposts for how far I've come. Yet there's a reassuring and comforting continuity between what I was thinking then, and what I've accomplished since.
If you spend time in IndieWeb discussion circles, such as chat.indieweb.org or the get-togethers listed on events.indieweb.org, or if you spend time wandering through the indieweb.org wiki, you will find evidence that many of us share the view that UX must come first.
There are one-click-setup IndieWeb entry points. The most prominent is micro.blog which gives you a personal blog/site with all the latest IndieWeb goodness and costs $5/month.
But most people interested in the IndieWeb these days are devs, i.e. nerds, and want to roll things themselves, which is why IndieWeb-related blog posts can feel like tech soup.
I hosted July's IndieWeb blog carnival; for the subject, I chose "totems." Five drongos heeded my call. Thank you, one and all. I am dreadfully late to posting this roundup, but late beats never.
My Support Character - Albert James Moriarty
Sara shows us that a totem need not be physical. She has spent an enormous amount of time thinking about a particular anime character, and uses him as a point of reference to understand things going on in her head and in her life.
I have written 114 works [of fanfiction] spanning 189,837 words involving him.
When I analysed all my blog posts for a regex talk I was doing, he was the third most frequent 5-or-more letter word over all my blog posts spanning decade of my writing.
I'm the host for this month's IndieWeb Carnival, and the theme is totems: items of great personal, spiritual, or religious meaning, which may serve as the emblem or symbol of a group of people.
The IndieWeb itself is a living totem that we indie-website-havers create with every post. What's your totem? What does it mean to you? How did you acquire it: purchase, creation, trade, gifting, theft? Is your totem connected to the Internet, perhaps? Is it something you look at every day?
One of the best things about Homebrew Website Club is meeting new nerds. Sometimes it feels like each new club meeting brings in someone new!
River, as far as I can tell you don't have a site yet, but good luck getting started in th IndieWeb. We're all here to help.
Joe, I'm happy to sign your guestbook, and I'm looking forward to exploring your site (specially your comics.) You've got a long history to spelunk! (UPDATE: having checked out some of the comics, I'm just jealous that someone can manage to be an artist, a writer, a surfer, and a programmer all at once!)
It's been a long time since I've written here. In 2022, I was fairly busy with my master's studies and attending Recurse Center. Then, from fall of 2022 all the way through to the end of 2023, the lion's share of my time went to writing my master's thesis. Because I'm still dealing the hand injuries I sustained in 2019 and 2020, I often had to limit my time spent at the computer to just what I needed for working on my thesis. Writing for recreation was a no-go zone.
Welcome, each and every drongo, to The Drongo's first interview since our summer hiatus. We've got a real rock star for our guest today!
The Drongo: Our guest for this round of The Drongo is Jacob Hall. He's provided us the following third-person biography.
Jacob Hall: "You'd likely recognize Jacob Hall pretty quickly if you ran into him on the street: he's always barefoot, he's either wearing his pants or either of his two shorts, and his hair keeps changing colors.
He currently lives in Williamsburg, VA, studying geology at William & Mary, producing educational media for the on-campus Studio for Teaching and Learning Innovation, and co-managing a student-run house/venue/coffee shop called The Meridian. In his free time (read: procrastinatory sprees) he develops websites for himself and friends, cooks for anyone in earshot, and goes on very long walks."
Please telepathically assist me in wishing Dave Shanske (alias "GWG") a very happy birthdave.
Dave is a pillar of the IndieWeb community. Most notably, he's helped organize several of our largest in-person social events, including our yearly IndieWeb Summit conferences, and he's always willing to help run A/V or monitor the chat for attendee questions.
Here comes another Homebrew Website Club. Join us for discussion of websites, blogging, owning your personal data, open protocols, and more!
EDIT: An after-action report.
HWC is always scheduled to run for 90 minutes; in practice, we typically run to about two hours of discussion.
Tonight, though? We broke two hours. We broke three hours. We broke four hours.
By the time Angelo, Kartik, Ben, and I called it quits -- the last four stragglers from a peak of 11 participants -- this evening's club ran to five hours and forty-five minutes. Surely that's a record! And we loved every bit of it.
How can we encourage tool/solution reuse between individual IndieWeb sites, without building more hosted services?
It seems to me that many IndieWeb participants, especially those starting out, end up either (a) relying on Single Point of Aaron services or (b) building their own solutions for every aspect of the IndieWeb "stack" (Webmention, Micropub, a posting interface, etc.) This problem could be addressed with a stronger culture of developing reusable libraries for IW tasks, but turning your own code into a library usable by others isn't always easy.
What are the pros, cons, use cases, and UX considerations of doing real-time chat on your web site (such as communicating with visitors) or via your web site (such as with a hypothetical "chat-message" post type that syndicates to IRC or Discord?)
I wanted to differentiate them from the "new" labels. Since "new" was the odd one out (expressing recency rather than a topic), I changed its shape and color scheme. Here's how looked before.
What do you get when you put 10 website geeks in a room? Exactly what you might expect: lively conversation about unconventional uses for RSS feeds, "retro grouching" about old-school UNIX tools, and spitballing of potential session topics for IndieWebCamp 2020 East, coming up on November 14th and 15th. Here are the collaborative public notes we took during our discussion.
Indie Web Camp East 2020 will be taking place on November 14-15. I'll be there, and I hope you'll join me.
The magic of any special-interest social gathering will mostly be destroyed by the need for a virtual conference -- but, having attended Indie Web Camp West 2020, I can verify that the remaining 10% of the magic is enough to enjoy oneself.
Come make your first-ever website, or tinker with the one you've got. Come share what you've learned as a website enthusiast, or listen to others as you decide what to implement next. Come fall in love with personal websites, or storm off after two hours to take up fishing. There's so little downside: register today!
Today at 6 PM Pacific, I'm hosting the IndieWeb's Homebrew Website Club West Coast. If you have a personal website, come join in the fun!
HWC is informal, so there's usually no fixed agenda, but I'd like to start this week's club with a discussion about the tradeoffs between posting on a website to perform data storage (as with bookmarks), vs. using a website to display information ultimately stored elsewhere (on disk, or in a database, or live-updated from some service.)
I'm running my Micropub implementation against the official test suite at micropub.rocks. Despite the fact that I haven't implemented the entire specification (much less the extensions), my version already passes about a third of the test suite -- and a couple of the failed tests gave enough feedback to code fixes on the spot. Full steam ahead!
Tests for creating posts via Micropub (other tests not shown.)
I've spent the last couple weeks developing version 2 of this website as a Python Flask-based web application. This has required learning more about server administration, as well as putting into use the web-app development skills I've been chipping away at all year.
I'm happy to report that the new version of this site will be going live next week, with Micropub support implemented. Your end user experience should not change at all (but please report any broken links!) Improvements to navigation, content discovery, subscription, tags, and syndication are forthcoming.
My main motivation for this upgrade was to lower my self-imposed barrier to public writing and interaction.
Lately, I've been working to change this website from a pile of (generated) HTML files into a proper server-backed dynamic site. There's not much to show off, but I'm implementing a Micropub server and learning a lot more about Flask (the web-app framework.)
As I write up explanations and annotations for my poems, I find myself wanting to use lines and shapes to pick out particular areas of each work.
Here's a rudimentary prototype, drawing heavily on the LeaderLine library. Try clicking or hovering one of the bracketed sections.
I'm a fake poem, sure to spin
A top around its bottom
I am a fine explanation! And I am his lovable pal.
I'm not currently planning to turn my annotations into sidenotes or marginalia, but I'll certainly draw inspiration from the numerous attempts at that style of web design. I'll also be investigating annotation platforms like Hypothesis, which may have something to offer.
I'm attending two events today: one professional, one personal.
In the afternoon is "Digital Sources for Chinese Studies" (or "Chinese History" -- sources conflict), put on by UCI's Long US-China Institute and Yale University's Council on East Asian Studies.
For the sake of readers' eyes, I've redesigned the blog index. This post explains what changed, and why.
Before the Changes
Here are the problems with the "before" picture.
Cluttered presentation of notes
The reader can be told, "This is a note," without nearly as much text as shown at (1). Let's take a lesson from Tufte and not put so much ink on the screen.
Notes are the foundation on which specialized IndieWeb post types are built, and are so basic they don't even need titles. The note's presentation should get out of the reader's way.
Furthermore, if there are multiple consecutive notes (not pictured), then, whether they are on the same day or not, the clutter pointed out in (1) makes it hard to tell when the date changes.
There won't be an in-person IndieWeb Summit this year, but in its stead, the all-online IndieWebCamp West has been announced! Come join us for two days of discussing and developing personal websites. There's something for everyone in the IndieWeb, so whether you're a first-time blogger or an old hand at web development, you're sure to walk away charged up with the creative spirit.
Today is Day 2 of 2 for IndieWebCamp Online 2020, which means today is Hack Day! My goal for the day is to reconstruct my poems page.
[As of 15:32:57, I'm all done!]
My first task today is to solve the page-redirect woes that I've been blogging about since a few days ago. Diligent implementation of the solutions given in S3's documentation got me nowhere, so I'll use a little JavaScript to redirect from the old poems URL to the new one.
[2020-02-09T09:38:25-0800: first task complete!]
With the redirect in place, I can proceed to the larger of today's tasks: breaking out each poem onto its own page. This will accomplish two goals:
Despite getting up an hour too early, I am excited for IndieWebCamp Online 2020! I'm facilitating a session on collections, an IndieWeb term for an explicit grouping of posts which is conceptually distinct from a typical chronological feed.
By the powers vested in me, this post indicates that I am following Malcolm Blaney's Indieweb Planet, so that the Planet follows me back. Gazounds!
[Edit: it appears that the Planet has reached its subscription limit. Curses!]
[Edit, 2020-02-06T16:53:56-0800: Discussion with Malcolm on IndieWeb chat shows that I was mistaken about the subscription limit. His Planet has successfully subscribed to this website. Baboosh! Mission Accomplished! And it even exposed a bug on my site: I'd somehow deleted the rel="feed" link in my HTML <head> tags, which is how subscribers to this website know to retrieve posts from the blog.]
Edit, 2020-02-09T13:52:23-0800: I've finally solved this problem by replacing poems with a stub page that redirects to poems/index, using JavaScript to preserve the URL fragment. Mission accomplished--no thanks to S3!
Edit, 2020-02-07T20:15:29: I've tried using the other form of S3 redirect: uploading a zero-byte file called poems and adding a redirect from that file to the new /poems/index location. We'll see if that works.
Edit, 2020-02-07T10:48:32: Dammit, I don't know what I'm doing. Can anyone help?
Redirecting from the no-longer-existent poems file to the new poems/ in the "Static Website Hosting - Redirection Rules" section of the S3 Console is not working at all: I get the AWS-default 403 (Access Denied) return code (which AFAIK is masking an underlying 404 Not Found, given that poems has been deleted from the bucket.) I'm already stuck, and it's only step one of the plan below! Here are the routing rules I'm using.
If you look at the bottom of this post, after the main text, you'll see that I've added tags to categorize the pages of my website. Clicking one of the links in the "Tags" section will take you to a summary page, listing all the posts with that tag.
Originally, a bug was causing the phrase "Tags: " to show up even on pages without any tags, but as of 2019-12-08 I've rewritten the code to take care of that.
Update: Material below the (old) marker is incorrect. I'm going to go live in a cave and never touch a computer again, but before I pack my bags, here's the real scoop.
A person mention is the act of linking to someone's homepage when mentioning them in post content. It's worth having a special name to distinguish homepage links because it's a common IndieWeb practice to handle WebMentions sent to a homepage differently from those sent to other paths on the site.
Hey, Chris, the layout of your main page is slightly borked. It looks like the problem is related to some of the category names being longer than others. See image below, and good luck fixing it. [2019-12-03: Chris fixed this problem a few days ago.]
The 2019-11-21 layout of boffosocko.com's category-navigation interface.
I've coded a new feature for the blog: "previous" and "next" links! As you can see below, each post now links to its predecessor and/or successor. (IndieWeb people, those links have rel="prev"/rel="next" classes on them for machine consumption.)
Further improvements will include post tags, on the index and on individual posts; I also want to display approximate wordcounts for each post. And of course, I'm still missing comments (but that will take more doing than the other two.)
I'd like to represent my Chinese name in the h-card markup that makes this website's authorship information machine-readable. How should I do that?
Some time later:
The answer seems to be "use the p-nickname property." The wiki documentation of that property clearly states that it can be used for a handle or alias. I don't like that "nickname" is the microformats keyword for this purpose: I prefer "alias," since all nicknames are aliases, but not all aliases are nicknames. However, I'm glad to at least have solved my problem.
(Another scenario where using this property would be useful: a European friend named "Juerg" spells his name "George" when communicating in English. On his business cards, he writes Juerg 'George' Lastname; on his website, he could mark up the 'George' with the p-nickname property.)
Today I upgraded my website publishing software. From now on, new articles (individual pages which are longer and less time-dependent than blog posts) will automatically come with a date and time of publication. I'll be manually adding publication dates to prior articles over the next week or so.
Along the way, I fixed a problem I was having with adding "time last updated" to pages and blog posts. I had to manually position the mouse in the right spot before running a command to add the current time and date. Now all that is done automatically with one command, mj/insert-webpage-update-time. Having this command written also puts me 90% of the way toward the next logical step, which is automatically setting the "time last updated" every time I save a file for the site. I'll get to that in the future.
Here I go, testing out a minimal IndieWeb reply context.
Damn, it's not working. If you caught this post before I updated it, you may have seen a stupid link to "www.maxwelljoslyn.com/notes/2019/11/01/1/www.maxwelljoslyn.com/blog/2019/10/31/1".
I'll go after the problem when I have time. At the very least, I do know the blame ultimately lies with how relative and absolute hyperlinks are handled by my blogging software.
With advice from Greg McVerry, Aaron Parecki, and Ryan Barrett, I finished getting this blog set up for subscription using the `h-feed` microformat, and made other improvements along the way.
How this benefits you:
You can now subscribe to this website if your reader understands h-feed
Posts which have received updates since publishing now display their "last updated time"
For posts with explicit titles, the blog index displays them, making it more rewarding to manually browse the index
In addition to the above, all pages' titles now link to themselves, and each link in the blog index now has proper h-entry markup.
In a blog post yesterday, I discussed adding time-of-publication information to future blog posts. In that post, I decided against adding a fake publication time to prior posts which were made without recording that information.
Today, I've reversed my decision. I added time information as one step toward making the blog available to subscription tools. Adding my blog to your viewer of choice will be easier if all my blog posts come with a canonical publication time.
If you visit posts made before 2019-10-20, such as this one, you'll see I've changed their publication notices to indicate that the time given is suspect. That's good enough for me.
As of right now, the publication timestamp before this paragraph reads "Published on 2019-10-20, around 18:14:20". This timestamp is also a permalink for this page.
The dates on these posts ("2019-10-20") have been there since soon after I started this blog, but I just added the time-of-day information ("around 18:14:20") today. A machine-readable version of the time, including the time zone, has also been invisibly included in the permalink's HTML.
I did this as one step in upgrading my website so that other people can subscribe to it. If I only provided the date of publication, but not the time, someone else's reader program wouldn't be able to put my post in chronological order when compared with another post.
The IndieWeb is a group of independent creators who use their websites as the foundations of digital identity. Web technologies both extant and under development are used to copy data from one site to another, which forms the basis of a distributed social network where each participant's posts, likes, comments, and other personal output are stored on his or her personal site.
IndieWeb held the 2019 IndieWeb Summit in Portland on 2019-06-29 and 2019-06-30 (with a pre-conference meet-and-greet on 2019-06-28). I attended, and enjoyed myself despite an all-weekend headache.
To taste the flavor of this gathering, consider the process by which I gave my RSVP.