Threaded Replies and Comments with Webmentions in WordPress

Introduction to what one would consider basic web communication

A few days ago I had written a post on my website and a colleague had written a reply on his own website. Because we were both using the W3C Webmention specification on our websites, my site received the notification of his response and displayed it in the comments section of my website. (This in and of itself is really magic enough–cross website @mentions!)

To reply back to him I previously would have written a separate second post on my site in turn to reply to his, thereby fragmenting the conversation across multiple posts and making it harder to follow the conversation. (This is somewhat similar to what Medium.com does with their commenting system as each reply/comment is its own standalone page.)

Instead, I’ve now been able to configure my website to allow me to write a reply directly to a response within my comments section admin UI (or even in the comments section of the original page itself), publish it, and have the comment be sent to his reply and display it there. Two copies for the price of one!

From the comments list in my Admin UI, I can write a reply and it not only lives on my site but it can now be sent as a comment to the site that made the original comment! As an example, here’s my first one and the resultant copy on the site I was replying to.

This means that now, WordPress-based websites (at least self-hosted versions running the WordPress.org code) can easily and simply allow multiple parties to write posts on their own sites and participate in multi-sided conversations back and forth while all parties maintain copies of all sides of the conversation on their own websites in a way that maintains all of the context. As a result, if one site should be shut down or disappear, the remaining websites will still have a fully archived copy of the entire conversation thread. (Let’s hear it for the resilience of the web!)

What is happening?

This functionality is seemingly so simple that one is left wondering:

  • “Why wasn’t this baked into WordPress (and the rest of the web) from the start?”
  • “Why wasn’t this built after the rise of Twitter, Facebook, or other websites which do this as a basic function?”
  • “How can I get it tout suite?!” (aka gimme, gimme, gimme, and right now!!!)

While seeming simple, the technical hurdles aren’t necessarily because there had previously never been a universal protocol for the web to allow it. (The Webmentions spec now makes it possible.) Sites like Facebook, Twitter, and others enable it because they’ve got a highly closed and highly customized environment that makes it a simpler problem to solve. In fact, even old-school web-based bulletin boards allowed this!

But even within social media one will immediately notice that you can’t use your Facebook account to reply to a Twitter account. And why not?! (While the web would be far better if one website or page could talk to another, these sites don’t for the simple economic reason that they want you using only their site and not others, and not enabling this functionality keeps you locked into what they’re selling.)

I’ll detail the basic set up below, but thought that it would be highly illustrative to have a diagram of what’s physically happening in case the description above seems a bit confusing to picture properly. I’ll depict two websites, each in their own column and color-coded so that content from site A is one color while content from site B is another color.

A diagram of where comments live when sent via webmention.
Each site composes and owns its own content and sends the replies to the other site.

It really seems nearly incomprehensible to me how this hasn’t been built into the core functionality of the web from the beginning of at least the blogosphere. Yet here we are, and somehow I’m demonstrating how to do this from one WordPress site to another via the open web in 2017. To me this is the entire difference between a true Internet and just using someone else’s intranet.

Implementation

Prerequisites

While this general functionality is doable on any website, I’ll stick to enabling it specifically on WordPress, a content management system that is powering roughly 30% of all websites on the internet. You’ll naturally need your own self-hosted WordPress-based website with a few custom plugins and a modern semantic-based theme. (Those interested in setting it up on other platforms are more than welcome to explore the resources of the IndieWeb wiki and their chat which has a wealth of resources.)

Plugins

As a minimum set you’ll want to have the following list of plugins enabled and configured:

Other instructions and help for setting these up and configuring them can be found on the IndieWeb wiki, though not all of the steps there are necessarily required for this functionality.

Themes

Ideally this all should function regardless of the theme you have chosen, but WordPress only provides the most basic support for microformats version 1 and doesn’t support the more modern version 2 out of the box. As a result, the display of comments from site to site may be a bit wonky depending on how supportive your particular theme is of the microformats standards. As you can see I’m using a relatively standard version of the TwentySixteen theme without a lot of customization and getting some reasonable results. If you have a choice, I’d recommend one of the following specific themes which have solid semantic markup:

Plugin

The final plugin that enables sending comments from one comment section to another is the WordPress Webmention for Comments plugin. As it is still somewhat experimental and is not available in the WordPress repository, you’ll need to download it from GitHub and activate it. That’s it! There aren’t any settings or anything else to configure.

Use

With the plugin installed, you should now be able to send comments and replies to replies directly within your comments admin UI (or directly within your comments section in individual pages, though this can not require additional clicks to get there, but you also don’t have the benefit of the admin editor either).

There is one current caveat however. For the plugin to actually send the webmention properly, it will need to have a URL in your reply that includes the microformats u-in-reply-to class. Currently you’ll need to do this manually until the plugin can properly parse and target the fragmentions for the comments properly. I hope the functionality can be added to the plugin to make the experience seamless in the future.

So what does this u-in-reply-to part actually look like? Here’s an example of the one I used to send my reply:

<a class="u-in-reply-to" href="https://islandinthenet.com/manually-adding-microfomats-markup/">Khürt</a>

The class tells the receiving site that the webmention is a reply and to display it as such and the URL is necessary for your webmention plugin to know where to send the notification. You’d simply need to change the URL and the word (or words) that appear between the anchor tags.

If you want to have a hidden link and still send a webmention you could potentially add your link to a zero width space as well. This would look like the following:

<a class="u-in-reply-to" href="http://www.example.com">&​#8203;​</a>

Based on my experiments, using a <link> via HTML will work, but it will send it as a plain webmention to the site and it won’t show up natively as a reply.

Sadly, a plain text reply doesn’t work (yet), but hopefully some simple changes could be made to force it to using the common fragmentions pattern that WordPress uses for replies.

Interestingly this capability has been around for a while, it just hasn’t been well documented or described. I hope now that those with WordPress sites that already support Webmentions will have a better idea what this plugin is doing and how works.

Future

Eventually one might expect that all the bugs in the system get worked out and the sub-plugin for sending comment Webmentions will be rolled up into the main Webmentions plugin, which incidentally handles fragmentions already.

Caveats

In addition to the notes above, I will say that this is still technically experimental code not running on many websites, so its functionality may not be exact or perfect in actual use, though in experimenting with it I have found it to be very stable. I would recommend checking that the replies actually post to the receiving site, which incidentally must be able to accept webmentions. If the receiving website doesn’t have webmention support, one will need to manually cut and paste the content there (and likely check the receive notification of replies via email, so you can stay apprised of future replies).

You can check the receiving site’s webmention support in most browsers by right clicking and viewing the pages source. Within the source one should see code in the <head> section of the page which indicates there is a webmention endpoint. Here is an example of the code typically injected into WordPress websites that you’d be looking for:

<link rel="webmention" href="http://example.com/wp-json/webmention/1.0/endpoint" />
<link rel="http://webmention.org/" href="http://example.com/wp-json/webmention/1.0/endpoint" />

Also keep in mind that some users moderate their comments, so that even though your mention was sent, they may need to approve it prior to it displaying on the page.

If you do notice problems or issues or have quirks, please file the issue with as full a description of what you did and what resulted as you can so that it can be troubleshot and made to work not only for you, but hopefully work better for everyone else.

Give it a try

So you’ve implemented everything above? Go ahead and write a reply on your own WordPress website and send me a webmention! I’ll do my best to reply directly to you so you can send another reply to make sure you’ve got things working properly.

Once you’re set, go forward and continue helping to make the web a better place.

Special Thanks

I wanted to take a moment to give special thanks to Aaron Parecki, Matthias Pfefferle, and David Shanske who have done most of the Herculean work to get this and related functionality working. And thanks also to all who make up the IndieWeb community that are pushing the boundaries of what the web is and what it can accomplish. And finally, thanks to Khürt Williams who became the unwitting guinea pig for my first attempt at this. Thank you all!

​​​​​​

Syndicated copies to:

An update to read posts for physical books

Inspired by gRegor Morrill’s IndieWebCamp Austin project, I went back and took a look at some of my read posts, and particularly for books.

For online material, I use the Post Kinds Plugin which does a good job of adding h-cite and p-read-of (experimental) microformats classes to the data for the things I’ve read.

Because Post Kinds doesn’t (yet?) support percentage finished or number of pages read, I generally do read posts for books by hand as notes with the relevant data. So I decided to add some better mark up to my book-specific read posts and added microformats classes of h-cite, u-url, u-read-of, p-name, p-author, h-card and dt-published. I’m far from an expert on microformats, but hopefully the way I’m nesting them makes sense to parsers off in the future. (Suggestions for improvement are more than welcome.)

I like Gregor’s idea of p-read-status for things he’s posting and will have to see how I can pull that off for posts in the future (or suggest it as an addition to Post Kinds). Presently I’m just adding a want to read tag, but that could be improved to better match the functionality I appreciate in silos like Goodreads. I’ll also have to load up Gregor’s recent modifications to Quill and test them out on my site as well. I know David Shanske has expressed interest in better aligning Quill and micropub clients to post to WordPress with Post Kinds in mind.

Here’s an example of the mark up of a recent read post:

