👈🏼 🕸💍 👉🏼
Skip to main content

March, 2018


Lacey is out with friends tonight, so I’m treating the kids to their first ever viewing of Back to the Future in the home theater. 🚗💨⏰


Gorgeous view! Where are you?


Checked into Bouzy Gastropub

Another biz meeting.


For the first year in a long while, I’ve only seen one of the films nominated for Best Picture. Time to step up my movie watching game!


Congrats Eddie 😀


Made some tasty keto-friendly pancakes for breakfast this morning. Ricotta, eggs, and almond meal, sweetened with some Surkin Gold. Fried up in ghee and served with butter! 🥞


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.


Checked into Donut Den

Donuts for William! None for me, though.


Checked into Mama D's Italian Kitchen

Mama D's Italian Kitchen

Making pizzas with the kiddos.


Dinner tonight is sous vide New York strip steaks, bacon-wrapped pesto stuffed mushrooms, and roasted broccoli with garlic butter. 🥩🍄🥦


Well, that was one of the more delicious steaks I’ve ever prepared!


Looking good, but I think you mean Microsub, not Websub 😀


I've officially managed to copy all of my Facebook status updates and most of my photo galleries to my website. Just individual photos left to worry about.


Once I'm finished copying over individual photos, I'll complete my goal of completely extricating myself from Facebook by the end of 2018. 🎉


I’ve successfully copied all of my Instagram content to my website, from 2010 on. One step closer.


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.


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:


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.


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.


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 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:


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.


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.


I wish I had watched more of the films nominated for the Oscars!


I’m really enjoying using Together from iOS for reading and posting on the IndieWeb: https://cleverdevil.io/s/A94HmEbBLALplpcALmAc.mov


Well, @Hulu has been an absolutely terrible experience for watching the Oscars. I pay for no ads, but I get them. Audio gets out of sync. I get “playing this part of the video isn’t allowed” when attempting to rewind. Trash.


Replied to a post on werd.io :

I've been thinking along the same lines for some time! In fact, I have a feature on my website - https://cleverdevil.io/pages/subscribe - that uses Mailchimp's RSS to Email feature to send out daily updates to subscribers.


I now have a way for people to subscribe to my website via daily email newsletter. (Thanks, Mailchimp!)


Another addition to my website is my new "archive" page – https://cleverdevil.io/archive /cc @withknown


Unfortunately, the archive page doesn't quite look right on mobile devices, yet. I'll need to consult some smarter CSS friends :)


Checked into Yard House

Meeting up with an old friend.


Started working on a JSON Schema for microformats2 about a week ago. Posted the first version on GitHub tonight – https://github.com/cleverdevil/microformats2 – Feedback welcome!


Checked into The Portofino Hotel & Marina

RHLS gala with neighbors.


Everyone welcome my lovely wife @cleverangel to Micro.blog! She's hosted on Micro.blog at her domain http://cleverangel.org.


If you think Daylight Savings Time sucks, just wait until you’re a parent and DST hits.


Microsub has really been the missing piece of the puzzle. I love using Together + Aperture every single day. Nice work on the spec 😀


Highly recommend the new Netflix series Ugly Delicious with David Chang. It’s an entertaining and thoughtful exploration of food, culture, and the strength of diversity. ❤️


OMG, I am starting episode 4 of Ugly Delicious, and the open is about Galatoire’s, one of my all time favorite restaurants. French Quarter classic, LaCour family Mecca 😉


I blogged a thing about @awscloud for @reliam. Looking forward to this entire series.



Checked into suburbia

Dinner with Billy Lawder visiting from St. Louis.


The best cheese on a burger is the brightest, most unnatural yellow American cheese you can find.

Prove me wrong.


Great anecdote that is equally applicable to software! I’ve managed too many developers obsessed with producing perfectly formed diamonds. Iterate!



San Francisco, I will be in you March 26-28. Hoping to set up some meetings. Let's talk cloud!


Checked into Rolling Hills Country Club

Dinner with the Morans. 🍀


I’m prepping my MacBook Air and 2016 MacBook Pro for sale, so I can invest in an iPad Pro for personal use.


Someone needs to make a bluetooth mechanical keyboard purpose-built for the iPad, portability and quality being the focus.


Checked into El Camp

Inaugural South Bay AWS meetup!


Excited to be hosting the inaugural South Bay Los Angeles @awscloud User Group at the gorgeous El Camp in El Segundo tonight! The whole @Reliam crew is here. ☁️🚀


Checked into Burke Williams Spa

Anniversary massages with Lacey 😀


I've officially deleted my Facebook account, and it will disappear completely from Facebook within 14 days. It feels great.

I hope they go down in flames.


Made an epic keto chicken curry for dinner tonight. Wowza! Delicious.


