👈🏼 🕸💍 👉🏼
Skip to main content

Learn more about me. Email me at

cleverdevil

cleverdevil

cleverdevil

cleverdevil

cleverdevil

cleverdevil

www.npmjs.com/~cleverdevil

cleverca.st

trakt.tv/users/cleverdevil

mastodon.social/@cleverdevil

$cleverdevil

 

IndieWeb Summit 2019

8 min read

I had the great pleasure of spending this weekend in Portland, OR for the 2019 IndieWeb Summit. IWS is my favorite event of the year, as it gives me the opportunity to spend time with so many smart, like-minded, principled people who are interested in using technology to make a positive impact on the world. This year’s IWS was a runaway success, selling out for the first time ever, and featuring some truly great sessions, keynotes, and projects.

Day Zero: The Pre-Party

On Friday evening, a large subset of the attendees gathered at Pine Street Market to share in food, drink, and community. It was fun to reconnect with IndieWeb friends like David Shanske, Aaron Parecki, Tantek Çelik, Marty McGuire, Jacky Alciné, and Malcom Blaney. Much fun was had by all, and the post-party festivities carried on well into the night.

Day One: Keynotes and Sessions

Keynotes

5d17a64c2daf2f84f031723d_IMG_0226.JPG

The next morning, we kicked off the summit with coffee and breakfast, followed by some great keynotes.

First up, Tantek gave a brief state of the IndieWeb presentation, and shared details about the IndieWeb’s Code of Conduct, our use of color-coded lanyards to give people a choice about whether or not they should be included in photos, and our use of pins to enable people to display their preferred pronouns.

Next was fellow Micro.blog community member Kitt Hodsden who gave an inspiring talk on contractions and expansions, which really set the tone for the rest of the summit. Kitt should be very proud of both the content of her talk, and her wonderful, passionate delivery. Well done, Kitt!

Continuing the thoughtful keynote presentations was Jordan Brady, a native of Portland that I met several years ago at a Homebrew Website Club meeting at the DreamHost PDX offices. Jordan shared her story of changing her domain during her job search. Her experience shined a light on the challenges of being a woman in tech.

Marty McGuire followed, with an interactive keynote about his IndieWeb experience from his iPhone. It was very cool to see how far we’ve come in the past few years, with native mobile apps like Indigenous by Eddie Hinkle, and deep integrations thanks to iOS Shortcuts. Kudos to Marty for presenting the entire keynote directly from his iPhone.

Finally, Jacky Alciné closed the keynotes with an exploration of how to make the IndieWeb available for all. Jacky is a really thoughtful guy, and I enjoyed hearing his perspective.

Lightning Intros

After keynotes, all IWS participants were encouraged to give brief, 2-minute introductions, along with demos of their personal websites. During my introduction, I talked about the importance of preserving and owning your memories, and showed how my website helped me cope with the loss of my sixteen year old dog Winston earlier this year.

Sessions

5d17e52b6ad3cb4f3e219a19_IMG_1304-p-1080.jpeg

After a group photo and lunch at local Portland food carts, we returned to the venue to plan out the rest of the day. IWS uses the BarCamp format for session planning, where attendees lead interactive session proposals, and build the schedule together. We came up with quite an impressive collection of sessions!

There were a lot of great conversations, but I’ll touch on three of my personal favorites:

  1. “Follow That Bird” – This session was proposed by David Shanske, and addressed the problem of discovery. On platforms like Facebook and Twitter, it is easy to just click the “follow” or “friend” button, and following / friend lists help users discover other people. On the IndieWeb, we’re still figuring out the mechanics of how to improve this user experience, especially in social readers like Together and Monocle. Lots of great discussion all around, and this session ended up inspiring my project for day two, which I’ll talk about shortly.
  2. Private Posts – I ran this session, and we talked about another problem that is neatly solved by traditional social platforms: sharing content privately. Again, some great discussion about how to solve this problem in the IndieWeb. Thankfully, there’s plenty of prior art out there to build upon. I’m looking forward to working on solving this for Known, which is the CMS I use for this website.
  3. Possible Futures and IndieWeb – An extremely engaging and interactive session facilitated by Ariana Lutterman. Ariana guided the group through the process of exploring the many possible futures for the IndieWeb based upon emerging signals of change through the lens of growth, collapse, discipline, and transformation. We brainstormed on future implications across a number of axes – STEEPV (social, technological, environmental, economic, political, and values). Finally, we used our exploration to write headlines from the future. A really thoughtful and fun exercise. Many thanks to Ariana for guiding us.

At the end of a very long and engaging day, we split out into groups for evening activities. I joined a great group of nine for dinner at Jackrabbit, which featured an impressive and delicious 4-pound steak that we shared. Yum!

Day Two: Creative Hack Day!

IndieWebCamp Logo

