Eddie Hinkle

indieweb

IndieWebCamp Online 2019

So this past weekend, I helped host IndieWebCamp Online 2019. It was a really fun weekend, if a little unorthodox. I think the camp was successful and enjoyed and yet had learn-able take-aways for the next online camp as well as ideas for single topic sessions which is a bridge somewhere between an virtual IndieWeb Meetup (aka Homebrew Website Club) and a full IndieWebCamp. The benefit of single topic sessions is extremely low overhead while still moving discussions forward in various topical areas without having to wait for a full IndieWebCamp.

We had 11 sessions, each one happened in their own time slot. That's a bit unorthodox for an IndieWebCamp but it allowed some of the sessions to spread out and have completely different people at some than others based on interest and timezones (yes, timezones are hard). Interestingly the sessions ended up in three groups, 4 "Friday" sessions, 3 late-night Wordpress sessions and 4 "Saturday" sessions. Although due to timzones those days are a bit blurry.

I really enjoyed all the sessions. A couple that really stood out were the AutoAuth and Groups sessions. In fact, inspired by the AutoAuth session, that's what my Create Day project was on! For Day 2 of the camp, I worked on adding AutoAuth to my site. AutoAuth is a proposed extension to the IndieAuth specification that allows IndieAuth to happen between software without the active intervention of the site owners. The goal of AutoAuth is to allow access control to posts like how Facebook allows you to make a post with only specific users able to see it or how Twitter allows you to have a private account.

First I was able to add the right scopes to my authorization endpoint

which I defined as "Allow a third party application to request the ability to read other people's content". It can probably be improved but essentially it allows my Social Reader to grab private posts on my behalf so that I can read them in my app.

I also implemented protected posts on my website and did some testing. I added two people to the "access list" (which I call audience) of a private test post. I then tested visiting that page as an unidentified user, as me, as a person on the access list and as a person I know is NOT on the access list. It worked correctly, for an unidentified user, it presents the correct HTTP headers for AutoAuth so a reader knows there is content there if people are identified. However the page itself doesn't say anything about the existence of a post to an unidentified user or a user that is not on the access list.

It's kind of a strange error message from when I had a static site that had to rebuild. I need to adapt that, but the key is it works! Then when either I or a person on the access list visits the url, you get a different page completely!

Surprise! There is a post there! In the future, I could even do things like restrict the location of the post to people that I know or other similar things. AutoAuth opens up the doorway to a whole interesting world of semi-private information.

I am not actually finished with the project, I have some more stuff I need to finish as far as how my site communicates with other people's sites to verify the person is who they say they are, etc. But it's an exciting start and sometimes starting is the hardest part!

I'm hoping to get this work wrapped up in the next week so I can start testing it. Plus, if I get it working and start creating private posts for people on the IndieWeb, it might encourage them to start adding AutoAuth to their projects as well!

51.62 β„‰β˜€οΈFrederick, Marylandindiewebindiewebcampcolophon
posted using quill.p3k.io
This is a test post for AutoAuth! πŸ—
Private37.61 β„‰β˜οΈFrederick, Marylandtestindieweb
posted using quill.p3k.io
Spent some time tonight wrapping up some slides for the welcome presentation for IndieWebCamp Online 2019. Hope to see you there! πŸ‘‹
31.35 β„‰πŸŒ’Frederick, Marylandindiewebindiewebcamp
posted using indigenous.abode.pub
Excited for IndieWebCamp Online 2019 this coming weekend! If you haven't signed up yet, sign up today! Also, we're hosting a Virtual IndieWeb Meetup tonight, we'd love to have you join us!
Had a great time chatting with Greg planning the upcoming IndieWebCamp Online conference. It seems like just the other day it was months away! Now it’s just under two weeks! Interested in embracing a healthier form of social media? Join us!
The Virtual IndieWeb Meetup Americas is tonight! Come join us while we hang out and chat about our websites, what we're blogging about or what we'd like to post in the future.
Can't wait!
46.64 β„‰β˜οΈindiewebindiewebcamp
posted using quill.p3k.io
Registration for IndieWebCamp Online 2019 is open!, it's the first IndieWebCamp based on the internet since 2014 and we're experimenting with really embracing the internet medium for everything it has. Come experiment with us?
You make some interesting points. I think one of the things that has gotten us where we are is because often time when a community has a specific primary project as it's focus, its creates a monoculture around that. (Read on Principle: Plurality for more on that).