Read pages 381-461 to finish reading <span class="h-cite"><cite><a class="u-url u-read-of p-name" href="http://amzn.to/2zXnQDC" target="_blank" rel="noopener">Origin: A Novel</a></cite> by <span class="p-author h-card"><a class="p-name u-url" href="http://danbrown.com/">Dan Brown</a></span><time class="dt-published" datetime="2017-10-103 00:00:00"></time></span>

It’s also made me begin to feel itchy about some of my past quote posts and potentially revisiting them to add the appropriate h-cite and related mark up to them as well. (Or at least fix it moving forward.)

Incidentally, my real camp project was some heavy editing work on “The Book.” More on that later…

Syndicated copies to:

Mismanaged road closures on 210 Freeway for the Creek Fire (and others)

I’ll note at the outset that there are larger, potentially more pressing problems relating to the current fires in Southern California, and I have every hope that they’re mitigated as quickly and smoothly as possible, particularly for the large numbers of displaced residents. But I also know that this is not our “first rodeo”, and therefore there should have been better planning and be a better coordinated response from state and local officials.

Apparently in a fit of poor thinking, the California Highway Patrol and the fine folks at CalTrans Distric 7 have closed almost all of the East and Westbound exits on the 210 Freeway from roughly Glendale to past Sylmar. This includes exits for areas that aren’t under immediate threat, nor, based on reports I’ve seen, for areas that are expected to be threatened.

While I understand that they’re evacuating much of the proximal area for the Creek Fire and public safety, they’re potentially causing not only undue burden on people moving around or through the area, but adding stress to resources needed to abate the issue. In particular, while it may be advisable to close several on/off ramps nearest the fire, it is neither smart, nor helpful to have all of them closed for miles and miles in all directions, particularly those closures at the furthest ends.

Because the Westbound Pennsylvania and Lowell freeway ramps were (unnecessarily) closed this morning on the Westbound 210, I and thousands of others, including countless parents taking their children to one of the several dozen schools in NorthWest Glendale, were unnecessarily forced to spend an additional hour or more this morning driving on the 210 through the worst of the smoke out past Sylmar only to need to turn around and drive back through the heavy smoke to return to our original destinations. After almost a day of issues, there is still no signage on the 210 Freeway indicating any closures. Easily one of approximately 20 CalTrans vans I saw blocking exits this morning could have been better used to pull a trailer with closure signage.

I get the need to evacuate the area and close roads, but why not close them at the surface street level? This would allow travelers to turn around and reroute instead of being unnecessarily forced to spend one or more hours in both heavy traffic and heavy smoke. If there aren’t enough resources to do this at every exit, why not at least one or two of them to alleviate the additional and unnecessary back and forth?

I noticed at least four accidents–which I’m sure is at least 3 standard deviations from the average–on this stretch of freeway, which I hope were small fender benders. I would posit that these were all caused as a result of (frustrated and distracted) people simply trying to exit and turn around. This stresses the EMS system further by requiring the additional response of police, ambulance, fire and other first responders. I saw at least one firetruck at such a scene this morning, which I’m sure could have been better deployed against low containment numbers in highly populated areas being threatened by fire.

I saw people attempting to go the wrong way down on ramps simply to access surface streets to turn around. I saw dozens of cars (far more than usual) pulled over on the side of the road attempting to figure out the predicament. At least one driver in a similar situation this morning was forced to cope with running out of gas as the result of lack of communication. I stopped at at least two exit ramps in an attempt to get information from CHP officers, none of whom had any information about where or how to turn around. They literally knew nothing except that they could not let me pass at that point. (To me this is painfully inept communication at a time when communication could be saving lives, and multiple hours after these issues should have long since been anticipated.)

If they’re going to pull the public safety card, local and state government should simply close the entire 210 freeway from the 2 North to past Sylmar. If they can’t do this they should do local street closures to allow constituents to exit the freeway to turn around and find alternate routes back and around instead of simply being stuck (due to the lack of zero signage) and put further in harms way.

Additionally, if CalTrans hasn’t figured it out yet, there’s also a very frequently used traffic app called Waze that can be quickly edited to indicate road closures that will drastically help to mitigate traffic issues in and around the area to prevent a lot of the problem. Because Google owns Waze and shares data, it also means that Google Maps, another popular navigation application, will also further mitigate the traffic and ancillary public safety issues. I don’t think that any of the closures I saw this morning were marked on either platform. (Nota bene to Waze/Google Maps, in high traffic areas like Southern California, I’m surprised that your systems don’t intuit major closings automatically given the amounts of data you’re receiving back.)

I hope that from an executive standpoint state and local systems will have their resources better deployed for this evening’s commute. I can’t help but note that these aren’t the first large fires in the Southern California area, so I’m shocked that the response isn’t better managed. Better managing small seeming issues like these could allow resources that have to be deployed to remedy distal issues like them to be better deployed to the proximal issues.

If they can’t manage to fix these issues in the near term, I hope they’ll at least file them into their future emergency plans for what are sure to be future incidents.

Syndicated copies to:

Virtual Homebrew Website Club Meetup on December 13, 2017

Join some like-minded people in building and updating your personal website.

This is a Virtual HWC for IndieWebbers who either can’t make a regular meeting or don’t yet have critical mass to host one in their area. Everyone is welcome to participate remotely!

Virtual Homebrew Website Club Meetup on December 13, 2017
Time:  to
Location: Online via Google Hangouts (link is posted and live)

Details

Join a community with like-minded interests. Invite friends that want a personal site.

  • Work on your IndieWeb Resolutions for 2018
  • Finish that blog post you’ve been working on
  • Demos of recent IndieWeb breakthroughs
  • Share what you’ve gotten working
  • Ask the experts questions

A link to virtual meetup on Google Hangouts will be posted on the day of the event. Check back before the meeting to get the link: https://hangouts.google.com/call/0JCH5b875C2UNseSnfkxAAEE

Optional quiet writing hour: 19:30–20:30 ET (16:30-17:30 PT)
Meetup: 20:30–21:30 ET (17:30-18:30 PT)

The IndieWeb is a growing people-focused alternative to the ‘corporate web’.

Skill levels: Beginner, Intermediate, Advanced

Keep in mind that there is often a European virtual meetup if those times work better for your schedule.

Any questions? Need help? Ask in chat: http://indiewebcamp.com/irc/today#bottom

RSVP

Add your RSVP in the comments below; by adding your indie RSVP via webmention to this post; or by RSVPing yes to one of the syndicated posts below
Indieweb.org event: https://indieweb.org/events/2017-12-13-homebrew-website-club#Virtual_Americas
Facebook.com: https://www.facebook.com/events/169650146961455/
Meetup.com: https://www.meetup.com/IndieWeb-Homebrew-Website-Club-Los-Angeles/events/245539015/

If your site doesn’t support sending webmentions yet, you should be able to create a post on your website with the following HTML:

<div class="h-entry">
RSVP <span class="p-rsvp">yes</span>
to <a href="http://boffosocko.com/2017/11/30/virtual-homebrew-website-club-meetup-on-december-13-2017/" class="u-in-reply-to">Virtual Homebrew Website Club Meetup on December 13, 2017</a>
</div>

Then put the permalink URL for your post into the webmentions box in the comments section. My site should be able to parse your URL and display the response. (Naturally, you can also change your response to “no” or “maybe” depending on your ability to attend.)

(I think this may be my first indie event that I’ve posted to my WordPress site.)

Syndicated copies to:

OPML files for categories within WordPress’s Links Manager

Last week I wrote about creating my following page and a related OPML file which one could put into a feed reader to subscribe to the list itself instead of importing it. I haven’t heard anyone mention it (yet), but I suspect that like I, some may be disappointed that some feed readers that allow OPML subscriptions don’t always respect the categorizations within the file and instead lump all of the feeds into one massive list. Fortunately there’s a quick remedy!

WordPress in its wisdom used a somewhat self-documenting API that allows one to create standalone OPML files by category. Thus if you only want to subscribe to just the feeds categorized as IndieWeb related in my OPML file, you can append the category id to the end of the URL to filter the others out.

The main OPML file: http://boffosocko.com/wp-links-opml.php
The IndieWeb only file: http://boffosocko.com/wp-links-opml.php?link_cat=1521

So in general, for WordPress sites one can append ?link_cat=[category id] (with or with out the brackets) to the main URL for the OPML file typically found at http://www.example.com/wp-links-opml.php.

I was going to post about this later this week after running across it this weekend, but by odd serendipity, while I was subscribing to Henrik Carlsson’s site I noticed that he posted a note about this very same thing recently! Thanks for the unintended nudge Henrik!

For quick reference, below are links to the specific OPML files for the following categories within my larger OPML file for those who’d like to subscribe to subsections:

Syndicated copies to:

A Following Page (aka some significant updates to my Blogroll)

The humble blogroll is long overdue for some updates in form and functionality on the open web.

I’ve been slowly but surely working on compiling a list of people I’m following online. In older iterations of the web, this would have been known as a blogroll, but I think it’s time to update the concept and potentially add some new features and functionality to it. It’s also time to upgrade its status on my site, so I’m moving it from a widgetized sidebar area on my front page to its own page under my “About” menu.

Why

Information Overload