On Sunday, we started things off with some tasty vegan breakfast options, and then I headed off to the first ever meeting of the Known Open Collective. It was great to finally connect, at least over video chat, with Marcus Povey, Jeremy Cherfas, and Paul Lindner. We definitely missed having Ben Werdmüller at the summit, but all send our best to him as he deals with this complicated thing we call “life.”

For the rest of day two, I focused on two things – helping other people and personal projects.

Inspired by the “Follow that Bird” session from day one, I decided that it would be extremely valuable to focus on the problem of discovery. I chose to update my site to make it easier to subscribe to my website, and to discover who and what I am following. The first, smaller part of the project, was to update my Subscribe page with more detailed instructions on how to subscribe to one or more of the feeds that are available on my website.

The second part of my project was to build a way for people to see what I am following. There is a wealth of information on “following” on the IndieWeb wiki, but none of the approaches discussed for documenting subscriptions really sat right with me. I am a fan of the DRY principle, and I don’t like the idea of manually creating “follow posts” when I have a perfectly serviceable source of truth for my subscriptions in my Microsub server. Thus, I embarked upon a project to automatically generate a page on my website that displays an up-to-date list of my subscriptions from Aperture.

Thanks to some enhancements by Aaron Parecki to Aperture, I was able to create a beautiful Following page that gives visitors to my website a way to see exactly what I am following in my social reader. They can use this to discover new content that they may enjoy. Even better, if you parse my Following page with a microformats2 parser, you’ll find that it is an h-feed containing h-entry “follow posts” with a u-follow-of property for each feed that I subscribe to. The only missing piece is that Aperture doesn’t yet provide me with the date and time that my subscription was created. Aaron has indicated that this is something he’d like to add, and once he does, I’ll update my page to include that data.

At the end of the summit, participants demoed their projects and progress before we closed out the summit. My personal favorite demo was from Malcom Blaney and Gregor Love, who demonstrated one of the first implementations of subscribing to private posts using AutoAuth. It was awesome to see private sharing in action, and it gives me confidence that 2020 could be the year that we solve this problem for good.

IndieKaraoke

Once the summit wrapped, a small group of us enjoyed what is becoming a wonderful annual tradition: IndieWeb Karaoke night! This year, we celebrated at Voicebox Northwest thanks to our wonderful host Lillian Karabaic. There was singing. There was laughing. There was a non-stop stream of incredible IndieWeb lyrical jokes:

  • “Bow down before the Zuckerberg. You’re going to get what you deserve.” – To the tune of Head Like a Hole by Nine Inch Nails.
  • “If you want to destroy the silos (whoa oh-oh), POSSE first, and then walk away!” – To the tune of Undone by Weezer.

We’re a bunch of very lovable nerds. I’d especially like to call out Fluffy for her amazing energy at karaoke. She made sure that fun was had by all.

Conclusions

Thank you so much to all of the organizers of IndieWeb Summit for doing such a great job building an inclusive, fun, and enjoyable event each year. This year’s summit was the best yet, and I have no doubt that next year will be even better.

I love you

 

iPad Pro Impressions

8 min read

iPad Pro

This past weekend, I took the plunge and purchased myself an iPad Pro, including an Apple Pencil and Smart Keyboard Folio. Amazon had the iPad Pro on sale for 16% off of list price, which is an uncommonly large discount that I couldn’t pass up. I also had saved up quite a bit of Amazon rewards credit, so my out of pocket cost was quite low. I’ve had my eye on an iPad Pro for quite some time, and now that I have one, its time to share my impressions.

Which iPad Pro?

I chose to purchase the smaller 11" iPad Pro in Space Gray with 256GB of storage. Why? Well, the 12.9" iPad Pro was very tempting, but my primary use case for this device is to be a highly portable alternative to my MacBook Pro. What do I plan to use it for? Ideally:

  • Productivity
    • Email
    • Documents
    • Task Management
    • Note-taking, as an alternative to my trusty paper notebooks
  • Development
    • SSH’ing into my various Linux environments
    • Local development, preferably using Python
  • Writing / Blogging
    • Publishing to my website
  • Media
    • Streaming from my Plex server
    • Hulu, Netflix, Amazon Prime Video, etc.
  • Reading

Given my constraints and desire to have something more portable than my MacBook Pro, I opted for the smaller size iPad Pro and Apple’s very slim keyboard case, with the Apple Pencil to help me replace my paper notebooks. I chose the 256 GB storage option because the base model only offers 64 GB, which is just not enough for my needs.

The Good: Hardware

So, what’s the good news? Well, there’s a lot to like. First off, the hardware itself is simply stunning. Its light, thin, fast, and beautiful. The screen is bright and crisp, and the bezel-less design is reminiscent of Dieter Rams' greatest hits. The last hardware design that I loved this much was the iPhone 5s.

The accessories are similarly well designed. The Smart Keyboard Folio attaches to the iPad Pro with ease thanks to an array of powerful magnets, and the Smart Connector means that I never have to worry about charging or pairing the keyboard. It just works. The Apple Pencil is similarly impressive, with an ingenious magnetic attachment to the side of the iPad Pro, and wireless charging that is effortless.

