It's coming along nicely. So far, I've imported all existing webmentions from webmention.io and stored them locally alongside my post storage. So if my post is stored in
/2018/11/15/5/post.md then my webmentions would be stored in
/2018/11/15/5/mentions/ each webmention is stored as a
.json file with the source url being the filename. This allows for one webmention per file and if I want to load all the webmentions for a specific post, I just open up all the files in the mentions directory. So far, I'm really liking this and how well it's working.
If it's a homepage mention, it will save the webmention in
/mentions/homepage/ and if it's not a known post, right now it will collect the webmention in
/mentions/unknown. Again, all of these webmentions are stored as individual files. If I recieve an updated webmention, it overwrites the file, so I get the updated information.
Besides just downloading all existing webmentions, I have also added support so that when webmention.io receives a new webmention, it pings my server and my server will go ahead and download that webmention and save it locally. This means that I am now only relying on webmention.io to deliver my webmentions, not for any long-term storage.
Finally, I've added support for displaying webmentions on post pages. I used to have this when my website was powered by Jekyll, but when I moved to a dynamic website, I didn't bother adding that functionality back until I could do it the way I wanted it. Now that I have my local storage I was able to go back to displaying them. Below is a screenshot of the webmention displays on one of my posts:
I'm still trying to tweak exactly how I want things, but I am pretty happy with things for a first pass. I am avoiding "metrics numbers" so instead of display any totals, I am trying to just display the content. Instead of showing 5 "likes" I would just display 5 👍 and of course each reacji will display on it's own as well.
I am not currently displaying mentions for posts when they display on feed pages. I am thinking I might just display a row of emoji representing that last 10 responses. If they are reacji, it would display the reacji, for the rest I would translate the response types to the following emojis: likes 👍, replies 💬, repost ♻️, bookmark 🔖 , listen 🎧, mentions 💭. It would show a recent snapshot of activity on a post without giving in to numbers.
I also am not doing any moderation of posts currently, every webmention automatically gets added and displayed. I can delete a webmention, of course, but there are protections against spam appearing until I delete it. I outlined how I want to deal with moderation, the 2nd level connections are going to be a bit tricky so my goal is to first just start with immediate connections as always accepted, others unlisted until I moderate. Then I'll need to create a mute/block list and have incoming webmentions check that list and respond appropriately.
Finally, if someone sends a webmention delete (a HTTP 410 Gone response from a webmention source url) right now I don't think my website will do anything, in fact, I don't even know if webmention.io supports them. I would like to be able to accept and process webmention deletes. My plan is not to actually erase a webmention that is "deleted" but instead, to set the visibility to private. I can of course, manually delete any private webmentions that I don't want any more.
Today, I've rolled out all of these changes on my website. I also altered the way my audience parameter works. Previously it embedded h-cards within each post with an audience. Now, all audience and person-tag h-cards are stored in my nickname cache first, and then I just put the h-card's uid within the audience array. This change was suggested by Sven in the IndieWeb chat and it was a smart move so I decided to go with that approach.
All in all, I'm very happy with how this turned out. I already added an h-card for a previous post's audience over Micropub and then added that url to the post so that it displays. It worked great! I also added support for retrieving a list of h-cards from the nickname cache by sending a
GET request to my Micropub endpoint with
This will allow me to build into my Micropub client a request to fetch my nicknames cache and display it to the user. The user will then allow me to select which cards I'd like to attach to a post's audience. The uids of those cards would then be added to the audience of the Micropub post. Feels like a pretty seamless experience to add audiences to my posts which is important because in the future I'll be utilizing audiences more as I begin to add support to my site for private posts.
I took a look at my IndieWeb goals and made a list of the things I want to have live on my website by January 1, 2019.
I used to display webmentions my posts received on the previous Jekyll incarnation of my website, but now that I've shifted my website to being dynamically rendered, I haven't rebuilt the webmention display code. I'd like to finish that.
I want to import all existing webmentions I've received to date and store them as JSON files in my post storage folders alongside my posts.
I also want to make sure that whenever my site receives a webmention that I immediately add that new webmention to the JSON files in my post storage folders.
Finally, I want to display webmentions on post pages. I'm not sure if I'll include them on feed pages or not.
✅ Completed November 20, 2018
h-card based nickname cache: Currently my nickname cache is some random storage code and has to be edited by hand. I want my nickname cache to be saved h-card files and to be able to save new people to nickname cache by sending an h-card via Micropub.
Subscribe page: Add a Subscribe page like Aaron Parecki so that people can more easily choose what feeds they want to follow from my website.
If I am able to actually complete all the above goals, I'm going to shift my focus to owning my reading and figuring out if i can leave Goodreads behind.
Whenever my site receives a new Micropub post, it does a list of things. Two things that are important for this discussion. First, it pings my Compass server for my current location at the time connected with the post. Second, it uses the Dark Sky API to using the time of the post and my location at that time to get the weather information associated with that time and location and stores it with my post.
On each post page, in the meta data section, I show the weather information from the post. I list the "Feels like" temperature in Fahrenheit along with a weather emoji that shows the weather conditions. Most of the emoji's are what you would expect: ☀️ when it's a clear day, A ❄️ when it's snowing, ☁️ for cloudy and ⛅️ for partly sunny. However, using Dark Sky's weather information, I also have the current phase of the moon in each weather post. This allowed me to do something really fun! If the weather conditions are either clear night or partly cloudy night, when I have the phase of the moon, I replace the generic moon emoji 🌙 with the emoji representing the current phase of the moon. For example, here's a post when the moon was a waxing gibbous:
That felt like a really nice added touch. Dark Sky also provides some more in-depth summary of the weather so I added this as a tooltip when your mouse hovers over the icon:
All in all it didn't take incredibly long to build out and I feel like it adds some real depth to certain photos. Here's to adding more exciting features to my site in 2018!
p.s. part of my New Years goal was to add Xray parsing to my site. It turns out I had already done that and had forgotten. So that part was already complete.
I want to be able to do all of that on my website. It’s a tall order and will take some time, but ultimately it will be great to have completed over time. As I continue to move towards owning all of my reading, it’ll be important that I find ways to do these goals on my website. It might not be the same as it is in Goodreads, in fact, hopefully it’s better and more tailored to my purposes.
My eventual goal is to have something like what Xavier made, but for now I’m going to start simple. I’ll be doing 100 Days of Reading Chapters where I read a chapter of a book every day for 100 Days, and I will post manual read posts to my website while I understand what I need from read posts.
After that, I will look at what I’ve done over the 100 Days and attempt to automate the process a little more so I can begin tracking metrics on the data.
If you want to see how it's been progressing, you can check it out here