As a member of more social sites that I have desire to count, I’m often overwhelmed with email, text, and other notifications from many of them. When I do dip into their streams, I sometimes find some reasonable value, but, more often that not, I’m presented with a melange of advertisements and somewhat meaningless and context-less posts that are more like addictive fat, sugar, and salt than healthy protein and complex carbohydrates.

I’ve read books like Clay Johnson’s Information Diet: a Case for Conscious Consumption and P.M. Forni’s excellent Thinking Life: How to Thrive in the Age of Distraction which describe an overwhelming media and online social atmosphere with some prescriptive measures for cutting down on the noise. More people obviously need this type of advice and I’m regularly thinking about how to cut down on the noise and get more valuable signal out of my online tools.

An Inventory of Sources

As a result of all this noise from too many sources and social platforms, I’ve found that having a manifest or complete inventory of all my online reading sources can be immensely valuable. It will make it easier to see what I’m reading and consuming on a regular basis and therefor easier to prune or update this list based on how often I’m reading these sources compared to the value I’m getting out of them.

I can look at the titles of the sources and better get a feel for exactly what I’m consuming and possibly how much. Those I don’t read as often can be pruned out of the list or can serve as a reminder of why I wanted to add them in the first place and what I wanted to get out of them.  Better that I be nagged to read things I know I’ll get value out of than defaulting to the fast food-esque fluff that, like many others, I turn to on Facebook, Twitter, and Instagram because it’s “easy” to consume.

I’ve also now compiled a year’s worth of reading data for things that I’ve read online. I’ve saved links to literally everything I’ve read in the past full calendar year to my website (though I only choose to show a subsection of those links to the public). This has given me a more solid data set of what I’ve read and interacted with to better guide my decisions about what I should put on the list and what I shouldn’t.

Notifications

As for the notification overload, by moving some of my reading onto my site via the excellent PressForward reader, I can drastically cut down on the number of notifications I get in email or via phone. I can more directly control exactly which notifications (and when they’re sent) that are originating from my own website.

Fighting Algorithms (and winning!)

Over the past few years, we’ve seen the rapid rise of algorithms. In some cases they’ve provided worthwhile improvements to our lives, while in others they’re downright malicious and destructive. This has become drastically more apparent in the past year or so, and I invite those who aren’t aware of their dramatic effects on our lives to read Cathy O’Neil’s book Weapons of Math Destruction, which does a great job of outlining them for the lay person with no technical background.

Every day these black box algorithms are choosing more and more of what we read and consume. (The only thing worse than the lack of a free press coupled with government controlled media is a corporate algorithmically controlled media which gives you the illusion of freedom.) Because most companies that are using these algorithms in the social space are doing so to keep us more “engaged” and on their sites for longer and clicking their ads with out any transparency, I can no longer trust them. My goals and ideals when reading online content are drastically different than theirs. I want to become more informed, challenged, and made to think. I don’t want their programmatic “reversion to the mean” forcing me to read more memes, jokes, political vitriol, and useless content.

To fight these algorithms, particularly those found in Facebook and to a lesser extent in Twitter, I’m going to cut them off at the knees and consciously choose a set of specific streams to read and engage with. Because I control what goes in to the system, I’ll know exactly what comes out. To touch on the food analogy again, when I cook for myself, I know exactly what the ingredients are and can thus eat a more healthy and well-balanced diet compared to going out and eating fast-food where I’m not ever quite sure if the “beef” is really beef, much less if it’s safe. Yes, I’ll say it, I’m going to go both organic as well as farm-to-table in my online social life.

Twitter thought experiment

Initially I had contemplated declaring Twitter bankrupcy. It seemed like a brilliant and cathartic-ly wonderful idea! But cleaning out my Twitter feed to a much smaller subset ultimately seemed like way too much work. I can only think about the hours and hours of time I’ve spent even creating and categorizing Twitter feeds into lists on my account. (Fortunately others can also follow those curated lists to find some value, so it’s not a total loss.) Starting over again from scratch on my main feed seemed untenable. Even if I did clean it all out, I would potentially have a better feed, but it’s still a feed on a  silo which I don’t own or control and it doesn’t have any effect on needing to repeat the same work on dozens of other silos. Heavy pruning and weeding within someone else’s walled garden seemed like a painful and unscalable time-suck that I would potentially need to repeat on an ongoing basis. It’s akin to the sharecropping of content that I had previously been doing for them and refuse to continue to do so.

The better option seems to be to use open web technologies to create and maintain my own personal list. It’s something I own and can control. I can update it as often as I want. Even better, I only need to do it in one place instead of dozens and the results can be distributed across multiple sites almost instantaneously!

As I’ll also discuss below, my open list is still easily shareable and modifiable by others. So I’m not accruing benefits just to myself, but my work can become scale-able and usable by others.

What

So I’ve gone back to some of the original web technology including blogrolls and OPML files.  I’ve created a Following page where I’m going to share my data. Here’s that page: http://boffosocko.com/about/following/

Context

In creating my list I wanted to go above the traditional blogroll and add additional context that most of them often didn’t originally have. I’ve tried to add a photo, logo, or  avatar of some sort for all the sources to provide some visual context. I’ve also added either a description of the site or a snippet from the site’s owner to give an idea of what it is about (in addition to categorizing them by one or more tags) as well as an optional reason why I’m following them. I’ve also included a link to the site as well as an RSS, atom, or h-entry feed for the site to make subscribing easier for others. Where appropriate, I’ve added the microformats XFN data to these sites as well so others will have an idea of my relationship to those entities or people I’m following. Disclosure is a good thing, right? Just ask a journalist. (Viewing this last part is currently only available via parsers or by viewing the page source within a browser, but it’s there for potential future use.) In aggregate, these bits of context are not only valuable for page viewers who are considering subscribing/following them for themselves, but they also make a statement about me as a reader, a topic I’ll touch on further below.

Promotion of position: from sidebar to a full page

Given the value of social following/friending in the past decade, it’s long overdue to promote the old-school blogroll, which was traditionally placed in a diminutive position in one’s sidebar, to a more prominent position on its own page (or others may even choose to span it over multiple pages).

Social media platforms do their best to hide our social graphs from us thereby making more of what they do seem magical. Many have even bent over backwards to prevent other possibly competing social startups from leveraging our own social graphs on their platform to help build them up. Just where do they think that data came from initially? It came from me! I own it and should continue owning it.

To that end, my follow list in some sense is an implicit statement of me owning that data once again. While it may take me a bit to import and arrange it all, I’ll have ownership and agency over it. Perhaps an outside service may want pieces or parts of it, and in some cases having it open and portable may provide continued future value to me.

As an analogy for what this means, think back to the days of arduously making mix tapes in the 80’s. You’d spend hours and hours diligently copying and pasting songs together onto a cassette tape to give to a favored someone. The gift usually meant more than just the songs on the tape. This type of thing is far easier now with digital music services to the point of devaluing part of the original meaning of a mix tape. However, almost no modern music service will allow you to take your hand-crafted playlists out of their service to other competing services to make it easier to switch from something like iTunes to Amazon Music or Google Music. It’s painful and annoying in an age chock full of digital exhaust. I’m hoping that my open following list might be a lot like the portable digital music play list I wish I had.

Identity

I’m placing my follow list as a submenu item underneath my “About Me” page. Why? On most social networks there are a few simple fields, typically in a profile or on an explicit profile page, which give others some basic data about who the account holder is and what they do. Often people use this data to make relatively quick decisions about whether they should follow (or follow back) another person. Sadly I’m of the opinion that the amount and richness of the data on these pages is too sparse to be of much use. Fortunately by owning my own site, I can remedy this problem for others who visit it.

My website has thousands to potentially hundreds of thousands of posts. What data can I easily provide people who are interested in learning more about me without reading the whole book as it were? My About page is a good quick place to start, but it can’t necessarily give the whole picture. I’ve also got a few other sub-pages under my About page which helps to round out the snapshot picture of who I am. These include:

  • my /now page, which tells others what I’m up to most recently, but at a higher level than reading a month’s worth of status updates;
  • my /Favorites page, which is a list of some of my favorite things and things I use on a regular basis; it’s not dissimilar to a “What I’m Using” page or regular posts concept;
  • my /Bucketlist page, which is a list of some things I’ve done or would like to do before I “kick the bucket”;
  • my /Social Media (or as I call it, my rel=”me”) page, which is a list of my too-many-presences on other social platforms;
  • I’ve also recently added an  /AMA or Ask Me Anything page, so that if there’s something pressing you need to know that isn’t written or find-able on my site, you can easily ask it.

Finally, there’s now also a source for others to quickly see what I’m regularly reading and find valuable enough on the web to have created a list of it all.

I think that in evaluating others, this last page (the following page) may actually provide the most value, and so I hope it does to others in return. I can’t help noting here how I’ll often judge others by which books they have on their shelves at home, or this great judgmental quote from John Waters:

“If you go home with somebody, and they don’t have books, don’t fuck ’em!”

I hope others I’m following will follow suit and create their own following pages as I’d honestly love nothing more than to know who and what they find valuable, and to be able to extract it quickly to add to my own list! The value of discovery here can be tremendous.

Intellectual Antecedents

I know that academics like to give credit to their sources when writing papers, though they often do so in explicit footnote form. Abstracted out to a more general form, I’m hoping that my following page can also help to provide some meta data about which sources I regularly find valuable and which ones are most likely influencing me even if they’re not explicitly footnoted within my writings.