The Good: Software

iOS has come a long way in the past few years, adding rudimentary file management in the Files app, early multi-tasking capabilities, and iPad-specific features that enhance the overall experience. That said, there’s a long, long way to go from an OS-level to truly make the iPad Pro a professional tool. I’ll touch on that more later.

Now, there are some truly amazing apps that I have been enjoying to help me with my target use cases. They’re not all perfect, but I am encouraged by the vibrant and growing ecosystem of truly professional apps for iPad. These give me a great deal of hope for the future of the Mac as these apps begin to show up via Marzipan. Below is a list of apps I am using or experimenting with so far:

  • Productivity
    • Email – Apple Mail. I am a heavy email user, and try out email clients often. For now, I am sticking with the built-in option, which is adequate.
    • Documents – Pages, Numbers, Keynote, and Drafts for personal projects. For work, we use GSuite, so I have installed Google’s Drive, Slides, Sheets, and Docs apps.
    • Task-Management – I use Things on my Mac and iPhone, and now I am using it on my iPad Pro.
    • Note-taking – This is an area where I am spending a lot of time experimenting. I have very much enjoyed note-taking in Drafts with my Smart Keyboard Folio attached, but am also trying out note-taking apps that are more Apple Pencil driven, including Notability and Nebo.
  • Development
    • SSHPanic’s Prompt and the emerging iSH, which adds an emulated Linux environment to iOS.
    • Local Development – The aforementioned iSH has been a revelation, enabling me to do local development in a very similar way to how I would on macOS, with vim, Python 3.7, git, virtualenv, and other common terminal-based tools. I’m also experimenting with Pythonista and have my eye on a few other editors to play with (Textastic, Buffer, etc.).
  • Writing / Blogging
    • Blogging – Drafts with a custom Micropub action for publishing to my website.
    • Microblogging – Directly on my website, through Indigenous, or via the Micro.blog app.
  • Media
    • StreamingPlex, Hulu, Netflix, Amazon Prime Video, etc.
    • Local VideoInfuse, VLC, and Plex. To get video into Infuse and VLC, I tend to use youtube-dl inside of iSH.
  • Reading
    • Books – Apple’s Books app works great for ePub content.
    • News – Apple’s News app is decent, but mostly I use Safari with my favorite news sites, or more likely I use my feed reader.
    • ComicsChunky Reader is pretty solid, though I wish this entire category was more like Plex, with rich metadata indexing and organization on the server, with clients for reading.
    • Web – Safari.
    • Feeds – I have installed Together as a Progressive Web App on my home screen and it works well.

While none of the above apps are perfect, I have been quite impressed with them as a whole.

The Bad: Hardware

While the iPad Pro and its accessories are truly impressive hardware, they’re not free of issues. Because the bezels are so small on the iPad Pro, it can be a little uncomfortable to hold in portrait layout while reading. In the lap, the whole Smart Keyboard Folio and iPad Pro setup is a bit top-heavy, making it slightly unstable. Other than these minor nits, overall I think the hardware is top-notch.

The Bad: Software

While the app ecosystem is amazing, and iOS has made great strides, there are still some fundamental missing pieces that prevent me from viewing iOS as a true alternative to macOS:

  • Keyboard – While the Smart Keyboard Folio is generally great to type on, in spite of its small size and low key travel, it is greatly hampered by software limitations in iOS. There is no ability to re-map keys in iOS, so I am stuck with a system-wide Caps Lock key, and no ESC key. Some apps, such as iSH, allow you to map Caps Lock to ESC, but this should really be handled system-wide. In addition, the Smart Keyboard Folio has a “globe” button in the bottom left corner which is infuriating. Pressing it pops up the Emoji keyboard on screen, and its right next to the control key, which I use heavily.
  • Fonts – iOS comes with a small set of fonts, and there is no standard, built-in way to install additional fonts. I have been able to use an app called AnyFont to install fonts, including my preferred programming font, Dank Mono, but because the system itself doesn’t have support for font management, most apps don’t surface font customization. Kudos to Drafts, though, for allowing users to pick from any font available to the system, including ones installed through AnyFont.
  • File Management – Apple added the Files app to iOS, and its a good start, but has so far to go to truly make it a pro-level file management tool. In addition, there isn’t any ability to plug in external storage to my iPad Pro, in spite of the fact that it has a USB-C port.
  • Multi-Tasking – iOS has a very rudimentary multi-tasking system, which allows you to place multiple apps onto the screen at the same time, in floating panels, and in split views. It works, but is fiddly to use, with delicate gestures required to bring up the dock, drag apps over each other, and position them. In addition, there is no way to have multiple “windows” of an app used in different multi-tasking sessions. I think Apple is definitely innovating here, looking for new ways to approach multi-tasking than traditional window management. In many ways, iOS multi-tasking reminds me of tiling window managers, just… not as good. I’m hoping for good news on this front at WWDC.
  • Web Browsing – Safari is an awesome browser. But, on the iPad, too often websites give you the mobile version of their site, rather than serving up the “full size” website. In addition, there isn’t any sort of download manager, or support for extensions other than content blockers.
  • iSH – I have heaped praise on iSH above, and it really is pretty incredible. Its also an open source project, and is rapidly improving… but its not there yet. Things I’d love to see added to iSH that would greatly improve my experience: custom font selection, better performance, compatibility with additional software, tabbed sessions, and a choice of a different base operating system than Alpine Linux.

