Marty McGuire

Archive for January 2017

Tue Jan 31

The Baltimore Improv Group podcast returns with a super fun interview with hilarious improviser Clare Lochary!

Also featuring some wonderful scenes from BIG performers Ti Coleman, David Anthony, Clare Lochary, John Windmueller, Joel Murphy, Michael Harris, Marty McGuire, and Bridget Cavaiola.

Check the episode out, linked above! And subscribe via the Soundcloud app, I guess!

Thanks to our guests Tamara Blue Cavell-Allette, Maggie Phenicie, Kristen L. McKenzie, Sean Latta, and Nathaniel Tyson for making this episode a high-return investment!

post from Who Get Money? โ€ข Ep 39 - Stainless Jeans, Fried Chicken Coating, and Rising Star
The Investors surprise Marty and Jonathan with their choices when the Inventors pitch Stainless Jeans, Fried Chicken Coating, and Rising Star.
Sat Jan 28

Sonos services are fun case studies in user antipatterns. “Your music will be saved to the cloud to protect your purchases.” - which music?

Fri Jan 27

๐Ÿ—“๏ธ Hostel at BIG's Friday Night Laughs!

Single Carrot Theatre 2600 N Howard St Baltimore MD 21218
๐Ÿ“† Add to Calendar: iCal | Google Calendar

Join me and the warm and welcoming players of Hostel as we do make-em-ups for you onstage!

In the first half of the show, let Aftermath build a tower of improv to the sky!

You’ve got nothing to lose but an hour and $5!

Tickets available here:

Thu Jan 26

Stepping up my supporting-good-causes game at the Planned Parenthood of Maryland 90th Anniversary Archival Exhibit tonight.

โ€œIf you can order breakfast successfully in the morning, then you can be a great improviser.โ€ โ€“ Terry Withers

Pleasantly surprised to see my face (and towel) on a Baltimore Magazine article!

Spano - a minimum-viable Micropub Media Endpoint

Micropub is an open API standard to create posts on one's own domain using third-party clients  and currently a W3C Candidate Recommendation. One of the (semi-) recent additions is the idea of a Micropub Media Endpoint. The Media Endpoint provides a way for Micropub clients to upload media files to a Micropub service, receiving a URL that is sent along in place of the file contents when the post is published.

Some of the things I like about Micropub media endpoints include:

  • The spec allows the media endpoint to be on a completely separate domain from the "full" micropub endpoint.
  • The spec doesn't specify anything about how the files are stored or their final URLs or filenames.
  • They make it easy to separate the handling of (large) media files from the (presumably much smaller) content and metadata of a post.
  • They enable Micropub clients to upload multiple files without creating multiple posts. This makes it simpler to create posts that contain multiple images, like a gallery.

Personally, I wanted a Micropub media endpoint server with a few extra properties:

  • It should be able to run completely separately from, and therefore work in conjunction with, any other micropub server implementation.
  • It should not store duplicate files. If the same file is uploaded twice, the same URL should be returned both times.
  • It should not allow overwriting files. If two images of the same name are uploaded, both are kept and receive different URLs.

Enter HashFS

My extra features above essentially describe a content-addressable storage storage system. CAS is a way of storing and accessing data based on some property of the actual content, rather than (potentially arbitrary) files and folders.

HashFS is a Python implementation of a content-addressable file management system. You give it files, it will put them in a directory structure based on a cryptographic hash function of the contents of that file. In other words - HashFS can take any file and give back a unique path to that file which will never change (if you later upload a new version of the file, it gets a different path).

To add the the fun of HashFS, there is a Flask extension called Flask-HashFS which makes it easy to expose a HashFS file store on the web via the Python Flask framework.

Introducing Spano

Spano is a Micropub Media Endpoint server written in Python via the Flask framework which combines Flask-HashFS for file storage with Flask-IndieAuth (introduced earlier) to handle authentication and authorization.

Spano is a server-side web app that basically does one thing: it accepts HTTP POST requests with a valid IndieAuth token and a file named "file", stores that file, and returns a URL to that file. The task of serving uploaded files is left to a dedicated web server like nginx or Apache.

Using Spano

