From IndieWeb

Marty McGuire

Marty McGuire


Marty McGuire is a web developer in New York, NY, USA.

Elsewhere: Twitter GitHub

IndieWeb Projects

Code / Services


My IndieWeb Setup is my primary home where I post many things via micropub, typically with Quill

  • videos
    • posted via iOS Shortcuts over micropub. Most notably, Eternal Caturday.
    • occasionally I manually upload to my micropub endpoint and create posts by hand. is a podcast website that I run "IndieWeb-style" where I post via micropub.

  • audio posts are posted via Screech. Manual PESOS from Facebook ( as episodes are now recorded during livestream broadcast to Facebook Live.
    • Posting each episode is a multi-step process that involves:
      1. Creating the post via Screech
      2. POSSE to Twitter and FB manually
      3. Edit the original post with micropublish to add syndication links (via micropub update)
      4. Syndicate from my personal accounts
        1. Like and Share on Facebook
        2. Manually PESOS my FB post to my site via Quill. Add syndication link with micropublish via micropub update
        3. Send webmentions from my site with Telegraph
      5. Like and share from the parent podcast network's Twitter and Facebook

Syndication links are added manually for any POSSE copies for all of my sites.

Webmentions for replies, likes, reposts, and general mentions are sent automatically for my site whenever they are published. (Previously all were sent manually using Telegraph).

Likes (and other reactions), reposts, replies, and mentions from the IndieWeb as well as syndicated copies on Twitter and Facebook are automatically received by and

  • They are automatically displayed on my site whenever it is re-built (either in response to a new post or when I trigger it manually).
  • I follow the mentions feed for my sites in my Notifications channel in my social reader.

Silo Posting

While I try to treat silos as purely places where I publish syndication, there are still some things I will post only to silos.

  • Twitter
    • Some likes, retweets, and even quick replies that I don't consider "long-term relevant" enough to keep on my site. As of 2022 I only share stream announcements on Twitter. As of 2022-11, not even those.
  • Facebook
    • Livestreams for my podcast site happen here and the resulting videos stay here, though the resulting audio and video are also posted to our indie site.
    • I typically do not post FB reactions such as likes, loves, "haha", etc. to my site. In general I am trying to stop using Facebook reactions (because dang and gosh).
    • Responses to prompts from FB like encouragement to send birthday posts. I am also using these less and less.
    • Comments to other people's FB posts. Unless I started the thread, I generally don't think it's appropriate to copy it to my site.
  • Twitch
    • I am part of a weekly livestream at [1]. These can be viewed from our site [2] via a Twitch embed but do not generally live on the site.
      • We do have an archive of some (distant) past episodes as a podcast on the site.

Personal Site - is my personal website.

What Works

  • Identity h-card and rel-me links to some silo accounts.
  • micropub using a custom PHP endpoint.
    • File uploads go to a separate media endpoint, running on Spano.
    • I typically post using a handful of Micropub clients
      • Using Quill from my laptop browser, often via bookmarklets.
      • Events are posted via Slater
      • Audio content such as podcasts are posted using Screech
      • Videos posted from my phone via custom iOS Shortcuts.
  • short domain
    • permashortlinks using newbase60 to convert permalink paths into 6 characters (3 for days-since-epoch, 3 for seconds-since midnight)
    • Custom Hugo templates make these available to posts when rendering
    • Custom Flask endpoint resolves these when visiting Unparseable requests are redirected as-is.

Supported Content Types


Articles (example)

Events (example)

  • u-featured poster image
  • location is handled with a pseudo-nicknames-cache. Each post stores location as a string. If location is a URL that matches an entry in my collection of common venues [3], it's dereferenced into an h-card when being rendered.
  • Each event page has Calendar Reminders links for ICS(iCal) format and Google_Calendar.
  • front page
    • upcoming events that i post to my site appear on my front page
    • upcoming events that I've RSVP'd to appear on my front page if the RSVP target has an h-event
      • RSVP'd events have a specially stylized display that includes start date and time, or span of days if multiple days (example)

Reposts (example, example)

Bookmarks (example)

Checkins (example)


Previously POSSE'd via manual bridgy publish to Twitter and Facebook. I don't do this so much anymore, but I maintain historical posts.

Display links to syndicated posts (added 2017-02-27)


Accepting webmentions via, which sends via webhook to a local morris service which stores them in static-site-compatible JSON format.

Each post page has a simple form for sending a webmention to the page by entering the source URL.

Backfeed from Twitter and Facebook via bridgy is supported for POSSE'd posts, but there aren't many of those now.


Custom search?

This looks neat:

More coherent design

  • better accessibility for photos and videos
  • typography! colors! process-driven thought into what goes on what pages! better accessibility!
  • move /posts to front page? maybe latest 30, link back to monthly archive?
  • move responses (likes, reposts, reacji) to a "posts and replies" page?

Clean Up Webmentions


  • reduce noise
    • my webmention sender gets triggered by any changes to a published permalink'd post, including when the post template changes. this could result in resending every webmention 😱.
      • could keep track of sent mentions and not resend when "content is unchanged". requires some template-independent diff engine. maybe hashed mf2+json.
    • could disable the webmention sender under certain conditions:
      • ✅ if some threshold of changed posts? (stops WM sending if there are more than 50 posts to send mentions for)
      • if the list of recently changed source files doesn't include any content files?
      • if the list of changed source files includes any template files?
    • (is this still a problem?) don't send WMs to authors' homepage when a post links to their post.
      • would need to be h-entry aware, ignore author info.

Incoming (Morris)

  • handle deletes!
  • keep changes over time?
  • re-build on new mentions so they show up right away
  • display homepage mentions (this is a whooooole thing)
    • I subscribe to's feed for my homepage in my feed reader and they go to my "Notifications" channel. This is plenty good for me!

private posts

  • published: false will prevent the page from being rendered at all. maybe good if I want to host those behind another domain or path w/ an access controller in front.
  • also: "not in main stream posts" that maybe get their own types.

Lazy Load Embeds

Privacy Policy and Privacy Improvements

Like this one by Daniel Goldsmith

Pano micropub client

  • photo
  • some metadata that indicates it's a pano

backfill old posts

  • tweets??
  • thingiverse bonus: comments, likes, and makes of my things.

post my own videos

This is mostly an improvement for Screech, which could post these files successfully as "video" like it already does for "audio", "photo". Or: it's a new single-purpose Micropub client?

(I use Shortcuts on my phone to post videos from there via Micropub just fine. Video examples)

event posting improvements

These are mostly improvements to Slater, since my site (should) support them all.

  • A venue search with typeahead (like Quill does)
    • this sends an h-card w/ name, lat, lon, and other fields pulled from the Google Places API
    • could also set TZ automatically based on location / date.
    • i'm also interested in foursquare's venue API for this. dunno if they have typeahead support. Self-hosting Meridian to made Open Street Map data searchable feels better!
  • ✅ "duplicate this event" like Facebook allows
  • ✅ faster date/time entry. i really like how's works in terms of keyboard nav.
    • smart autocomplete. e.g. typing "6" into the hours field sets the hours to 06 and jumps to minutes. "6:30PM" can be set by typing "630p" I'm satisfied with how native HTML "date" and "time" inputs do this!

No Longer Itches

  • do i dare ActivityPub my site?
    • I did! Using Bridgy Fed.
    • The way Bridgy Fed consolidates your follows into a single feed for your reader is GREAT.
    • Choosing which posts to syndicate via Bridgy Fed is done using a Micropub syndication target, so I can (and do) pick and choose.
      • The only thing that itches about this is I don't know of a Micropub client that lets me both quickly make a Like _and_ offers syndication options. So that has to be done manually (make the like, edit the post to add syndication).
      • I have a somewhat complicated follow setup whereby I make follow posts and syndicate them to This works, but I forget how unfollow works. Also, Bridgy Fed has a UI for this now.
  • track listens?
    • "listen-of" => 🎧, "Listened to this"
    • I use Overcast on my iPhone to listen to podcasts. Based on's work, I made a script to create listen-of posts from Overcast's "everything" OPML export. I run this kind of whenever I feel like it, and to keep from crowding my main posts page, listens live at [4]. Will make a new display someday!
  • archives by month/year
    • cleaned these up for my Hugo rewrite at IWC Berlin 2018. example 2017-09 month view, example 2017 year view.
    • inspiration from Rob Weychert
      • great typography/layout!
      • also some great ways to browse
        • source / "also on"
        • type (e.g. movie review)
        • categories/tags
        • year/month
    • ALSO: better next/prev navigation include keyboard nav for left/right? meh. i am content with the details/summary sidebar i have now.
  • speed everything up
    • Port to Hugo. It was a big task but I did it, dangit! At this point I don't even remember when I finished that, haha.
  • Webmention sending
    • 2018-04 I implemented automatic WM sending in my hook-publish handler
      • It uses rsync output to determine what permalink pages are new or updated, parses them for the main h-entry and pulls out "appropriate" links for which to send webmentions.
    • Previously I used the Telegraph service, manually. I wanted a service that:
      • subscribes to my site updates via websub
      • does all the things that lazymention does
      • maybe limit to "relevant" links to send notifications about
        • like-of, in-reply-to is obvious. plain url mentions only in e-content?
        • ignore links in h-entry properties like author, syndication - maybe?
      • if given a status URL, save that too and check later. either on a job queue or manual, probably.
      • UI to review webmentions
  • better reply contexts
    • 2017-12 I switched to using XRay when I rewrote my hook-publish handler in PHP.
    • previously used the ruby microformats2 gem to get mf2 data, XRay for posts.
    • would like to support posts with microdata markup example)
      • that microdata was embedded in a JSONP-like call, yuck. instead, made a custom parser for Soundcloud that extracts the "sound ID" and creates an embed. not great but provides a reasonable reading experience at the moment.
    • would like to support posts with mf1 markup example) (XRay does it well)
    • would like to support posts with json-ld markup example) (the referred post 410s now)
  • use AntennaPod history for creating listen posts
    • i no longer use an android device, so no antennapod.
    • it seems to integrate with gpodder. Possibly only syncing subscription list (OPML?) But possibly also supporting per-episode events.
    • can self-host the gpodder server
    • those events could become listen posts on my site
    • see above about tracking listens with Overcast!
  • websub notifications for tag pages (already work for my /posts/ page)
    • cleaned up my websub handling when i rewrite my hook-publish compile handler in PHP.
    • uses rsync results to see what files actually changed. filters out pagination but includes tag pages and individual pages.
  • Better handling of incoming webmentions
    • tool to slurp data into static files suitable as Jekyll or Hugo data files
    • web hook to accept notifications from wmio and, add the new mention to the data store, and rebuild the site
    • this is now handled by morris
  • an unhosted evernote knockoff using as my backend
    • I'm happy enough with laverna at the moment, though I haven't yet migrated any old notes in and support for files/images is limited/broken.
    • after some syncing issues with laverna i gave up on this and exported to my own personal notes site system. it's an indieauth protected private site built on hugo. fun!
  • an internet archive style backup that snarfs pages that i want to bookmark into my notes
    • I'm happy enough with pinboard at the moment. ¯\_(ツ)_/¯
  • posting my own video without relying on silos. I post these very rarely. Currently happy w/ an Automator action a shell script that posts files from my laptop to my media endpoint and making a new post with a video property that gets embedded.
    • micropub client for video!
      • want to select a poster image, if possible
      • and what else?
    • storage (happy enough w/ my micropub media endpoint, which I could set up with a CDN if desired
  • Want a better way of interpreting incoming WMs in a notifications-friendly way.
    • i use my reader to subscribe to the feed for my domain in a "Notifications" channel. this has been plenty fine for me, and I haven't been craving anything real-time.
    • de-dupe! i shouldn't get multiple notifications for a given post just because the mention is sent again
    • mf2-awareness!
      • i shouldn't get a notification if there's a new comment on a post i'm mentioned in
        • maybe my notifier could let me opt-in to follow replies? maybe i already could with Aperture??
      • i should (maybe) get a notification if a post i'm mentioned in is updated, content-wise
      • be aware of like, repost, bookmark, listen, and other verbs. ("so-and-so liked ...")
      • be aware of person-tags (e.g. "so-and-so tagged you in...")
      • be aware of other attributes like post-type-discovery (e.g. "... posted a photo of you", "mentioned you in a checkin", ...)
  • pinned posts for tag pages?
    • first use-case - i want to be able to describe an h-feed on, e.g. the This Week in the IndieWeb podcast page as a stepping stone to mf2-to-RSS (or Atom) with enclosures and all that good stuff.
      • implemented this with a separate "podcast" kind of jekyll. it's configured w/ all the podcast metadata as well as a tag to pull posts from.
      • In the move to Hugo I made a "podcast" "type", similar to jekyll.
    • need another use-case for this before it becomes an itch again.
  • Micropub De-Duping
    • I thought I'd like to catch and reject posts that might be considered "dupes". e.g. don't let me like or bookmark posts more than once.
    • read-of: might audit these someday. Duplicates here feel fine to me, honestly. I have read some books multiple times, and multiple "want-to-reads" remind me that some books come to my attention more than once!
      • difficulty: only if read-status is the same as latest read-of post for the same read.
      • more difficulty: read-of is often some title + author string (+ optional ISBN), so dupe detection is weird
    • like-of upon review 2022-11 i had only made ~11 dupe likes out of > 1250 like posts over 6 years. doesn't feel worth it to build a whole thing for this.
    • repost-of upon review 2022-11 i had only made 1 dupe out of 47 reposts in 6 years.
    • bookmark-of 2022-11 review: 0 dupes out of 46 bookmarks in 6 years
    • others?
  • Automating POSSE (w/ bridgy publish and/or
    • i have stopped syndicating stuff to FB and Twitter as I have pretty much stopped using them. i might end up wanting to do something for activitypub and revisit this, but ... maybe not! for now i am OK with my website being what it is.
    • ✅ micropub syndication query for Quill's syndicate-to feature
    • ✅ embed syndication links for POSSE via webmention
    • send webmentions and save response to post's syndication section
      • currently this is through Telegraph and is as many or more steps as manual POSSE and using to add the syndication links back
      • want to automate this at some point
        • a micropub client that supports the SE in POSSE with my workflow?
          • queries for mp-syndicate-to URLs for a given post
          • some support publishing via webmention and the wm request returns a reply w/ a permalink that could be sent back w/ a micropub update
            • also works for this
          • harder: recognize other kinds of posts and do them.
            • e.g. requires micropubs, probably parsed from the h-entry on the post.

Notes on Domains

The .re TLD is a geographic top-level domain for the island of Réunion. I used 101Domain as my registrar because they support setting up a business entity in the country (for a fee), a requirement for domain registration there.

I also have a mirror of my site running as a Tor Onion Service at http://martymcgfuraocsgy2a25btl5srhifcdud6m4eiphz2mq6fafttwh7qd.onion/. Advertised via the Onion-Location HTTP header.

Podcast Site -

We Have to Ask is the site for a podcast I co-host.

Each episode is a post with an audio player and usually has a featured image and video. The site also hosts an RSS feed for various podcast directories.

These days we record episodes live via Facebook Live, and treat the resulting Facebook video post as a syndication post of the episode on our site.

What Works

  • IndieAuth via self-hosted Belding instance.
  • Micropub via custom self-hosted service.
  • Statically compiled website.
  • mf2 for episodes
    • h-feed on front page
    • h-entry with u-audio (and usually u-featured, and u-video)
  • POSSE to Facebook and Twitter via bridgy publish. Syndication links displayed as "Join the discussion on {silo}".
  • Backfeed silo interactions on POSSE copies via bridgy and
    • We still accept webmentions. However we no longer POSSE to Twitter, and there is no good way to backfeed responses from Facebook. So, we don't actually get any responses on the site these days.

Working On



  • micropub media endpoint so Screech can make progress while text etc. get written.

No Longer Itches

  • "Bake in" webmentions at compile time
    • this is now handled by morris and's webhooks
  • Automating POSSE with webmentions
    • Works well with Twitter. Need to automate handling response. micropub update, possibly.
    • Doesn't work so well with FB. Facebook doesn't do the automatic link content extraction and embedding when posting this way.
    • We technically sort-of PESOS from Facebook because the episodes begin as a Facebook Live stream, and the resulting Facebook video post serves as our "POSSE copy" there.
  • ✅ Add representative images for each episode
    • Screech supports "featured" image upload