Benefit of following members of the IndieWeb

Having been using a version of my following page for a while, I’ve found one particularly nice feature of following people who are adherents of the IndieWeb movement. Because they’ve chosen to post on their own site first (and optionally syndicate to other silos), their internet presence is far more centralized for subscription and consumption. I don’t have to follow them on dozens of multiple social silos to attempt to capture all their content. I can subscribe in one place and get as much or as little as I like! You can do much the same with my site, which I’ve discussed in the past.

Now of course this isn’t the case for everyone yet, and there can be some exceptions (since not everyone owns every post-type yet nor has quit all their silos), but it does tremendously cut down on the noise, cruft, and duplicated messages that live on multiple platforms.

I’ve experimented in the past with following even a subset of researchers and their work online. The amount of time needed to catalog them all, find their various presences in sites like Facebook, Twitter, LinkedIn, Google+, Academia, ResearchGate, etc., etc. was painful, but then setting up notifications and creating a workflow was even worse–particularly since I want to read or see everything they’re putting out over time. I think I’d have been better off building them all custom websites to publish their content instead.

OPML means sharing

OPML really stands for Outline Processor Markup Language. It is an XML-based format and standard used for feed lists interchange. All this to mean that it’s a standardized specially formatted document that allows one to share all the data in it easily by means that make sense to certain machines that would want it.

The most common example is that most feed readers allow you to import and export OPML files (with the .xml extension) so that you can quickly and easily move all of your feeds from one reader to another. (This is kind of like the playlist analogy for music that I mentioned–it’s just a playlist, or readlist if you prefer, for feed readers.) This is great if you want to try out a or move to a new feed reader.

Even better, because you can find and save a copy of my list, others can easily port it into their feed readers and sample the things that I’m seeing and often reading.

But wait! There’s more…

Many modern feed readers are supporting OPML subscription functionality! (What’s that you ask?) It’s fine to download my OPML list and import it into your reader. But what happens when I update it next week with three new great sources and remove a dead feed that no longer works? You’re stuck missing out on the new stuff and have to manually find and remove the broken one yourself. Instead, if you’ve subscribed to my OPML in your feed reader, the reader knows the URL where my list lives and checks it frequently for updates so you don’t have to worry about syncing the changes yourself! Shazam! It’s now a lot like a shared/synced playlist for articles. For those who are familiar with Twitter lists and following those, it’s very similar to how those work, except in this case they’re open and work on multiple sites and apps instead of being stuck in a proprietary service.

How

Now the part you’ve been waiting for: How can I do this myself?

For those who are on WordPress, much of the base functionality is already built into WordPress core. Below I’ll provide a few means and tips for getting you most of the way while still having some flexibility in where and how you choose to display your particular version.

(For those not on WordPress, check out some of the details and documentation on the IndieWeb wiki and ask in their chat how you might go about doing it.)

Re-enable Links Manager interface

The code for the WordPress blogroll functionality was built into core and was known as the Links Manager, but it was removed in version 3.5 for new installs that didn’t have any pre-existing links. I’ll note that the functionality was removed in late 2012 long after social media had already begun to make functionality like blogrolls (and even blogs themselves) fall out of fashion.

Fortunately, while it’s now hidden for most, it can be brought back with one line of code. (Hooray for backwards compatibility!) You can bring this functionality back to your website by adding the following snippet of code into your theme’s functions.php file:

add_filter( 'pre_option_link_manager_enabled', '__return_true' );

You can do this manually in the administrative user interface of your WordPress install by going to Appearance » Editor, which will bring up your theme files. Then in the right hand sidebar there should be a link for editing your functions.php file. Cut and paste the line of code into the file on its own line and then click Update File.

That’s easy enough, but what do you do if you’re scared of code? (You shouldn’t be, by the way…) The same functionality can be brought back with the Link Manager plugin. Just download it in the admin UI under Plugins » Installed Plugins and click Add New at the top of the page. Search for the plugin name Link Manager to download and then activate. That’s it.

Note: some may worry at the fact that the details for this plugin include the warning words:

This plugin hasn’t been updated in over 2 years. It may no longer be maintained or supported and may have compatibility issues when used with more recent versions of WordPress.

On a scale of 1-10 for warnings, this one is really less than a 1. This has to be one of the simplest plugins in all of WordPress because it really only includes the single line of code above. There’s really almost nothing with it that could change, break, or need to be updated. It’s old, but it will work.

You’ve now re-enabled the Links Manager which will put a Links tab into your admin UI. You can click on it to start adding your links, feeds, photos, and data. The WordPress codex has great documentation for how to do this: https://codex.wordpress.org/Links_Manager

Within the admin UI you can now display a blogroll widget by going to Appearance » Widgets and moving the Links widget into one of the widgetizable areas in your theme.

Put your following list onto a page by itself

Sadly, because the Links Manager is so old and is now hidden, development on it seems to have long since stalled. This means you’ll require some simple code to get things working a bit better in terms of display. I’ll do my best to give you instructions for cutting and pasting with as little code as possible.

Plugin and Code

There’s a convenient plugin called Links Page which will get us most of the way. Go ahead and download and activate it. From the plugin interface, click the edit link for the Links Page.

The Links Page plugin displayed in the Plugin page of the WordPress admin UI.

The editor will pop up with the code for the plugin, which looks like this:

function linkspage($text) {
if (preg_match("|<!--links-page-->|", $text)) {
$links = wp_list_bookmarks();
$text = preg_replace("|<!--links-page-->|", $links, $text);
}
return $text;
}
add_filter('the_content', 'linkspage', 2);

In between the parenthesis for the function wp_list_bookmarks(), you’ll want to add something like the following code snippet I’ve customized for my following lists:

'categorize=1&category_orderby=count&category_order=DESC&orderby=rating&order=DESC&show_name=1&between= - &show_description=1&category_before=<h2>&category_after=</h2>'

Yours doesn’t necessarily need to be exactly the same, but it should reflect how you’d like your own list to look. To accomplish this take a look at the documentation and examples for this function to pick and choose among the options you’d like to display. You’ll just string the options together between two single quotes and separate them with an ampersand (&) as in my example above.

Caveat: Since we’ve done some “cowboy coding” here and modified the code directly in the plugin, we run the risk of the accidentally updating the plugin and overwriting our changes. I would suggest that this risk is fairly low given the simplicity of the plugin and the unlikelihood that it would need an update. More advanced WordPress users will know that the better option is to roll up all the code in the plugin and all their changes and put it into their functions.phpfile or just fork the plugin with a new name and go from there.

CSS for styling and display

You may want to put in a bit of CSS to modify how our following list is displayed on the page. Without some tweaks or taking some extreme care when uploading or linking to the photos/avatars, we may run into some display issues.

As a result I’ve added the following snippet of CSS to my theme’s style.css file:

ul.xoxo.blogroll > li > a > img {
width: 20px;
height: 20px;
}
ul.xoxo.blogroll li{
list-style-type: none;
}

You can accomplish this by going to Appearance » Editor in the admin UI and editing the file by cutting and pasting the segment above into it and clicking Update file when you’re done.

The Page itself

We’ve now got all the big pieces in place. If you haven’t already, add some data into the Links Manager (documented here). You then need to create a new page on your site in the admin UI. I’ve named mine Following, but you can name yours Blogroll, Links, or anything you’d like really–it is your site after all.

Next, as described in the instructions for the Links Page plugin add the following text into the body of your post:

<!--links-page-->

When you’re done, save the page. The plugin will then replace the text above with your following list based on the output properties you specified.

Optionally you may want to go to Appearance » Menus to modify your menu to show your follow page in your menu structure so people can easily get to it.

Other Options

Those who’d like a different way of doing all of the above might also consider trying out other blogroll-related plugins in the WordPress repository. There are likely some other excellent options and methods to accomplish some of this functionality in a way that’s acceptable for your needs.

Future

So where do we go from here? This is certainly not complete by any means and there could be additional functionalities built on top of and even beside all of this.

I haven’t delved into it deeply, but I know there are developers like Dave Winer who have created services like Share Your OPML which allow you to upload your own file and then get recommendations of similar feeds in which you might also have some interest. Services like this that take advantage of my open data to provide me with value in return could be truly awesome.

I’m sure others smarter than I will come up with better UI. I’d personally love to have a bookmarklet similar to SubToMe that allows me to quickly and easily scrape a page and post the data from a person’s site to my following list (SubToMe currently redirects one to third party readers instead.)

I’ve also been enamored by Colin Walker’s “webmention roll” in which he creates a blogroll of all the people who have interacted with his website via Webmention.

New functionality

The future might also bring increased ease-of-use as well as expanded functionality. I’m curious what value might be extracted by adding microfomats like h-cards to my follow lists? What could parsers do with a microformat like ‘p-following’ to more quickly create social graphs like Ryan Barrett’s Indie Map?

What might we expect with simpler formats than OPML, which could likely be done with microformat classes the same way that h-entry and h-feed have made supporting clunkier specs like RSS and Atom far easier?

I’m feeling itchy with all the potential possibilities…

Comments