Conclusions

Overall, I am thrilled with my iPad Pro, and really excited to see where Apple is headed with iOS for “pro” users. There is so much to like, and massive potential for improvement. While I don’t see the iPad Pro displacing my laptop anytime soon, I think it will become an important part of my workflow.

 

Tracking My Movie, TV, and Podcast Activity

6 min read

As part of my continuing efforts to preserve and capture my memories, I’ve been spending some energy adding more capabilities to my website. I already capture photos, recipes, blog posts, status updates, and other more traditional types of content. In addition, I’ve been privately tracking my own location continuously for months now, including the ability to see some current details about my location and status. I also use the excellent OwnYourSwarm service from Aaron Parecki to record check-ins at specific locations on my site.

Last week, I realized that I was missing some data on my website that would add additional context when exploring my memories: my TV and movie watching history, and a record of what podcasts I listen to. As of today, I am now automatically tracking all of this data, and I’m happy to share a bit about how I made it happen.

Movies and TV

Let’s start with how I am tracking what movies and TV shows I watch. As it turns out, there is already a wonderful service out there for tracking this data called Trakt, which is a startup based out of San Diego. Trakt has done the hard part for me, with an extensive and complete database of movies and TV shows for me to pull from, and a host of great apps that use its powerful API to help users put data into their Trakt account. I am personally using the Watcht app for iOS to manually ad TV episodes and movies to my watch history on Trakt, and to show me a calendar of upcoming TV episodes for my favorite shows.

Trakt Logo

But, being an IndieWeb community member, I want to make sure that my memories don’t get lost in the event that Trakt goes away one day. In addition, I want to be able to see my TV and movie history in the context of the rest of my website’s content. So, I needed to find a way to automatically sync that data to my website.

At first, I thought about using the extremely capable Trakt API to periodically sync to my website, but then I noticed that Trakt Pro members get access to an Atom feed of their watch history. Working with a custom REST API takes a lot of effort, while integrating with a standard feed format is extremely easy. So, I happily paid for a Trakt Pro subscription!

I created a Python script which periodically parses my Trakt feed and then creates entries on my website for each movie and TV episode I watch. It only took me about an hour to put the whole thing together.

Sidebar: Automatic Tracking from Plex

Plex Logo

As you may already know, I have a great collection of digital movies and TV shows. I use the outstanding Plex Media Server to enable me to stream and sync content to all my devices. As Eddie, my co-host from Two Dads Talking, recently mused, tracking activity automatically is much more reliable than remembering to manually track activity. Trakt provides a Plex plugin that automatically syncs your Plex history to Trakt, and once I had that installed, a significant chunk of my activity is now automatically synced!

I still have to manually track content watched outside of Plex, like live TV from Hulu, and content consumed on Netflix, but it’s a good start.

Podcasts

I’m not only a podcaster with a microcast and a podcast, I’m also an avid podcast listener. I listen to podcasts on my daily commute, to relax after work, and to kill time on airplanes. Wouldn’t it be great to have that history tracked on my website as well? As I mentioned above, tracking that history automatically is greatly preferable to manually having to log every episode I listen to. With that in mind, I set out to see if I could capture my activity.

Overcast Logo

I use the wonderful Overcast podcast app for iOS. Overcast is created by Marco Arment, who is also a prolific podcaster. It’s a fantastic and pleasant app to use, and is perhaps my favorite iOS app ever. Overcast has a sync service and web frontend available for users at overcast.fm. Not only can you listen to podcasts in your web browser on overcast.fm, you can also export an extended OPML file that contains all details about your account, including a listing of all podcast episodes you’ve ever listened to. Bingo!

I whipped up a script that logs into my account at Overcast.fm, then downloads a copy of this OPML file, and uses it to sync my history to my website. It works a treat, but I will caution that Marco seems to be rate limiting that OPML export pretty aggressively. For the time being, I’ve limited my sync to once daily, and I’ve also contacted Marco to get his input on how I am using his service. In an ideal world, I’d love to see Marco add a standard RSS, Atom, or JSON Feed for Overcast paid subscribers similar to what Trakt has done for Trakt Pro users. In the meantime, I’ll be conservative about how often I sync and await a reply from Marco.

Why Track Activity?

You may be wondering why I want to track all of this information. Eddie and I briefly touched on the topic in the last episode of Two Dads Talking, but it really comes down to the fact that our memories are precious, and the more context I have when looking back on my life, the richer my appreciation will be for the life I’ve been blessed to live.