Once Spano has been set up and configured for your domain, uploading is a matter of getting a valid IndieAuth token. IndieAuth-enabled Micropub clients will do this automatically. For testing by hand I like to log in to Quill and copy the access token from the Quill settings page. With token in hand, uploads are as easy as:

curl -D - -F "file=@myfile.jpg" \
  -H"Authorization: Bearer xxxx..." \

Which should output a response like:

HTTP/1.1 100 Continue

Content-Type: text/html; charset=utf-8
Content-Length: 108
Server: Werkzeug/0.11.4 Python/2.7.11
Date: Thu, 26 Jan 2017 02:40:05 GMT

File created:

Integrating Spano with your Micropub Endpoint

If you want Micropub clients to use Spano as your Media Endpoint, you need to advertise it. This is handled by your "main" Micropub server using discovery. Essentially, a client will make a configuration request to your server like so:

And your server's response should be a JSON-formatted object specifying the "media-endpoint". A bare minimum example:

  "media-endpoint": ""

In addition to advertising the media-endpoint, your Micropub server must be able to handle lists of URLs in places where it would normally expect a file.

For example, when posting a photo from Quill without a media endpoint, your Micropub server will receive a multipart/form-data encoded file named "photo". When posting from Quill with a media endpoint, your Micropub server will instead receive a list of URLs represented as "photo[]=". Presumably this pattern would hold for other media types such as video and audio, if you are using Micropub clients that support them.

This particular step has been an interesting challenge for my site, which is a static site generated by Jekyll. My previous Micropub file-handling implementation expected all uploaded assets to live on disk next to the post files, and updating my Jekyll theme and plugins to handle the change is a work in progress. I eventually plan to move all my uploads out of the source for my project in favor of storing them with Spano.

Feedback Welcome!

Spano is probably my second public Python project, so I'd love feedback! If you try it out and run into issues, please drop me a line on GitHub. Or you can find me in the #indieweb chat on freenode IRC.

I'd also like to thank Kyle Mahan for his Woodwind Flask server application, which inspired the structure of Spano.

Flask-IndieAuth - A Python Library for Micropub Servers

One of the things I like about the IndieWeb community is that while they are building tools for themselves, they also tend to release useful parts under Free Software licenses. This helps other developers join the community more quickly, but it also tends to help improve the quality and feature sets of these projects as others use and add to the source.