I’d love to hear people’s thoughts and comments on the usefulness of any of the above. Is it something you’d attempt to do yourself? (If you attempted it, did it actually work?) What would you change? How could it be extended? What UI/UX improvements could be added? Other interactivity suggestions? How can the discoverability of such a thing be improved? What could be built on top of it all?

Also feel free to share your following pages, blogrolls, and OPML feeds in the comments below. Have you added your examples to the IndieWeb wiki to help others improve?

Are there people or sources missing from my following page that you’d recommend? (Keep in mind I’m far from done adding sources…)

A final thanks

Here’s a big thank you and h/t to all those who’ve been working on their own versions of this type of technology (either recently or for decades) including: Dave Winer (thanks for OPML by the way), Richard MacManus, Colin DevroeColin WalkerKhürt Williams, James Shelly, Bryan Alexander, Aaron Davis, and many, many others.
​​​​​

Syndicated copies to:

👻 ☠️ 🎃 Halloween flavored names on Twitter

Everyone I know has jumped on the Halloween bandwagon on Twitter and added one or more Halloween related emoji to their Twitter name. Jack-o-lanterns, ghosts, etc. abound. Some have even changed their names a bit to fit into the theme.

Some of my favorites:

@JordanUhl is now jordan ghoul 👻 ☠️ 🎃
@rachsyme‏ is now🎃 rachel slime 🎃
@VictoriaAveyard is Victoria Graveyard 🎃
@BrendonHope is 🎃 Abandon Hope 🎃
@spicer‏ is Christian Spider 🕷 🎃
@Juliet_Shen‏ is 🎃 Ghouliet Shen 🎃

Despite the fact that Halloween is my favorite holiday, and since retailers are already jumping the gun on Christmas, I thought I’d do the same. I’m changing my Twitter name to something like:

🎄Christmas🎄 🎅Aldrich 🎁

Syndicated copies to:

IndieWeb: The Book

For a quite a while I’ve been thinking about writing a book about the IndieWeb to provide a broader overview of what it is philosophically, how it works, how its community functions, and most specifically how the average person can more easily become a part of it.

Back in January Timo Reitnauer wrote Let’s Make 2017 The Year of the Indie WebI agree wholehearted with the sentiment of his title and have been personally wanting to do something specific to make it a reality. With the changes I’ve seen in the internet over the past 22 years, and changes specifically in the last year, we certainly need it now more than ever.

In large part, I’ve been inspired by the huge number of diverse and big-hearted developers who are an active part of the growing community, but specifically today I came across a note by Doc Searls, an email about the upcoming NaNoWriMo (National Novel Writing Month), and then a reminder about the 100 Days of IndieWeb project. This confluence of events is clearly my tipping point.

As a result, I’m making my 2018 IndieWeb resolution early. For the month of November, as part of NaNoWriMo, I’m going to endeavor to lovingly craft together a string of about 2,000 words a day on the topic of the IndieWeb to create a book geared toward helping non-developers (ie. Generation 2 and Generation 3 people) more easily own their online identities and content.

IndieWeb Generations Diagram by Amber Case (Caseorganic.com) as depicted on the IndieWeb Wiki

Over the past year, surely I’ve read, written about, or interacted with the IndieWeb community concretely in one way or another on at least 70 days. This sprint of 30 days should round out a 100 days project. To be honest, I haven’t necessarily posted about each of these interactions on my own site nor are they necessarily visible changes to my site, so it may not follow the exact requirements of the 100 Days of IndieWeb, but it follows the spirit of the creator idea with the hopes that the publicly visible result is ever more people adopting the principles of the movement for themselves.

I’ll focus the book primarily on how the average person can utilize the wealth of off-the-shelf tools of the WordPress content management system and its community–naturally with mentions of other easy-to-use platforms like Known and Micro.blog sprinkled throughout–to own their own domain, own their content, and better and more freely communicate with others online.

If you haven’t heard about the movement before, I’ll direct you to my article An Introduction to the IndieWeb, portions of which will surely inform the introduction of the book.

If you’ve recently joined the IndieWeb, I’d certainly love to hear your thoughts and stories about how you came to it, why you joined, and what the most troublesome parts have been so I can help direct people through them more easily–at least until there are a plurality of one-click solutions to let everyone IndieWeb-ify themselves online.

As a publisher who realizes the value of starting a PR campaign to support the resultant book, I’m also curious to hear thoughts about potentially launching a crowdfunding campaign to support the modest costs of the book, with profits (if any) going toward supporting the IndieWeb community.

I’m happy to entertain any other thoughts or considerations people have, so feel free to reply in the comments below, or better yet, reply on your own site and send me a webmention.

Syndicated copies to:

Video lectures for Algebraic Geometry

I originally made this compilation on May 31, 2016 to share with some friends and never got around to posting it. Now that I’m actually in the midst of a class on the topic, I thought I’d dust it off and finally publish it for those who are interested.

If you’re aware of things I’ve missed, or which have appeared since, please do let me know in the comments.

A List of video lectures for Algebraic Geometry

Some other places with additional (sometimes overlapping resources), particularly for more advanced/less introductory lectures:

Syndicated copies to:

Wilson Fire in my front yard

Apparently the forest fire started around 4 am on Mount Wilson and has been burning relatively steadily since.

This isn’t the closest fire to the house–that award goes to a medium sized brush fire about 8 doors down when I lived on Adams Hill in 2012, which was out in just a few hours–but it is the closest and the largest thus far. While it would take me about 3.5 hours to hike to the location of the fire, it’s because it’s located on a mountain and would take some winding mountain paths as well as a 4,700 foot climb. Sadly, most everything between us and the fire is all dry brush.

Fortunately today it’s not as hot or as windy as it has been here for the past month. Typically the winds have been to the North West this month, which would potentially serve to protect the house. The fire isn’t very close to residential neighborhoods (ours is the closest though), but there is an estimated $500 million in infrastructure and assets at the top of the hill as it is the home of the Wilson Observatory as well as a multitude of broadcast equipment for all of the major LA television and several radio stations.

Since at least 9am, I’ve been seeing a rotation of at least three helicopters and a large plane (747?) doing water drops on the hillside to battle the fire. Some of the photos above have these aircraft visible.

I still vividly remember the massive Station Fire in this area from August 2009 that still stands as one of the nation’s largest and significantly threatened the Observatory at the top of the hill above us. I was in San Diego the day the fire started and still remember the massive pyrocumulus cloud that I could vividly see the entire drive back home to Los Angeles.

Sadly, site deaths (thanks FriendFeed) have not preserved the photos, but here are a few tweets almost a week apart about the original:

Updates

4:00 am Fire reported
8:00 am 26 acres burning and 0% contained
9:00 am the blaze had burned about 30 acres and and was 5 percent contained, according to the U.S. Forest Service
4:00 pm No visible smoke apparent from the Pasadena side facing North, but the fire is still blazing
9:00 pm No visible fire from the Pasadena side still, but fire is still at 30 acres and 25% containment

News articles

Syndicated copies to:

Using Facepiles in Comments for WordPress with Webmentions and Semantic Linkbacks

An update to an IndieWeb WordPress plugin now facilitates more streamlined conversations and interactions online

Today, through the brilliant and diligent work of David Shanske and Matthias Pfefferle (as well as Ashton McAllan and many other opensource contributors), I’ve enabled facepiling for likes, reposts, and mentions within my website’s comment section using the Semantic Linkbacks plugin for WordPress (in conjunction with the Webmention plugin.)

What does this mean? My personal website both sends and accepts Webmentions, a platform independent “at mention” or @mention, including those from the fantastic, free service brid.gy which sends replies/comments, likes, reposts, and mentions to my site from silo services like Facebook, Twitter, Instagram, Google+, and even Flickr.

As I’ve long known, and as someone noted at least once on my site, some of these likes, replies, and mentions, which provide some interesting social interaction and social proof of a post’s interest, don’t always contribute to the actual value of the conversation. Now with this wonderful facepiling UI-feature, I’m able to concatenate these types of interactions into a smaller and more concentrated section at the bottom of a post’s comments section, so they’re still logged and available, but now they just aren’t as distracting to the rest of the conversation.

Compare the before and after:

Before

A mention, a Facebook like, another mention and a repost on Twitter. Anil’s comment is pretty useful, but the others don’t add as much to the ideas in the post.
Richard MacManus “liked” the post and subsequently wrote about it on AltPlatform (relatively useful) along with some tangential mentions, which don’t add as much to the conversation. The raw URL of Gisele’s Twitter post likely looked better natively on Twitter (as a Twitter Card), but translated onto my site as a mention like this, just isn’t as useful.

After

Likes and Reposts concatenated on my site now after converting them into facepiles. They still give the social “proof” and indicate the interaction, but don’t interfere in the conversation now–especially when there are hundreds of them.

 

A Prime Example

In particular, this functionality can best bee seen on my article The Facebook Algorithm Mom Problem, which has over 400 such interactions which spanned pages and pages worth of likes, reposts, and mentions. Many of my posts only get a handful of these types of interactions, but this particular post back in July was overwhelmed with them when it floated to the top of Hacker News and nearly crippled my website. Without the facepile functionality, the comments section of this post was untenably unreadable and unusable. Now, with facepiles enabled, the comments are more quickly read and more useful to those who are interested in reading them while still keeping the intent.

Implementing