During the process of adding these new types of memories to my website, I also have added a monthly “recap” feature which has been one of my all time favorite enhancements. I like them so much, I’ve added links to the last twelve monthly summaries to my home page to surface them. My favorite examples of monthly summaries so far:

  • January 2018, which marked my departure from DreamHost, the beginning of a new chapter in my career, and my second viewing of my favorite musical of all time.
  • July 2018, which includes travel all over the globe, some progress on my Indiepaper project, and outdoor movies in my front yard with my kids.
  • November 2017, which includes a trip to Australia, the acquisition of the best car I’ve ever owned, and my son’s first ever NFL football game.

I’m delighted to continue enriching my database of memories, and really happy with the way my movie, TV, and podcast tracking is shaping up so far.

 

New Podcast: Two Dads Talking

2 min read

I am not ashamed to admit that I love podcasts. In the early 2000s, blogs were the hot thing: an open publishing medium that allowed people to exchange ideas, converse, and share. Since then, blogs have faded, as increasingly toxic social media walled gardens have moved people off the open web. It’s a shame, really. I’m hopeful that blogs will rise again, but it’s going to take time.

Podcasts, on the other hand, have only grown in popularity, and are still blissfully free of central control from creepy ad-driven social media giants. We are in the golden age of podcasting!

I’ve had a personal microcast for a while now, and I’ve been pretty undisciplined about publishing it. Still, it has been a fun exercise, and I plan to keep at it for years to come.

Today, however, I’m excited to announce a new podcast project: Two Dads Talking. TDT is a longer form podcast featuring myself and my co-host Eddie Hinkle. Eddie and I have known each other for a few years now through the IndieWeb community, and we’ve found that we both have a lot in common, but also a significant amount of differences. This podcast is an opportunity for us to get to know each other better, and for our listeners to join us in that discovery.

Eddie and I are both parents, though at very different life stages, and both are people of faith, and technologists. I’m really looking forward to getting to know Eddie better, and I hope you’ll all join us in our journey of Two Dads Talking.

To subscribe, visit the Two Dads Talking website, follow us on Micro.blog, or subscribe in your favorite podcast client.

 

Indiepaper for macOS

1 min read

Indiepaper LogoIndieWeb Summit 2018 took place a few weeks ago in Portland, OR, and my project on day two was to create a service called Indiepaper, which is a "read it later" service for the IndieWeb. Indiepaper makes use of Mercury by Postlight Labs under the hood to extract article content and then publish it to a Micropub destination for later reading. Indiepaper is open source and is deployed on AWS Lambda using the Zappa framework. The Indiepaper website includes a tool to create a Bookmarklet for your web browser, and a Workflow for iOS that adds system-wide support for sending links to Indiepaper.

In order to make Indiepaper even easier to use, I created Indiepaper for macOS, which adds system-wide sharing support for Indiepaper to macOS. Here is a quick video demo of Indiepaper for macOS in action. Indiepaper for macOS is also open source, so feel free to poke around in the source code, and submit pull requests if you have improvements!

 

Add native support for Indiepaper

1 min read

Regarding Together

Now that I've launched Indiepaper, I'd love to see Together add native support for sending articles to Indiepaper with the click of a button. This would require a few configuration settings, including the configuration of a bearer token and a target micropub destination.

 

Going Serverless with Python WSGI Apps

1 min read

I've been writing web applications and services in Python since the late 1990s, and enjoy it so much that I created the Pecan web application framework way back in 2010. Configuring and deploying Python web applications, especially WSGI compliant applications, is fairly straightforward, with great WSGI servers like Gunicorn and uWSGI, and excellent Apache integration via mod_wsgi. But, for many use cases, creating and maintaining one or more cloud servers creates unnecessary cost and complexity. Security patches, kernel upgrades, SSL certificate management, and more, can be a real burden.

Since the creation of AWS Lambda, "serverless" has become a pretty popular buzzword. Could Lambda provide a way to deploy Python WSGI applications that helps reduce cost, complexity, and management overhead?

It was a fun topic to explore, and I've published a blog post over at Reliam.com about running Python WSGI apps on Lambda!

 
 

Freeing Myself from Facebook

5 min read

Ever since my discovery of the IndieWeb movement, I've wanted to free myself from Facebook (and Instagram) and their brand of surveillance capitalism. I want to own my own data, and be in control of how it is shared, and I don't want it to be used for advertising.

I've had this incarnation of a personal website for a few years, and have mostly been following the POSSE publishing model, publishing most forms of content on my website, and then automatically (or manually) syndicating that content to silos like Facebook and Twitter. But, much of my content still remains trapped inside of Facebook and Instagram.

Until now.

As of March 4, 2018, I've pulled the vast majority of my Facebook content into my website, and all of my Instagram photos into my website, paving the way for me to delete myself from Facebook (and potentially Instagram) by the end of 2018. What follows is a high-level overview of how I made the move.