That said, I think we have reached the point in growth with various projects including a commercial product in Micro.blog that it is time to develop 1 (or 2, for plurality sake) turn-key IndieWeb CMS solutions. I think by building and producing such projects now, it is unlikely that it will overtake the current plurality of options. This is also true because even the most simple one click install will never be as easy as Micro.blog, which means we will always have many options for the IndieWeb.

38.36 β„‰β˜€οΈindieweb
posted using quill.p3k.io
After discussing the finer points of multitags in the IndieWeb chat today, I decided to add support for it to my site. Thanks to my recent re-architecture in November, it was actually really quick and easy. Took less than 30 minutes!
For the IndieWeb Day 3 challenge, I saw on the To Do list that we needed to clean up the Personal Domains page and the Domain Registrar page and merge them. I took a swing at it, and it can be seen here. If you have further thoughts, please help contribute!
Every day in December, the IndieWeb is trying to collectively ship an update. Today, I created a stub for the 2019 Austin IWC page, and Aaron Parecki published it live on the server! So that's day 2! It's missing the schedule and sponsors because I didn't have that info, but it'll be added soon enough πŸ™‚

Added Locally Stored Webmentions

The main part of my newwwyear 2019 goal is storing webmentions locally and displaying them on my website again, as well as adding moderation support.

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.

Displaying Responses on Feeds

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.

Moderating Webmentions

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.

Receiving Webmention Deletes

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.

Added new nickname and micropub cache support

As I mentioned in my newwwyears goals, I wanted to fill out my nickname cache by replacing the random yaml document with a directory of JSON Microformats h-card files. I also mentioned that I wanted to implement adding entries to my nickname cache by utilizing Micropub as I mentioned in my previous post about Following in the IndieWeb.

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 ?q=contacts.

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.

Thinking through planning the IndieWebCamp Online event. Right now, it looks like we might be scheduling it for the weekend of March 9 and 10, 2019. Anyone who is thinking about participating have any huge conflicts with that weekend? If so, let me know!

My newwwyear 2019 goals

Last year, I posted my newwwyear goal and I decided to follow along with the rest of the IndieWeb commitments and make #newwwyear 2019 goals!

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.

Webmentions

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.

Other goals

Bonus

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.

There are a bunch of great Micropub apps for the Web, iOS and Android so I definitely think it would be helpful to add Micropub support.
38.75 β„‰β˜οΈindieweb
posted using quill.p3k.io
This is a great write up, thanks! This is definitely the road I’ve been thinking down. So far I have been using visibility public, unlisted, and private. The goal has been eventually to set an audience of private posts to various people. I hadn’t gotten to think about groups yet, so I think that makes a lot of sense.

In fact, there has been conversation lately about how nickname caches are really just h-cards. If you take that and the conversations around collections, you can make private collections of h-cards to essentially create lists. This would be an h-card with children h-cards. You could even use this to say represent your co-workers if you had an h-card collection with the info of your employer and then it had children h-cards of the employees of the company, you could then easily share certain items with your co-workers.

55.39 β„‰πŸŒ˜indieweb
posted using indigenous.abode.pub

Owning my code snippets

In the software world, it is very common to take snippets of code that you want to show or discuss with people and post it on GitHub as a Gist, which is a public link that shows code with line numbers and syntax highlighting for the language used.