For those who have already begun Indiewebifying their WordPress sites with plugins like Webmention and Semantic Linkbacks, the most recent 3.5.0 update to Semantic Linkbacks has the functionality enabled by default. (Otherwise you can go to your administrative dashboard and click on the checkbox next to “Automatically embed facepile” located under Settings » Discussion).

Settings interface for enabling or disabling facepiles in your comments section with Semantic Linkbacks (and Webmentions)

As a caveat, there’s a known bug for those who are using JetPack to “Let readers use WordPress.com, Twitter, Facebook, or Google+ accounts to comment”. If the facepiles don’t show up on your site, just go to your JetPack settings (at yoursite.com/wp-admin/admin.php?page=jetpack#/discussion) and disable this feature. Hopefully, the JetPack team will have it fixed shortly.

If you haven’t begun using IndieWeb principles on your WordPress website, you might consider starting with my article An Introduction to the IndieWeb, which includes some motivation as well as some great resources for getting started.

Nota bene: I know many in the WordPress community are using the excellent theme Independent Publisher, which already separates out likes, mentions, etc. (though without the actual “facepiles”), so I’m not sure if/how this functionality may work in conjunction with it. If you know, please drop me a note.

Hopefully most WordPress themes will support it natively without any modifications, but users are encouraged to file issues on the plugin if they run across problems.

Using another platform?

I’m not immediately aware of many other CMSes or services that have this enabled easily out of the box, but I do know that Drew McLellan enabled it (along with Webmentions) in the Perch CMS back in July. Others who I’ve seen enabling this type of functionality are documented on the IndieWeb wiki in addition to Marty McGuire and Jeremy Keith, who has a modified version, somewhat like Independent Publisher’s, on his website.

There are certainly many in the IndieWeb community who can help you with this idea (and many others) in the IndieWeb’s online chat.

Give it a spin

Now that it’s enabled, if you’re reading it on my website, you can click on any of the syndicated copies listed below and like, retweet/repost, or mention this article in those social media platforms and your mention will get sent back to my post to be displayed almost as it would be on many of those platforms. Naturally comments or questions are encouraged to further the ongoing conversation, which should now also be much easier to read and interact with.

Thanks again to everyone in the IndieWeb community who are continually hacking away to allow more people to more easily own and control their content while still easily interacting with people on the internet.

UPDATE

Turning mentions into comments for native display

Following Aaron Davis’ comment, I thought I’d add a few more thoughts for those who have begun facepiling their likes, mentions, bookmarks, etc. As he indicates, it’s sometimes useful to call out a particular mention, a special like, or you might want to highlight one among the thousands for a particular reason. This is a feature that many are likely to want occasionally and code for it may be added in the future, but until then, one is left in the lurch a bit. Fortunately, as with all things IndieWeb, part of the point is having more control over your site to be able to do anything you’d like to it. So for those without the ability to write the requisite code to create a pull request against the Webmention or Semantic Linkbacks plugins (they’re more than welcome), here are a few quick cheats for converting that occasional (facepiled or not) webmention into a full comment within your WordPress site’s comment section.

Pro tip: This also works (even if you’re not using facepiles) to convert a basic mention into something that looks more like a native comment. It’s also useful when you’ve received a mention that you’d prefer to treat as a reply, but which wasn’t marked up as a reply by the sending site.

I’ll use an example from the Facebook Algorithm Mom Problem post referenced above. On that post, I’d received a webmention via Twitter from Anil Dash, a blogger and advocate for more humane, inclusive and ethical technology, with some commentary about usability. Here is his original tweet:

That webmention is now hidden behind an avatar and not as likely to be seen by more casual readers. I’d like to change it from being hidden behind his avatar in that long mention list and highlight it a bit to make it appear as a comment in the full comments section.

On a post with a large number of mentions, you’re very unlikely to find some of the valuable nectar hiding in them. Do you see Anil Dash’s lovely mug hiding among all these avatars? (Hint, it’s not a “blank” avatar caused by someone having changed their Twitter, Facebook, etc. avatar.)

Steps to convert a mention to a comment

Caution: I recommend reading through all the steps before attempting this. You’ll be modifying your WordPress database manually, so please be careful so you don’t accidentally destroy your site. When doing things like this, it’s always a good idea to make a back up of your database just in case.

  1. Search for the particular comment you want to change in the WordPress Admin UI.
  2. Hover over the date in the “Submitted On” column to find the comment ID number in the URL, in this case it’s http://boffosocko.com/2017/07/11/the-facebook-algorithm-mom-problem/#comment-35281. Make a note of the comment ID: 35281.
  3. Open up the mySQL database for your WordPress install (I’m using phpMyAdmin) to view the data for your site.
  4. Go to the wp_comments table in the database. (Yours may be slightly different depending on how your site was set up, but it should contain the word “comments”.)
  5. Use the search functionality for your table and input your comment ID number into the field for comment_ID.
  6. We’ve identified the specific comment we want to modify in phpMyAdmin.
  7. Now delete the word “webmention” from the comment_type field for the particular comment. This field should now be empty.
  8. You should now be able to view your post (be sure to clear your cache if necessary) and see the mention you received displayed as a native comment instead of a mention. It should automatically include the text of the particular mention you needed.
Here’s what the modified mention from Anil Dash looks like in my comments section now. It appears as if it were a native comment.

If you need to convert a large number of mentions into comments, you may be better off searching for the particular post’s post_ID in the comments table and changing multiple comment_type fields at once. Be careful doing this in bulk–you may wish to do a database back up before making any changes to be on the safe side.
​​​

Syndicated copies to:

Algebraic Geometry Lecture 1

For those who are still on the fence about taking Algebraic Geometry this quarter (or the follow on course next quarter), here’s a downloadable copy of the written notes with linked audio that will allow you to sample the class:

Algebraic Geometry-Lecture 1 notes [.pdf file with embedded and linked audio]

I’ve previously written some notes about how to best access and use these types of notes in the past. Of particular note, one must download the .pdf file and open in a recent version of Adobe Acrobat to take advantage of the linked/embedded audio file. (Trust me, it’s worth doing as it will be like you were there with the 20 of us who showed up last night!)

For those who prefer just the audio files separately, they can be listened to here, or downloaded.

Lecture 1 – Part 1

Lecture 1 – Part 2

Again, the recommended text is Elementary Algebraic Geometry by Klaus Hulek (AMS, 2003) ISBN: 0-8218-2952-1.

For those new to Dr. Miller’s classes, I’ve written up some hints/tips about them in the past as well.

Syndicated copies to:

Norm Peterson on Cheers invented the symbol for Bitcoin

Interestingly it didn't stand for digital currency, but a more familiar liquid one.

In the cold opening of Cheers, Season 9, Episode 23 “Carla Loves Clavin” aired on March 21, 1991, Norm Peterson (portrayed by George Wendt) invents the original definition of what would ultimately be adopted as the iconic symbol for Bitcoin. Interestingly at the time it didn’t stand for digital currency, but a more familiar liquid one.

Norm: Okay Rebecca. Um. Here’s the deal, I’ll paint the whole office including woodwork, and uh, it’ll run you 400.
Rebecca: 400 bucks sounds reasonable.
Norm: Oh no, that’s 400 beers, the B with the slanty line through it, it’s kinda my own special currency.

Norm invents the definition of the letter B with a slash through it. Hint: It doesn’t mean Bitcoin.

(Featured image credit: Jason Benjamin)

Syndicated copies to:

Eclipse Photos August 21, 2017

A series of photos taken in Glendale, Los Angeles County on the morning of the eclipse of 2017

9:52 AM Pacific

10:01-02 AM

10:04 AM

10:11-12 AM

10:14 AM

10:19-20 AM

10:21-22 AM

10:23-24 AM

10:27 AM

Glendale, CA 91205

Syndicated copies to:

Post Kinds Plugin for WordPress

A WordPress plugin that allows you to easily create a huge variety of social media post types to own your social media life online.

Post Types

Within the broader social media world there are a huge variety of types of posts. These range from common articles to status updates to likes or favorites to more varied post types like photos, bookmarks, RSVPs, checkins, videos, reviews, jams, reads, audio, exercise, food, recipes, and even an exotic and rare chicken post type. While this list barely scratches the surface, the IndieWeb wiki has an almost exhaustive list along with examples.

Many social platforms sub-specialize in only one specific post type while others provide support for multiple types. Here are some common examples:

  • Twitter: status updates
  • Instagram: photos, videos
  • Facebook: status updates, articles, photos, videos, links, events, life events, checkins, emotions
  • LinkedIn: status updates, articles,  résumés
  • Tumblr: text, photo, quote, link, chat, audio and video
  • Swarm/FourSquare: checkins
  • Last.fm: listens (aka scrobbles)
  • Pinboard: bookmarks
  • GoodReads: reads

Wouldn’t it be better to have a single personal website where you could post all these types of content easily and quickly?!

For a few years now, I’ve been posting these and many other types of posts on my personal website. When it’s appropriate I crosspost many of them to the social media silos that support these types so that friends, family, and colleagues can subscribe to them in the way that’s easiest for them.

Post Kinds Plugin

The simple meta box the Post Kinds Plugin displays for choosing what kind of post one is creating.

The Post Kinds Plugin for WordPress attempts to make it much easier to create customized displays for and format each of these types of posts (and many more). It leverages the flexibility and power of WordPress to be your single social media hub while, along with other IndieWeb friendly plugins, still allowing you to interact with other social networks.

Post Kinds Plugin not only indicates in the metadata what each post type is, but provides each post with some contextualization as well as the appropriate microformats classes to make it easier for other sites or parsers to interpret these posts. In short it helps to make status updates look like status updates; favorites appear like favorites; (schnozzberrys look like schnozzberrys); and RSVPs look like RSVPs in keeping with common user interfaces on many social platforms. (And in case you didn’t know, you can now post an RSVP on your own website and send a notification to posts elsewhere on the web of your intention!)

Post Kinds Plugin is different from WordPress’s Post Formats functionality

This sounds a little bit like the WordPress theme specific functionality of Post Formats, doesn’t it? Yes and resoundingly no!

Post Formats was a WordPress feature introduced in version 3.1, ostensibly to compete with other social platforms like Tumblr which offers the explicit post types of text, photo, quote, link, chat, audio and video.

The interface for choosing particular post types from within Tumblr.
WordPress Post Format meta box with all of the available post types. Note that it’s far more limited than the options for Post Kinds.

Within WordPress, post formats are available for users to choose from if the theme enables support for them. And typically if they do support them they often provide specific display outputs and CSS styling that are controlled by the theme, often to make them look like what users have come to expect these post types to look like on other social media platforms. As an example, a “Status” post would typically display a short update which doesn’t include a title. Each theme that supports post formats chooses which ones they support, how to display them, and they can vary quite a bit from one theme to the next.

Below is the list of the nine supported formats with brief descriptions of their purpose taken from the WordPress codex:

  • aside – Typically styled without a title. Similar to a Facebook note update.
  • gallery – A gallery of images. Post will likely contain a gallery shortcode and will have image attachments.
  • link – A link to another site. Themes may wish to use the first <a href=” “> tag in the post content as the external link for that post. An alternative approach could be if the post consists only of a URL, then that will be the URL and the title (post_title) will be the name attached to the anchor for it.
  • image – A single image. The first <img /> tag in the post could be considered the image. Alternatively, if the post consists only of a URL, that will be the image URL and the title of the post (post_title) will be the title attribute for the image.
  • quote – A quotation. Probably will contain a blockquote holding the quote content. Alternatively, the quote may be just the content, with the source/author being the title.
  • status – A short status update, similar to a Twitter status update.
  • video – A single video or video playlist. The first <video width=”300″ height=”150″> tag or object/embed in the post content could be considered the video. Alternatively, if the post consists only of a URL, that will be the video URL. May also contain the video as an attachment to the post, if video support is enabled on the blog (like via a plugin).
  • audio – An audio file or playlist. Could be used for Podcasting.
  • chat – A chat transcript

There is anecdotal evidence that the WordPress Post Format functionality is slowly falling out of favor and there hasn’t been much, if any, change in how the feature works in the past several years.

The Post Kinds Plugin in many respects picks up where Post Formats left off, extends them significantly, and also builds a stronger platform for more modern website to website interactions.

Plugin Display

The Post Kinds Plugin out of the box generally does an excellent job of styling with some generic CSS to make these various post types look and behave as one expects without any changes or modifications to one’s theme. However, designers are more than welcome to either customize their CSS to their hearts’ content, or, if they prefer, they can manually code specific template views to override the plugin’s original views within their theme or child theme.

Microformats

Because, in part, the Post Kinds Plugin is designed for use with IndieWeb philosophies in mind, it has built in microformats support. What are microformats? They’re simple semantic classes added to the HTML of one’s site that allow parsers or other programs to read the data on your posts and pages to provide extended or increased functionality. WordPress’s core functionality already includes some microformats version 1 support; Post Kinds Plugin extends this quite a bit and uses the more modern version 2 specifications. Because Post Kinds takes care of these additional microformats, some older themes will have a leg up in the IndieWeb space despite having either limited or no theme support.

As an example using the reply post kind, the context from the site for which the particular post is actually a reply to is wrapped with the semantic class “p-in-reply-to”. As an example of the extended functionality provided by microformats, if one is using the Webmentions Plugin to send a webmention to the post that is being replied to, that remote site can parse the reply and display it properly as a reply in their comments section. (For WordPress sites receiving these webmentions, they can utilize the parser built into the Semantic Linkbacks Plugin.)

Similarly, bookmarklets, feed readers, or other programs could utilize these microformats and the data on your page to create customized views and displays.

Plugin Installation and Configuration

Installation of the plugin is relatively straightforward. From the Plugin tab in the WordPress admin interface, one can click the Add New button at the top of the page and either search for the plugin within the repository and install and activate it, or they can use the Upload Plugin button and install it from a prior download from either the WordPress repository or from the GitHub repository.

Options for installing the Post Kinds Plugin from the administrative interface within WordPress.

Configuration can be done from the Settings tab within the WordPress admin interface or, if the IndieWeb Plugin is installed, the settings can be found under IndieWeb » Post Kinds tabs in the admin interface.

Within the settings you can choose the post kinds you wish to enable on a particular site–not all sites will necessarily need or even want all types. I recommend only enabling the specific kinds you will actively be using; you can always come back and add additional types in the future. Some types may be enabled by other specific plugins that work in conjunction with Post Kinds Plugin.

Post Kinds Settings
Click the appropriate check boxes for the kinds of posts you’d like to enable on your personal website.

Not having a post kind enabled will not disable the functionality on existing posts, it only hides the selection in adding new posts. This way if you enable favorites as a type and only use it a few times before deciding to disable it, the old posts will still exist and display properly.

You can also enable a Default Kind for New Posts. Most people will likely choose Article which is the default, but if your site is primarily used like a microblog for short status updates, then obviously Note may be your best default. Are you building a linkblog? Then you could enable the Bookmark kind.

How to use Post Kinds in practice

So how does this all actually work for creating posts?

Let’s start with a simple example. Let’s say I read a lot online and I’d like to have a linkblog of all of the articles I read. Let’s say I’m reading the article Lyme Disease’s Worst Enemy? It Might Be Foxes in the New York Times. I’d like to start out by creating a read post to indicate to those following me that I’ve read this particular article.

While I could do it manually, typically I’ll use a custom bookmarklet (more on how to do this shortly), which I click on in my browser bar as I read the article. The bookmarklet will create a new WordPress post and automatically fill in the URL of the article into the “Post Properties” metabox created by the Post Kinds Plugin in the admin UI of my WordPress site.

The Post Properties meta box in the administrative user interface in WordPress. The URL for the post can be either automatically included or manually filled in.

Then, I will click on the blue Retrieve button (pictured above) just under the post’s URL. The Post Kinds Plugin will parse the New York Times article page for either explicit metadata or Open Graph data to fill in some context about the article I’m reading in the Post Properties meta box. The main tab will autofill with the Name/Title of the article, a Summary/Quote of the article, and Tags if available. Similarly the other tabs in the Post Properties meta box including Details, Author, and Other will fill in with any available metadata about the Lyme disease post I’m reading.

In this particular example, the Times didn’t do a good job on the author data, so I’ll go to that tab and manually cut/paste the author’s name into the Author/Artist Name field, their URL into the Author/Artist URL field, and (optionally) the URL for their photo image as well. If other fields are improperly filled out or you would like to change them, one can manually adjust them if necessary. Not all kinds need (or show) all theses metadata fields when they’re ultimately published.

After retrieving the metadata most of the appropriate fields in the Post Properties box should be filled out. Here we see the “Main” tab filled in.
The Details tab of the Post Properties meta box.
The Author tab of the Post Properties meta box.

The retrieve button will also attempt to fill in an appropriate post Title into the posts’ field for that, but it can be modified manually if necessary. On many post kinds, though one may fill in an explicit (traditional WordPress post) title, it may not display on the final post because an explicit title isn’t really needed and the Post Kinds Plugin won’t display it. The note kind is a particular example of this behaviour.

Now that the contextual part of the post I’m reading is handled, I can, if I choose, add any notes, quotes, thoughts, or other personal data about what I’ve read into the main text box for the particular post.

The bookmarklet should have automatically set the post kind selector in the Kind metabox to Read and, if available, the older WordPress post format to link. (These can be changed or overridden manually if necessary.) Post Kinds does its best to properly and appropriately map Post Kinds to Post Formats, but the relationship isn’t always necessarily one-to-one and there are obviously many more kinds available than there are post formats.

Finally, the article can be published (unless you want to add any additional metadata to your post for other plugins or needs.)

Now I can also go to the URL of my personal site at http://example.com/kind/read/ where I can find an archive of this and all the posts I’ve read in the past.

A screen capture of what the final “Read” post looks like on my site. (Note that it may look slightly different depending on your theme and other customizations.)

Other post kinds work relatively similarly, though some may take advantage of other appropriate metadata fields in the Post Property meta box. (For example RSVPs use the RSVP dropdown field within the Other tab in the Post Property box.)

Custom feeds for Post Kinds

For sites adding lots of different post kinds all at once, the extra possible “noise” in one’s RSS feeds may have the potential to turn a site’s subscriber’s off. Fortunately the plugin also has custom RSS feeds for each of the particular post kinds which follows a particular format. As an example, the RSS feed for all the posts marked as “Note”,  could be found at either the URL http://www.example.com/kind/note/feed
or http://www.example.com/feed/?kind=note (if one doesn’t have pretty permalinks enabled). Other feeds can be obtained by replacing “note” with the base names of the other kinds (reply, article, etc.).

Archive Displays

Post Kinds Plugin also handles the display of archives for individual post kinds. To view all the posts marked as notes, for example, one could visit the URL http://www.YOURSITE.COM/kind/note/. Simply replace YOURSITE.COM with your particular site name and the particular post kind name to access the others. In some areas of the social media world, this particular archive display of notes might be considered a personal Twitter-like microblog.

Bookmarklet Configuration

For Post Kinds Plugin users who like the simplicity and ease of use of bookmarklets, one can add ?kindurl=URL to their post editor URL and it will automatically fill this into the URL box in post properties. Adding ?&kind=like to the post editor URL will automatically set the kind.

As a full example, the URL pattern https://www.example.com/wp-admin/post-new.php?kindurl=URL&kind=like will automatically create a new post, set the post kind as like and auto-import the permalink URL for the page into the URL field of the Post Properties meta box.

The following code could also be used as a template to create a full set of browser bookmarklets. (Keep in mind the base URL example.com will need to be changed to the base URL of your personal site for it to work properly. One would also change the word bookmark in the code to any of the other types.)

javascript:(function(a,b,c,d){function e(a,c){if("undefined"!=typeof c){var d=b.createElement("input");d.name=a,d.value=c,d.type="hidden",p.appendChild(d)}}var f,g,h,i,j,k,l,m,n,o=a.encodeURIComponent,p=b.createElement("form"),q=b.getElementsByTagName("head")[0],r="_press_this_app",s=!0;if(d){if(!c.match(/^https?:/))return void(top.location.href=d);if(d+="&kindurl="+o(c),c.match(/^https:/)&&d.match(/^http:/)&&(s=!1),a.getSelection?h=a.getSelection()+"":b.getSelection?h=b.getSelection()+"":b.selection&&(h=b.selection.createRange().text||""),d+="&buster="+(new Date).getTime(),s||(b.title&&(d+="&t="+o(b.title.substr(0,256))),h&&(d+="&s="+o(h.substr(0,512)))),f=a.outerWidth||b.documentElement.clientWidth||600,g=a.outerHeight||b.documentElement.clientHeight||700,f=800>f||f>5e3?600:.7*f,g=800>g||g>3e3?700:.9*g,!s)return void a.open(d,r,"location,resizable,scrollbars,width="+f+",height="+g);(c.match(/\/\/(www|m)\.youtube\.com\/watch/)||c.match(/\/\/vimeo\.com\/(.+\/)?([\d]+)$/)||c.match(/\/\/(www\.)?dailymotion\.com\/video\/.+$/)||c.match(/\/\/soundcloud\.com\/.+$/)||c.match(/\/\/twitter\.com\/[^\/]+\/status\/[\d]+$/)||c.match(/\/\/vine\.co\/v\/[^\/]+/))&&e("_embeds[]",c),i=q.getElementsByTagName("meta")||[];for(var t=0;t<i.length&&!(t>200);t++){var u=i[t],v=u.getAttribute("name"),w=u.getAttribute("property"),x=u.getAttribute("content");x&&(v?e("_meta["+v+"]",x):w&&e("_meta["+w+"]",x))}j=q.getElementsByTagName("link")||[];for(var y=0;y<j.length&&!(y>=50);y++){var z=j[y],A=z.getAttribute("rel");("canonical"===A||"icon"===A||"shortlink"===A)&&e("_links["+A+"]",z.getAttribute("href"))}b.body.getElementsByClassName&&(k=b.body.getElementsByClassName("hfeed")[0]),k=b.getElementById("content")||k||b.body,l=k.getElementsByTagName("img")||[];for(var B=0;B<l.length&&!(B>=100);B++)n=l[B],n.src.indexOf("avatar")>-1||n.className.indexOf("avatar")>-1||n.width&&n.width<256||n.height&&n.height<128||e("_images[]",n.src);m=b.body.getElementsByTagName("iframe")||[];for(var C=0;C<m.length&&!(C>=50);C++)e("_embeds[]",m[C].src);b.title&&e("t",b.title),h&&e("s",h),p.setAttribute("method","POST"),p.setAttribute("action",d),p.setAttribute("target",r),p.setAttribute("style","display: none;"),a.open("about:blank",r,"location,resizable,scrollbars,width="+f+",height="+g),b.body.appendChild(p),p.submit()}})(window,document,top.location.href,"http:\/\/example.com\/wp-admin\/post-new.php?kind=bookmark");

Development / Issues

Development for the Post Kinds Plugin takes place on GitHub. While users can certainly report issues/bugs on the page for the WordPress plugin, the developer actively watches the issue queue on GitHub and problems will be seen (if not resolved) there more quickly.

List of available Post Kinds

Now that we’ve seen a few examples and gotten things set up, let’s take a brief look at all of the Post Kinds that are available. To make things a bit easier, we’ll break them up into four groups based on some shared qualities.

The Non-Response Kinds

These kinds have an analog in WordPress’s original post formats. Adding context to one of these may make it a passive kind.

  • Article – traditional long form content – a post with an explicit post title
  • Note – short content or status update – a post with just plain content and usually without an explicit post title
  • Photo – a post with an embedded image as its primary focus. This uses either the featured image or attached images depending on the theme.
  • Video – a post with an embedded video as its primary focus
  • Audio – a post with an embedded sound file as its primary focus

The Response Kinds

Response kinds differ from the non-response in that they are usually intended to be interactions with other external sites. For the best experience and improved functionality with these post kinds, it is recommended, but not required, that one have the Webmentions and the Semantic Linkbacks Plugins installed and activated. Doing so will send notifications of the replies and other interactions to those external sites which often display them. (These help your site work just like replies and mentions do on many other social media platforms, they just do so in distributed ways, so that neither you nor your friends necessarily need to be on the same platform or content management system to communicate.)

  • Reply – used for replying to someone else’s post
  • Repost – a complete repost of someone else’s content
  • Like – compliments to the original post/poster
  • Favorite – content which is special to the favoriter
  • Bookmark – this is basically sharing/storing a link/bookmark.
  • Quote – quoted content
  • RSVP – a specific type of reply regarding attendance of an event

The Passive Kinds

To “Scrobble” a song is to make a related post on your website when listening to it. This is the most well-known example of a passive kind of post. These kinds are formed by having content in the context box on one of these types of posts.

  • Listen – scrobble – listening to an audio post
  • Jam – Indicates a specific personally meaningful song
  • Watch – watching a video
  • Play – playing a game
  • Read – reading a book, magazine, or other online material

Reserved Kinds

The following kinds are reserved for future use within the plugin but will not currently show up in the interface unless enabled directly within the code. In some cases, these kinds don’t have the appropriate metadata fields within the plugin to make them user friendly without significant work.

  • Wish – a post indicating a desire/wish. The archive of all of these posts would be a wishlist, such as a wedding, birthday, or gift registry.
  • Weather – a weather post would be about current weather conditions
  • Exercise – represents some form of physical activity
  • Trip – represents a trip or journey and would require location awareness
  • Itinerary – refers to scheduled transit, plane, train, etc. and does not generally require location awareness
  • Check-In – identifying you are at a place. This would use the extended WordPress Geodata. It will require the Simple Location Plugin or something equivalent to add location awareness to posts. Some people are beginning to use this with the OwnYourSwarm application, which may require further configuration of your site to work properly.
  • Tag – allows you to tag a post as being of a specific tag, or person tagging.
  • Eat – for recording what you eat, perhaps for a food diary
  • Drink – similar to Eat, but for beverages
  • Follow – a post indicating you are now following someone’s activities (online)
  • Mood – feelings or emotions you’re having at the time of posting
  • Recipe – ingredients and directions for preparing food or other items
  • Issue – an article post that is typically a reply to some source code, though potentially anything at a source control repository
  • Event – a post kind that in addition to a post name (event title) has a start datetime, (likely an end datetime), and a location.

Additional Examples

If you’re reading this on my personal website, you can click on and view a variety of these post kinds described above to give you an idea of what they look like (and how they function with respect to Webmentions and other IndieWeb functionalities).

Go Forth and Post All the Things!

I’ve tried to cover as much of the basics of the plugin and provide some examples and screenshots to make things easier, but as always, there are ways to do additional custom configuration under the hood. I’m sure there are also off-label uses of the plugin to get it to do things the creator didn’t intend.

For additional details, one is certainly encouraged to skim through the code. If you have specific questions or problems, you can usually find the developer of the plugin and many of its users in the IndieWeb chat (web chat, IRC, Slack, etc.) for possible real-time help or support, or you can post questions or issues at the GitHub repo for the project.

Post all the things

Thanks

Special thanks to David Shanske for creating and doing a stellar job of maintaining the Post Kinds Plugin. Additional thanks to those in the IndieWeb community who continue to refine and revise the principles and methods which make it constantly easier for people to better own and control their social lives online by owning their own websites and data.

​​​

Syndicated copies to: