OAuth 2.0 Simplified is now available on Kindle!
I know you've been waiting for the Kindle version, and I'm happy to say it's finally available!
While the ePub and PDF have been available for a while, it took a bit more work than I initially thought to prepare the Kindle version.
This version is formatted specifically for Kindle, so that you can browse the table of contents properly, as well as highlight and share sections of the content.
It's very convenient to be able to quickly share a link to a code snippet, which is something I've mostly done using gist.github.com. While often the code snippets are sort of throwaway, I still feel bad that I'm posting them in a place that I don't control.
Today I added support to my site for natively posting code snippets. It wasn't nearly as hard as I was imagining it was going to be! Since my site doesn't have a posting interface of its own, that also meant that I needed to add support to Quill to create these posts via Micropub.
Since this is still relatively experimental, I didn't add a button to it in Quill, but the page is live.
The only required part of this is the code box. The interface lets you optionally set a filename, which will automatically set the language if it matches a list of known languages. The language is included in order to indicate to my site which syntax highlighter to use. Here's what that ends up looking like on my site.
I use the GeSHi syntax highlighter, which covers a wide range of languages and works very well, but I'm not super happy with the colors it uses. I'd like to find a stylesheet or even a different syntax highlighter that looks closer to the colors on GitHub. In the mean time, I'm happy enough with this to use it.
I ended up doing quite a bit of fiddling with my CSS to make these posts look good. You'll notice the grey background of the code block extends to the edges of the post, whereas normally there would be some padding. I also changed the font of the post name to a fixed-width font. If there is no filename, then I wanted the grey background to extend to the top of the frame, which is also something unique to these posts.
The last step of making this actually useful is to integrate this into my browser workflow, including editing the posts easily. There is a bookmarklet that will either open up a new window or launch the editing interface depending on whether I'm looking at an existing code post.
I'm pretty happy with this, and I hope I don't post on GitHub anymore unless I'm specifically using their fork feature of Gists!
I've been wanting to improve the layout of my blog post archive pages for some time. Previously, the page just listed out the full contents of the last 20 posts, and you could continue navigating back 20 posts at a time. I realize that some people like reading the full posts on the archive page, rather than having to click into each one, but it wasn't easy to just skim the post titles to get a sense of what was on the page.
As an intermediate step before launching a real archives view, I took Tantek's suggestion of adding a sort of "table of contents" view to my existing pages.
Now on my "articles" page, there is a list at the top of the names of each post.
Below that, I still show the full contents of each post. The table of contents also links to fragment IDs for each post on the page, so that you can quickly read the posts without doing full page loads.
As a bonus, this also works with my tag-filtered article pages, such as Articles Tagged #indieweb.
I like this view since it makes it a little easier to find a lot of past content by topic rather than having to continue to page back 20 posts at a time.
I'm still planning on improving the overall archive browsing on my site, but this was a relatively easy first step and is a good improvement.
Ever since launching the new version of my website in 2016, I haven't had the special meta tags that Facebook, Twitter and Slack use for showing the nice preview of links shared. It's been annoying me a bit when I share a link to a blog post that they don't look good there.
Today I begrudgingly added the Facebook Open Graph tags to my post permalinks so that my posts look better when shared.
I say begrudgingly because my posts are already machine-parsable thanks to the Microformats on the page. For example, here's the parsed version of a recent blog post in Microformats JSON format, as well as in the cleaned-up JF2 JSON format. It's certainly possible to use that data to generate a rich link preview, but in the mean time, Twitter and Facebook have their own formats using HTML meta tags.
In order to generate the tags for my site, I didn't need to add any additional properties to my storage. Generating the tags is straightforward for articles, I use the article name, featured image if set, and generating the summary involves taking the first few sentences of the first paragraph unless there is an explicit summary set.
For other kinds of posts it was a little trickier determining what to use. I had to write a little bit of logic to pull the first few words of note posts to use as the OGP title. Some of my posts don't have a "photo" property but instead have a map image, so I had to pull that value out explicitly.
Lastly, Twitter has their own set of tags, but will also use the Facebook tags if those are present. The only tag I needed to set on Twitter was telling it which style of card to use, either the large image style or standard. If my post has a featured image, then it will use the large image style, otherwise uses the small one.
Thankfully, Slack will also use the Facebook tags, so my posts will also look better when shared into Slack now too.
Curious what I was up to in 2017? So am I! Thankfully I developed a pretty regular habit of writing short blog posts any time I finished something, so I have a nice collection of posts to draw from for this year-in-review post!
Aside from all the IndieWeb work, I also managed to finish a few unrelated projects!
In February, I put the finishing touches on BarBot, my robot that pours drinks for me. It can also import h-recipes to make it easy to add new drinks to the database. I've been using it all year, and it's fantastic.
While I was doing the #100daysofindieweb project, I was also writing a song every day. These are all published on 100.aaronparecki.com, which was my last #100daysofindieweb project. Since this project wrapped up in March, it's been fun to be able to use these songs in other projects, as well as having other people use them in their own projects!
I helped run a few events this year:
In January, I gave a talk at Google about my IRC Bot, Loqi. It was a slightly updated version of the talk I gave at the XOXO Bots meetup in 2016.
At the Quantified Self conference in Amsterdam, I gave a talk about how I keep all my quantified self data on my own website in a place I control.
As part of our new class lineup for StreamPDX, I ran a workshop about how to take your podcast from the final audio file and publish it online. We're running a Podcasting 101 series again in 2018, and I'll be teaching this workshop three more times!
In December I gave a talk about OAuth at the Portland Linux/Unix Group.
As part of my 100 Days of IndieWeb challenge, which ran from Dec 2016 through March 2017, I made a lot of progress on my website and other various IndieWeb tools! Here are some of the highlights of things I improved on my own website.
As part of my work in the W3C Social Web Working Group, I was involved in writing a few specs as well as tools to help people test their implementations.
I did a lot of work on the test suite, micropub.rocks, over the few months leading up to Recommendation. Since Micropub requires authentication, I had to build an OAuth server into the test suite so that you can sign in to other Micropub clients. I wrote several client tests, including filling out the implementation report automatically, tests for video and audio posts, and tests for updating posts.
WebSub was a recent addition to the working group. Formerly known as PubSubHubbub, the group adopted the spec in order to continue refining it, and we decided to give it a new name as well.
I finally managed to write up IndieAuth as a spec! Previously it was a series of tutorials on the wiki. I launched the first version of the spec on December 5th, and have been making minor changes since then based on community feedback.
Early in the year, I drafted a spec intended to allow quicker development of reader applications by offloading feed fetching and parsing to a separate server. I called this spec Microsub. A few months later, I started prototyping out a server, which I've soft-launched as the reincarnation of Monocle. The spec has continued to iterate as I develop my Monocle server and Grant works on the front-end application, Together.
Again, thanks to my 100 Days of IndieWeb challenge, I made a lot of progress on a bunch of different IndieWeb projects. Here are some of the highlights, grouped by project.
I launched OwnYourSwarm in March, including sending person-tags, sending Webmentions for Swarm coins, backfeeding comments and likes, and some documentation. It will even poll your past checkins for photos, and you can also import past checkins. Later in the year, I added a property to indicate when another user checks you in, checked in by.
OwnYourGram has been around for a few years, but I made some improvements to it in 2017. You can now whitelist and blacklist terms to control what photos are imported. OwnYourSwarm now sends full h-cards for locations, and finally supports multi-photos.
I added some new features to Quill, such as the ability to set tags, slug and post status and published date for posts, a better photo upload UI, supporting posting RSVPs, showing the reply context of the thing you're replying to, and cleaned up the HTML that the visual editor creates. I also improved the docs, made some other UI improvements, fixed a JS vulnerability.
My work on XRay has continued to be useful in many different other projects. XRay parses contents from other websites and returns the data it finds in a normalized format. I added support for parsing Instagram photos, as well as tweets. I also added support for two new Microformats vocabularies, h-review and h-recipe. I made it easier for others to deploy XRay in various hosting environments. I had to jump through some hoops in order to deploy a Letsencrypt certificate on AppEngine where I run XRay.
I made a few updates to IndieNews, our community news aggregator. Some small improvements to displaying text in posts, enabling WebSub for IndieNews feeds, added a Webmention form, added support for different timezones per post, and added a calendar view of all stories submitted.
I published a few new libraries used in various projects:
The "This Week in the IndieWeb" newsletter now also includes podcasts.
I submitted a PR to Known to improve its Micropub handling.
I added a dashboard to webmention.io so that you can see at a glance the last few Webmentions you've received, as well as delete them if you want.
I started publishing a podcast about my IndieWeb work, called Percolator. I managed to publish 16 episodes from October to December, without much regularity. I hope to continue this in 2018.
I finished a major effort to finally update our MediaWiki to a modern version. Part of this work was also replacing the way authentication is handled, so that it can be used across our other subdomains. This also included archiving plaintext backups of our wiki as well as chat logs in Git repos.
One of the last things I did was create a set of tiny IndieWeb badges you can use on your site! I added them to the footer of my website as well. There are badges for IndieWebCamp, Webmention and Microformats.
Overall I had a pretty full 2017! It felt both busy at times and slow at other times.
I'm already looking forward to IndieWebCamp Baltimore later this month, and I'll begin planning IndieWeb Summit 2018 soon!
Some of my concrete goals for 2018:
Overall, I traveled a little less in 2017 compared to 2016. My biking was down (I no longer commute downtown every day), but train travel was up, since I now live next to a MAX stop. I biked a total of 1,149 miles in 2017, down from 1,529 in 2016. I flew 44,796 miles in 2017, down from 55,271 in 2016. I spent only a little more time in cars this year, my least-used mode of transport other than walking. Car trips include me driving a car2go (very rarely), getting a ride in someone else's car, as well as taxis and Lyft rides. Sadly my bike mileage was just shy of 2x my car mileage, so perhaps I should make it my 2018 goal to double my car mileage on bikes.
While my plane trips dominate in mileage, the time spent in each mode tells a very different story.
I spent more time on my bicycle than any other mode of transport! 126 hours on bikes, and the next highest mode is 101 hours on planes.
My beverage consumption was split almost 50/50 between alcoholic and caffeinated beverages, with very little of anything else. (I don't track my plain water consumption because I drink way too much water to track it easily.) Out of 1,794 beverages consumed, only 5.7% were non-caffeinated and non-alcoholic.
My top drinks of 2017 were: Americano (coffee), Beer, Coffee, and the Boulevardier cocktail.
Overall, I tracked 16 different types of coffee, and 24 named cocktails. I lump specialty cocktails together and track them just as "Cocktail" otherwise it would take too long to enter all the data.
My cocktail of choice this year was apparently the Boulevardier, followed by the Negroni. I will also note that the Vieux Carré is way up there, which is notable because that is one that I don't make at home, I only have it at Imperial in Downtown Portland. It's $5 during happy hour so it's hard to pass up!
For tracking food, I use a web app, Teacup, which I bookmark to my phone's home screen. The interface prompts me with the most often used food and drink, and I can also type in new values if I need to.
For my trip tracking, I use my GPS tracking app, Overland, which I recently published to the iOS App Store! It's a pretty barebones app, but it works well.
It tracks my location all the time, which is used to geotag all my posts, as well as provide the weather information for the posts. It also lets me choose a mode of transport and start tracking a trip. Overland first sends the data to my Compass database, which then sends trips to my server which adds a map image and stores it on disk. Later I can query the server to find all the trip and the time/distance for each.