Back in January 2018, Aaron Parecki added the ability to post Code Snippets over Micropub to his Micropub client Quill. He also fixed up a nice display on his website.

Today, I am excited to add the same functionality to my own site. Using the Code Snippet interface of Quill, I am able to create a snippet on my own website, that gets line numbers and syntax highlighting. You can see the first, test snippet in JavaScript here. I also wanted to get more functionality like GitHub, so I added the ability to highlight lines on the page to help with conversational context. If you click on the line while looking at a code snippet, it will automatically highlight the line and add a code line fragment to the url hash (for example: #L3 or #L1,L4 or #L3-L5). You'll notice the example includes both a single line, multiple non-contiguous lines or a line range. In fact, it will even support multiple non-contiguous ranges. What is better is that when the page loads, it will read the url fragment and auto-highlight the respective lines.

This means I can post a code snippet, select some specific lines and then share the resulting url with fragment to someone and the code snippet will automatically highlight the specific lines to them. Also, the possibility exists that someone could include a code line fragment in the url when sending a webmention to my code snippet and like media fragment, I would then be able to consume the code line fragment and associate the webmention with the specific code snippet lines.

One more step towards owning my own data AND replacing GitHub functionality through distributed means.

Thinking through the IWC Berlin displaying responses session

I remotely attended the Displaying Responses session of IndieWebCamp Berlin 2018. It was very interesting and they made some good progress thinking though how to deal with how and when to display responses received to posts on your website.

They came to the conclusion that there are four groups of people that you want to treat their responses differently:

  • Accepted / Immediate Connections
  • 2nd level connections
  • Everyone
  • Mute or Blocked

Accepted / Immediate Connections

These are essentially your friends on Facebook or your follow list on Twitter. These are people that you have chosen to connect with in some way and this logical conclusions can be drawn around the level of interactions you're willing to have.

My plan is to display these responses completely (name, photo and content of response). This list will be generated for me by adding anyone I follow, as well as anyone I have sent a reply to. This will NOT add people to whom I have liked, emoji reacted, quoted, or bookmarked. Those are lower level responses that do not indicate a deeper level of a desire to connect with that person.

2nd Level Connections

These are "friends of friends". You can assume they won't do anything TOO bad, but you might not want them posting all over your site. There is a deeper level of trust here because of mutual connection but still some care should be taken. This can be determined through different ways. One way that has been brainstormed in the IndieWeb is Vouch.

I don't currently track 2nd level connections but I liked how Tantek thought this through, so my plan is for replies to display their photo and name as "other people that have responded to this post", but not display the content of their reply. I also think if they send a like, emoji reaction or quote, I'll display it just like I would an Immediate Connection.

Everyone

This is the World Wide Web, and anyone could send anything to my website via webmention. So this is a category you likely want to moderate.

My initial thought is I will accept likes, quotes and emoji reactions from them but I won't list attribution of who did it while moderated, just the reaction itself. For replies I am considering potentially listing the url of the author of the post under "other people who have replied" but no name, photo or content while moderated.

Mute or Blocked

These are people who you do not trust for whatever reasons have happened for you. You don't want to associate with them in any way.

Responses are not displayed from these people and they are not listed in the moderation queue.

Some thoughts on moderation

This means I'll need a moderation queue. Anything from a 2nd level connection or from the Everyone group will enter the moderation queue. Responses from 2nd level connections should appear higher in the queue than responses from the Everyone group. From there I can choose to:

  • approve a response (display it like an immediate connection)
  • approve response and accept author (makes this author an immediate connection so they aren't moderated anymore)
  • ignore response (this leaves the response as is, it leaves the queue but doesn't display additional details)
  • remove response (this removes the response from my storage)
  • remove response and block author (this both removes the response from my storage and makes sure I don't receive responses from them in the future)

All in all, it was a great session that I really enjoyed and I'm looking forward to actually working on implementing some of these features into my site.

Please note: This site is in an active redesign. Some things might be a little off 🧐