The obstacles I hear for getting off Facebook is “there is no good alternative for <X>,” where X is:

* Private groups (school parent groups, etc.).
* Event mgmt.

Market opportunity will create alternatives, but only if ppl leave Facebook.


This is a ridiculously dumb take. Leaving Facebook has zero to do with privilege. People have no obligation to “help Facebook be better.” They’re a business. They’ve violated trust. Leave.



Welp, @nealstephenson’s Snow Crash continues to be prescient. Facebook is building a burbclave.

I’d prefer Mr. Lee’s Greater Hong Kong, tbh.



Recipe: Keto-Friendly Instant Pot Thai Chicken Curry


  • 1 stalk fresh lemongrass, trimmed down, and grated
  • 4 cloves garlic, grated
  • 1 small piece of peeled ginger, grated
  • 2 tablespoons fish sauce
  • 3 tablespoons coconut aminos
  • 2 cups full-fat coconut milk
  • 6 boneless, skinless chicken thighs
  • 1 teaspoon kosher salt
  • ½ teaspoon freshly ground black pepper
  • 1 teaspoon ghee
  • 1 large onion, chopped
  • 4 tablespoons red curry paste
  • 1 kabocha squash, peeled, seeded, and cubed into large chunks
  • 1 bag riced cauliflower

Takes . Serves Six servings.

Earlier this week, I had a strong craving for Thai red curry. Because I am currently on the Keto diet, I have to be extra careful about ordering from restaurants, who often use added sugars, or cabohydrate-laden thickeners when preparing their meals. That meant preparing something on my own. I was short on time, so I wanted something that could be prepared quickly, which inspired me to use my Instant Pot electric pressure cooker. I found a good starter recipe on Nom Nom Paleo, and revised it a bit to end up with this recipe.

Set the Instant Pot to sauté and add the ghee. Season the chicken thighs with kosher salt and freshly ground black pepper, then brown them thoroughly on both sides in batches. Don't overcrowd the pot, or the thighs will steam.

Remove the chicken, and add the onions to the pot, along with additional salt. Sauce until onions are translucent, and then add the coconut aminos and fish sauce, using the liquid to help scrape up the fond from the bottom of the pan. Add the garlic, ginger, and lemon grass, and cook for 1 minute. At this point, add the curry paste, and stir to coat the vegetables. Things should smell quite nice at this point!

Add the kabocha squash and cononut milk, and stir to combine. Then, nestle the browned chicken into the liquid, seal the Instant Pot, and set to 15 minutes on high pressure. When finished cooking, quick release the Instant Pot, remove the chicken, and chop it into large bite sized pieces. Add the chicken (and juices) back to the pot, stirring to combine. Serve over lightly steamed cauliflower rice.



While it is electron-based, I actually am really digging on Oni, an editor that embeds NeoVim into a beautiful user experience – https://www.onivim.io


I’ve been beta testing the upcoming release of @Infuse for tvOS and iOS, which integrates natively with @Plex. Finally, home theater quality audio and video playback for Apple TV 4K! Amazing. ❤️


Hey, San Francisco, I still have availability on the 26th and 28th, if anyone wants to meet up for lunch/drinks/etc.


Sold my old MacBook Air for $475, and just sent my old 2016 MacBook Pro off to Apple to get its screen replaced. It should be up for sale next week, if all goes to plan! 😀


Oh, joy, I’ve cracked the back glass on my iPhone X.


Woke @marcoarment is my favorite @marcoarment.


See you in an hour, San Francisco! 🌇


Checked into TRES

Dinner with Nolan.


Congratulations to @aaronpk on his new gig with @oktadev! They got themselves a good one 😀 – https://developer.okta.com/blog/2018/03/27/welcome-aaron-okta


The @Delta SkyClub at SFO has Woodford Reserve Double Oaked at the bar. ❤️

Also, I wish the SkyClubs at LAX weren’t so awful in comparison :/


Checked into Los Angeles International Airport (LAX)

Hey hey, LA. Saw the new stadium under construction. Looks epic!


I finally found a mechanical keyboard suitable for @askForCharon! https://datamancer.com/product/the-sojourner-keyboard/


I find it truly obnoxious when I make an appointment with my doctor, and they just sit me in a room alone for 45 minutes before finally showing up. So disrespectful of my time.


Replied to a post on tantek.com :

Yes: Looking forward to attending the San Francisco Homebrew Website Club on April 4th next week!


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!


Checked into Bouzy Gastropub

Quick dinner and drinks.


I’m pretty sure the Frangelico lady is Miss Butterworth’s dirty older sister.


I’m selling my 2016 13” MacBook Pro - https://swappa.com/listing/view/LRDL45545