Facebook

Exporting Data from Facebook

While Facebook does offer an export feature, its extremely limited, only includes very low resolution versions of your photos, and is generally very difficult to process programmatically. After some research, I discovered the excellent fb-export project on GitHub. Once installed, this tool will dump a huge amount (though, not quite all) of your Facebook data into machine-readable JSON files.

Since my website is compatible with the Micropub publishing standard, I then needed to convert this Facebook-native JSON data into microformats2 formatted JSON. Enter granary, an amazing swiss-army knife of IndieWeb by Ryan Barrett. Using granary, I whipped up a quick script that transforms the exported data into native microformats2 formatted JSON:

https://gist.github.com/cleverdevil/f33530706d6e8dacd13a8bd8e8c15dba

Publishing Liberated Data

At this point, I had a directory full of data ready to publish. Sort of. Unfortunately, not all of the data is easily translatable, or even desirable, to publish to my website. As a result, I created another script that let me, on a case by case basis, publish a piece of content, choose to skip it entirely, or save it to deal with later.

https://gist.github.com/cleverdevil/c857695bb2de1e46686d720cad9d124c

After running this script, I had a significant amount of my data copied from Facebook to my website. Huzzah!

Dealing with Photo Albums

Facebook has a "photo albums" feature, and I definitely wanted to get those memories onto my website. Again, I wrote a script that processes the exported data, and selectively allows me to upload all of the photos in an album to my website via Micropub, and then drops microformats2 JSON out that I could publish later.

https://gist.github.com/cleverdevil/d9c08ddc6eb2da0d060a5f6fe87ddf64

Once I finished processing and uploading all of the photos for the albums I wished to copy over, I ran a simple utility script I keep around to publish all of the albums as new posts to my website.

Here are some of the results:

Notice, one of these comes all the way back from 2009!

Almost There

There are still quite a few photos and other types of posts that I haven't yet been able to figure out how to migrate. Notably, Facebook has strange special albums such as "iOS Uploads," "Mobile Uploads," and "iPhoto Uploads" that represent how the photos were uploaded, not so much a group of related photos. Unfortunately, the data contained in the export produced by fb-export isn't quite adequate to deal with these yet.

Still, I am quite pleased with my progress so far. Time to move on to Instagram!

Instagram

Instagram has been slowly deteriorating as a service for years, so much so that I decided to completely stop publishing to Instagram earlier this year. It turns out, dealing with Instagram is a lot easier than Facebook when it comes to liberating your data.

Downloading My Data