One of my favorite things to come from the IndieWeb folks is the Micropub API standard, which defines some simple protocols for clients to send post data (the kinds of things you'd share on a blog or social media: images, short plain text, long articles, tags, and more) to servers for posting. One upshot is that if your server accepts Micropub, you can use one of many clients to put content on your site. I'm using a dedicated editor from Aaron Parecki's Quill to write this post, but there are lots of alternatives that are aimed at special use cases. For example, Kyle Mahan's Woodwind is an IndieWeb reader app that happens to include functionality for posting replies, favorites, reposts, and even RSVPs directly to my site via Micropub.

Another favorite is the idea of IndieAuth for web sign-in. At a high level, the idea is that you create two-way links between your website and your user profile on some other silo. For example, on your homepage you add a link to your Twitter profile and on your Twitter profile you link back to your homepage. For a client that supports IndieAuth, I can log in using my homepage URL by verifying that I can log in to my Twitter account.

My own personal Micropub implementation is a little pile of spaghetti Python code making use of the Flask framework. I use IndieAuth to handle authentication (i.e. - proving that a post comes from an app that I've logged into) and authorization (i.e. - proving that I gave that app permission to post to my site). As I've started improving my Micropub implementation, I found it useful to extract that portion of my code into a library that can be used with other Flask applications.

Introducing Flask-IndieAuth

Flask-IndieAuth is a Flask extension that adds the ability to require a client to send a valid IndieAuth token when making requests to any route. For example:

from flask_indieauth import requires_indieauth

@app.route('/micropub', methods=['GET','POST'])
def handle_micropub():
    # ... handle the request

The @requires_indieauth decorator runs before the code for the route. It currently looks for an IndieAuth token in one of three places, in order:

  • HTTP Header (e.g. "Authorization: Bearer xxxx...xx")
  • HTTP form data or query string (e.g. "?access_token=xxxx...xx")
  • The body of a JSON-encoded POST (e.g. {"access_token": "xxxx...xx"})

If a token is found, it will be verified against the configured Token Endpoint to confirm that it is a valid token issued for your server's configured homepage with a sufficient scope.

For more information on how to install, configure, and use Flask-IndieAuth, please check out the README on GitHub.

Next Steps

I'll be using this extension to build my Micropub media endpoint (coming up in a future post) and so far it is working just fine. That said, I know there is a lot of room for improvement. Some things on my list:

  • "scope" can have many values, but only "post" is supported for now. It should probably be passed as an argument to @requires_indieauth so different routes can have different requirements.
  • The configured homepage ("ME") is currently expected in the Flask app's config. I'm not sure if that's "standard".
  • "TOKEN_ENDPOINT" is currently expected in the Flask app's configuration, but since it is required to be specified in the HTTP headers for or as a <link> in the content for the homepage, this could be fetched by the server.
  • Error handling isn't great - all failure conditions currently return HTTP 400 (Bad Request) but should probably be diversified a bit.

Feedback Welcome!

This is my first published Flask extension (heck, it's my first public Python package on PyPI), and I'd really appreciate comments, questions, pull requests, etc. Feel free to reach out on GitHub, or you can find me in the #indieweb chat on freenode IRC.

From a few days ago. Part of the old Bethlehem, PA steel works, now a steelpunk art piece outside the venue for the wonderful Steelstacks Improv Comedy Festival.

What a blast performing with Remote Possibilities and having the chance to see a performance by and take a workshop from the Improvised Shakespeare Company!

Wed Jan 25

HWC Baltimore 1/25 Wrap-Up

Baltimore's first Homebrew Website Club of 2017ย met at the Digital Harbor Foundation Tech Centerย on 2017-01-25.

Notes from the "broadcast" portion of the meetup: - mf2 for deleted posts. Packaged and released his first Python package, a Flask IndieAuth lib for micropub servers, has a proof of concept micropub media server built on Flask-HashFS. - lots of WordPress IndieWeb plugins setup on his site. Has IndieAuth working. Thinks micropub is working. Also integrating these into humor/fake-advice site, POSSE to Medium. Discovered that people still use StumbleUpon and got some good traffic from there. - wrote down list of things to do to refresh portfolio site. Chose new color scheme and brought it into Sketch to start designing. New website will mean new logo, layout, etc., and eventually business cards based on that. Not sure if wants to use WordPress "because it's overkill". Discussed how he wants to "use" the site, as the author, since WP provides a nice CMS that supports lots of workflows. - did lots of refactoring of his Hugo theme into logical partials. Goal is to make a Hugo theme that supports IndieWeb via mf2 out of the box. Has also started making an ongoing list of all the changes he has been making, or wants to make, on his site.

We discussed the renewed IndieWeb interest in automatically archiving our posts and links to the Internet Archive, prompted by the content deletions and Twitter censoring of the new U.S. gov't administration. We also discussed the upcoming CryptoParty Baltimore happening in a little over a week on Feb 4th.


We hope you'll join us for the next HWC Baltimore meetups: Feb 8th and March 22nd!

Photo for tonight’s Homebrew Website Club Baltimore.

Fri Dec 30

๐Ÿ—“๏ธ Homebrew Website Club Baltimore Meetup 2017-01-25

Digital Harbor Foundation Tech Center 1045 Light St. Baltimore MD 21230
๐Ÿ“† Add to Calendar: iCal | Google Calendar

Create or update your personal web site!

  • Finish that blog post youโ€™ve been working on.
  • Demos of recent IndieWeb breakthroughs.
  • Share what youโ€™ve gotten working.
  • Ask the experts questions.

Join a community with like-minded interests. Bring friends that want a personal site!

Any questions? Ask in chat:

Optional quiet writing hour starts at 6:30pm. Meetup begins at 7:30pm.

More information:

Facebook event:

Tue Jan 24

Thanks to our guest Nate Tyson for making this episode a real trip down memory lane!

post from What's A Boy Supposed To Do? โ€ข Ep 1995 - Nate Tyson
Jonathan and Marty chat with Nate Tyson about the upcoming Logan film, his past with Dilbert, and more. The boys square off in another round of Do You Know Jack?
Mon Jan 16

๐Ÿ—“๏ธ Remote Possibilities at Steel Stacks Improv Festival!

๐Ÿ“† Add to Calendar: iCal | Google Calendar

In just a few days’ time the nation’s most popular staged improvised television show comes to the Steelstacks Improv Festival.

Tune in as I and the talented members of Remote Possibilities create for you the latest episode of a TV show that doesn’t exist!

Tickets available here!

Thu Jan 19
๐Ÿ” Reposted
post from
You lock your doors so why not lock your data? The next B'more #CryptoParty is at @DHFBaltimore Feb 4, 6pm-9pm.
๐Ÿ“— Want to read Empire Games (Empire Games #1) by Charles Stross ISBN: 9780765337566
๐Ÿ“— Want to read The Bloodline Feud by Charles Stross ISBN: 9780765378668
๐Ÿ“— Want to read The Revolution Trade (The Merchant Princes, #5-6) by Charles Stross ISBN: 9780765378682
๐Ÿ“— Want to read The Traders' War: A Merchant Princes Omnibus by Charles Stross ISBN: 9780765378675
๐Ÿ“— Want to read Walkaway by Cory Doctorow ISBN: 9780765392763
Mon Jan 16

๐Ÿ—“๏ธ BIG's FREE Open Mic!

Single Carrot Theatre 2600 N Howard St Baltimore MD 21218
๐Ÿ“† Add to Calendar: iCal | Google Calendar

Baltimore! It’s a new year and time to work on those (comedy) skills like you promised yourself you would!

Join me this Wednesday, January 18th at the Single Carrot Theatre as I host a night of comedy featuring… you! Baltimore Improv Group’s FREE Open Mic is a chance for stand-ups, improv troupes, sketch troupes, whatever-you’ve-got to strut your stuff on our stage!

Sign-ups start at 7pm, performances start at 7:30pm.

Performing is free, so come get some stage time!

Watching is free, so come get some free entertainment!

See you there!

Tue Jan 17

Thanks to our guest Matt Holmes for making this episode so technically accurate! Make sure to catch his show Matt And Improv!

post from How Do They Make That? โ€ข Ep 96 - Laughter with Sam Whitfield
Jonathan and Marty chat with Sam Whitfield about the sometimes surprising techniques that go into manufacturing the laughter we all take for granted.
Mon Jan 16

๐Ÿ—“๏ธ Lawful & Orderly: Special Visions Unit - Episode 2

๐Ÿ“† Add to Calendar: iCal | Google Calendar

Lawful & Orderly, a weekly live-streaming D&D series from The RPG Academy on Twitch which follows the magical case files of the High Guard Special Visions Unit.

The city of Lan Arcanym rests at a nexus of magical energy. That kind of power brings trouble… trouble that sometimes seems to spawn from thin air. The priests and seers of Lan Arcanym report their most disturbing visions to the fearless officers of LA:HG’s Special Visions Unit, who stop at nothing to see these cases through.

For more info, check out these previews:

Lawful & Orderly streams live Mondays from 8pm-10pm EST on The RPG Academy Twitch channel.

Can’t catch us live, or miss out on an episode? Past shows will be available on The RPG Academy’s Twitch, YouTube, and podcast channels.


๐Ÿ“• Finished reading Nemesis Games (The Expanse #5) by James S. A. Corey

Still loving the Expanse series!

Fri Jan 13
๐Ÿ“— Want to read Radical Technologies: The Design of Everyday Life by Adam Greenfield ISBN: 9781784780432
Tue Jan 10

Thanks to our guest Sarah Maher for keeping us looking to the future in this week’s episode of We Have to Ask

post from What Do You Have To Look Forward To? โ€ข Ep 2016 A - Sandra the Executive Producer of 2016
[Time Slip Detected] Celebrating the start of 2016, Jonathan and Marty interview Sandra, the executive producer for the year 2016, to see what she has in store.
Tue Jan 3

Thanks to everyone who came out to the 2017: The Year of Peak Sloth - Live Podcasting Event! Special thanks to our guest Heather Moyer for dealing out the healing in this week’s episode!

post from Why Is This Happening To Me? โ€ข Ep 49 - Dr. Sheila Taylor
In their second attempt at a live show, Jonathan and Marty begin to self-actualize with the help of Dr. Sheila Taylor.