After some research, I found instaLooter on GitHub, which allowed me to quickly export every single photo in its original resolution, along with nearly every bit of data I needed... except the photo captions. I ran instaLooter, and embedded the unique identifier in the filenames (which instaLooter refers to as the "code').

Getting Metadata and Publishing

I wrote a script that used granary to lookup the photo metadata and publish to my website via Micropub:

https://gist.github.com/cleverdevil/5bb767fd152de9b4c246d01086e91399

Note, I used the non-JSON form of Micropub in this case, because Known's Micropub implementation doesn't properly handle JSON for photos yet.

Conclusions

It turns out, that with a little knowhow, and a lot of persistence, you can liberate much of your data from Facebook and Instagram. I feel well on target to my goal of leaving Facebook (and maybe Instagram) entirely.

 

Kiddo Concentration

1 min read

William and Colette have been asking for “homework,” since they’ve heard about it from others. William is practicing his fine motor skills and Colette remains goofy.

 

Special Lunch With William

1 min read

Colette had rehearsal for a children’s musical, so Lacey and I took William to lunch at Playa Hermosa on the Hermosa Beach Pier. Good food and lots of smiles with my sweet boy.

 

Editing a post in Known can have destructive side effects on content

1 min read

There is a bug in Known which causes HTML posts published via Micropub to be changed (usually in bad ways) when "editing" the post, even when you don't actually make any changes to the post. I discovered this issue when publishing via Sunlit 2.0, which supports Micropub.

I published two stories:

Because Sunlit doesn't yet support syndication via Micropub, I clicked "edit" on one of the posts, and toggled on syndication to Twitter and Facebook, and then clicked "save." The result was that the post's content was changed (in a destructive way, resulting in visual regressions), even though I hadn't actually edited the content, or even clicked into the content editor.

Seems like this is a bug.

 

Car Museum with William

1 min read

Last week I took William to the car museum in El Segundo for a Hot Wheels event. The event was fine, but we had a lot more fun in the museum itself. William even had the chance to sit in a Deloreon.

 

San Diego with Lacey

1 min read

2018-01-20

a3e2d44e0f465dd7442a63127ea6c75725d3e48007e0b18eb8c6b1ed9717120939b9a74b49cf911cb8db789557f5114b2c31d321ac99e955b1761c2bdbd329ae

Dinner and drinks before our second viewing of Hamilton at the San Diego Civic Theatre.

2018-01-21

2a37b4070bde2bdaaa41023fb219e8ef

Late brunch “the morning after.” The view was far better than the food.

 

1955 Jaguar XKSS

1 min read

Season two of Amazon’s The Grand Tour has been a huge improvement over the lackluster debut season. The latest episode featured the Jaguar XKSS, which was originally released in 1955, and is being rereleased this year by Jaguar. The XKSS is easily one of the best looking cars of all time.

 

Baptism and Political Resistance ✊

3 min read

In today's church service, our pastor delivered a message about the biblical sacrament of baptism. After the message, the congregation was invited to the front of the church to participate in what the United Methodist Church refers to as the "Congressional Reaffirmation of the Baptismal Covenant." Following the process outlined in the UMC Book of Worship, I reaffirmed my baptism in Christ today. Before approaching the baptismal font, I read the following:

Renunciation of Sin and Profession of Faith

On behalf of the whole church, I ask you: Do you renounce the spiritual forces of wickedness, reject the evil powers of this world, and repent of your sin?

I do.

Do you accept the freedom and power God gives you to resist evil, injustice, and oppression in whatever forms they present themselves?

I do.

Do you confess Jesus Christ as your Savior, put your whole trust in his grace, and promise to serve him as your Lord, in union with the church which Christ has opened to people of all ages, nations, and races?

I do.

According the to grace given to you, will you remain faithful members of Christ’s holy church and serve as Christ’s representatives to the world?

I will.

This past year has been extremely trying for me in my faith in the wake of the 2016 Presidential election. Each passing day, I watch as many evangelicals enable injustice and oppression, and fail to reject the evil powers of this world, as the President of the United States spouts overtly racist, isolationist, and sexist words. I watch as many churches and Christians say nothing as the President pushes policies that harm the poor and deepen racial and gender inequality. Evangelicals, especially white evangelicals, voted hugely in favor of this man, and are enabling him every step of the way. I'm personally sick of it.

As I walked through the process of reaffirming my baptism today, I also am renewing my commitment to resist this despicible administration. I have made a promise to God to serve as Christ’s representative, to reject the evil forces of this world, to resist evil, injustice, and oppression in whatever forms they present themselves, and to do it all together with the church, which is open to all ages, nations, and races. Therefore I choose to resist this President, his hateful and isolationist agenda, and all who support him. I wish to do this together with the church, just as I am called. I encourage you to join me.

Note: I am not advocating that the Church should be "democrat" or "republican," or even political. I'm advocating that Christians, as Christ's representatives in the world, are called to fight injustice, oppression, and evil, no matter what form it takes. Right now, one of the most pressing forms of oppression and injustice in the world is Donald Trump, and his administration. Resist.

 

Here's to what's next

1 min read

Last week, I shared that I have decided to move on from DreamHost, and its been a crazy week tying up loose ends, meeting with colleagues to remember our time together, and reflecting on the past. 

Now, its time to focus on what's next.

On January 16th, I start as Chief Technology Officer at Reliam, a managed cloud service provider based out of Los Angeles, CA. Reliam has just secured up to $75 Million of investment from Great Hill Partners to drive growth. Simon Anderson, former CEO of DreamHost, and my ex-boss, has joined Reliam as CEO. I am thrilled by the possibilities that are ahead of us!

Why does this opportunity excite me? Well, that requires some storytelling that will come later. Suffice it to say, the tectonic shift to public cloud is a huge opportunity, and I believe that this team and company have what it takes to help businesses of all shapes and sizes make the move.

Looking forward to an amazing 2018!

 

Micro Monday: Eddie Hinkle

1 min read

Its our first ever Micro Monday, people! Thanks to @manton and @macgenie for deciding to make this happen. I think its a great way to grow the community of Indie Bloggers and Micro.blog itself. My first recommendation for my followers is @eddiehinkle.

Eddie is a fellow IndieWeb developer that I've enjoyed getting to know over the past year or two. Eddie works on an iOS app called Indigenous:

Indigenous is an iOS app that is in development. It’s goal is to provide a native iOS interface to the indieweb movement.

Indigenous is open source, written in Apple's Swift programming language. If you're an IndieWeb-curious developer on Apple platforms, I'd encourage you to get involved with Eddie, and help him with Indigenous!

In addition to his work on the IndieWeb, I also appreciate following Eddie because he writes thoughtful posts about, you know, being a human. Its always refreshing to see someone share how their faith informs their life in an open and honest, accepting way.

Thanks for being awesome, Eddie!

 

Farewell, DreamHost

2 min read

Late in December, I tendered my resignation to the founders of DreamHost. My last day is Friday, January 12th. After over six years, it’s time to move on to my next adventure. But, before I do, I want to spend some time reflecting on my time at DreamHost.

DreamHost is the reason I moved my wife and infant daughter from Atlanta to Los Angeles. We spent our first year in the heart of Venice Beach, in a little condo on Abbot Kinney Blvd., the trendiest street in the trendiest neighborhood in LA. We now have settled into a lovely home in a great family neighborhood in South Redondo Beach, and couldn’t be happier.

In my six years at DreamHost, I’ve held five different positions, covering a huge variety of disciplines and responsibilities – software development, product management, operations, and even managing an entire business unit. I’ve had the pleasure of helping DreamHost become a company with disciplined engineering, product, and marketing teams. I’ve helped guide the company to embrace modern cloud infrastructure, and been part of releasing some of our fastest growing products on top of that infrastructure. We launched two spinoff companies based on open source technology we created, one of which became one of the greatest commercial open source successes ever.

In my six year run, DreamHost has also gone through a major reorganization, redefined our core values, and defined a Noble Cause, Vision, and Mission. We even stood up for the freedom of our customers in a landmark battle with the Department of Justice! We’ve become a company that knows who we are, what we stand for, and how we fit into the world. I’m immensely proud and gratified to have been a part of it.

Today’s DreamHost has an incredible culture, a caring leadership team, and a bright future. It’s been a joy. Keep on dreaming, DreamHost! I’ll miss you all!

 

What’s next for me? Well, that’s a different story...

 

Cord-Cutting Experiments: Part 2

4 min read

Earlier this month, I began experimenting with cutting the cord, starting by evaluating over-the-air options. Early indications had me optimistic that between a solid indoor antenna, an HDHomeRun Connect tuner, and Live TV and DVR functionality from Plex, I'd at least have my problems solved when it comes to the major networks. Sadly, that's turned out not to be true.

Plex + HDHomeRun: Not Ready for Prime Time

As I mentioned before, the HDHomeRun is great, and the antenna does pull in many channels, but its not nearly as reliable as I had hoped, with my local NBC and CBS affiliates being far too spotty. In addition, Plex's DVR and Live TV functionality is extremely unreliable, with recordings going hours over time, hanging completely, or causing my Plex Media Server to crash. I could certainly continue down the rabbit hole by investing in a more powerful outdoor antenna, but they're costly, and there's still the matter of Plex's buggy support for DVR and Live TV. At this point, I don't recommend this path for most people.

Evaluating Streaming Services

With OTA off the table, it was time to start investigating streaming services that offer live TV functionality and cloud DVR. My priorities were:

  1. Local affiliates for the major networks: NBC, ABC, CBS, and Fox.
  2. Full access to ESPN and its associated networks, including access to WatchESPN.
  3. Access to Disney networks for the kids.
  4. More cost effective than DirecTV, my current service provider.

First, I took a look at Sling TV, which provides a highly-recommended a-la-carte service that meets many of my criteria. Many, but not all, unfortunately, as Sling hasn't managed to strike a deal with every local affiliate in my area.

Next, I signed up for PlayStation Vue, which on the surface, ticked all of the boxes. However, my free trial of the service was a total disaster. It took days for my account to activate, and my attempts to contact support resulted in announced hold times measured in hours. When I finally was able to get things working, the quality was pretty low, and the app experience left a lot to be desired. Once my trial was up, moved on.

A New Contender Emerges

Enter Hulu with Live TV, a new offering now in beta from one of the oldest and most respected names in streaming entertainment. Hulu with Live TV met all of my requirements on paper, so I decided to dive right in and put it to the test. Hulu

At this point, I'd love to tell you that Hulu is a perfect solution. The truth is, it isn't. That said, it meets all of my requirements, and its shortcomings are tolerable enough that I've officially cut the cord, and cancelled my DirecTV service. Overall, Hulu is great, with an extensive streaming catalog that is, in essence, like a massive "on-demand" library from a traditional provider. The client app is available on every platform that I use, and works well enough.

My wishlist for Hulu, however, is long:

  • Client apps, as far as I can tell, don't support anything but stereo sound. Why no 5.1 audio, Hulu?
  • The DVR functionality is odd, and takes some getting used to. In addition, if you want to fast forward through the commercials of your recordings, you have to pay extra. This very nearly caused me to cancel and continue my search, but even with the additional charge, the service is a massive cost savings over traditional cable.
  • Weird content restrictions, especially with sports. Want to watch the NFL game that's on your local CBS affiliate? Well, I hope you want to watch it on your TV, because you're not allowed to watch the game on your phone, tablet, or computer. I know that, strictly speaking, this isn't Hulu's fault, but its still annoying as hell.
  • The client app, while very consistent from platform to platform, is a bit difficult to navigate.

The good news is that most of these problems are fixable with software updates, and even with these shortcomings, its still "good enough."

Next Steps

I'm going to keep my eye on Plex and its DVR functionality. If it ever manages to stabilize, I'll spend the time and money to set up a more powerful antenna, so I'll have the highest possible quality option for things like NFL and NCAA football games on the major broadcast networks. This would also give me a chance to re-evaluate Sling, and cut my costs even further. But, for now, I'm going to enjoy being free of AT&T/DirecTV.