mention.tech

Receiving webmentions for everyone

source:
target:
url:
url:
10 years ago today the first #federated #IndieWeb comment thread was published and collected peer-to-peer IndieWeb replies across websites without any intermediary, silo or otherwise¹.2013-04-19 twitter.com/eschnou.com posted a brief note on his personal site with #atMentions of a few domains (putting an '@' sign immediately before a domain name to indicate an explicit cross-web @-mention), which itself was also a first² "Testing #indieweb federation with twitter.com/waterpigs.co.uk, twitter.com/aaronparecki.com and twitter.com/indiewebcamp.com !"When twitter.com/aaronpk.com was notified and replied from his site within minutes³, it became the first peer-to-peer federated IndieWeb comment thread, at the time using h-entry and Pingback. I blogged about it a few days later⁴.Earlier this year I blogged more observations of all the user interactions that happened on that day and shortly thereafter to make this all work: tantek.com/2023/014/t4/domain-first-federated-atmentionUnfortunately Laurent Eschnou’s original post is no longer up, and we only have the Internet Archive copy. However most of the IndieWeb reply posts are still up including Barnaby’s: waterpigs.co.uk/notes/1334/The oldest still working federated post and comment thread was second overall, unsurprisingly from twitter.com/aaronparecki.com⁵, a whole 40 days after Laurent’s first.This is day 37 of #100DaysOfIndieWeb. #100Days #OpenWeb #federation #fediverse← Day 36: tantek.com/2023/100/t1/auto-linked-hashtags-federated→ Day 38: tantek.com/2023/110/t2/beyond-mastodon-indieweb-own-domainGlossaryfederation indieweb.org/federationh-entry microformats.org/wiki/h-entryPingback indieweb.org/Pingbackreply post indieweb.org/replyReferences¹ web.archive.org/web/20130427010301/http://eschnou.com/entry/testing-indieweb-fed…² tantek.com/2023/014/t4/domain-first-federated-atmention³ aaronparecki.com/2013/04/19/3/indiewebtantek.com/2013/113/b1/first-federated-indieweb-comment-threadaaronparecki.com/2013/05/21/4/xkcd
mentioned aaronparecki.com/2013/05/21/4/xkcd mention sent '201'
10 years ago today the first #federated #IndieWeb comment thread was published and collected peer-to-peer IndieWeb replies across websites without any intermediary, silo or otherwise¹.2013-04-19 twitter.com/eschnou.com posted a brief note on his personal site with #atMentions of a few domains (putting an '@' sign immediately before a domain name to indicate an explicit cross-web @-mention), which itself was also a first² "Testing #indieweb federation with twitter.com/waterpigs.co.uk, twitter.com/aaronparecki.com and twitter.com/indiewebcamp.com !"When twitter.com/aaronpk.com was notified and replied from his site within minutes³, it became the first peer-to-peer federated IndieWeb comment thread, at the time using h-entry and Pingback. I blogged about it a few days later⁴.Earlier this year I blogged more observations of all the user interactions that happened on that day and shortly thereafter to make this all work: tantek.com/2023/014/t4/domain-first-federated-atmentionUnfortunately Laurent Eschnou’s original post is no longer up, and we only have the Internet Archive copy. However most of the IndieWeb reply posts are still up including Barnaby’s: waterpigs.co.uk/notes/1334/The oldest still working federated post and comment thread was second overall, unsurprisingly from twitter.com/aaronparecki.com⁵, a whole 40 days after Laurent’s first.This is day 37 of #100DaysOfIndieWeb. #100Days #OpenWeb #federation #fediverse← Day 36: tantek.com/2023/100/t1/auto-linked-hashtags-federated→ Day 38: tantek.com/2023/110/t2/beyond-mastodon-indieweb-own-domainGlossaryfederation indieweb.org/federationh-entry microformats.org/wiki/h-entryPingback indieweb.org/Pingbackreply post indieweb.org/replyReferences¹ web.archive.org/web/20130427010301/http://eschnou.com/entry/testing-indieweb-fed…² tantek.com/2023/014/t4/domain-first-federated-atmention³ aaronparecki.com/2013/04/19/3/indiewebtantek.com/2013/113/b1/first-federated-indieweb-comment-threadaaronparecki.com/2013/05/21/4/xkcd
mentioned aaronparecki.com/2013/04/19/3/indieweb mention sent '201'
10 years ago today the first #federated #IndieWeb comment thread was published and collected peer-to-peer IndieWeb replies across websites without any intermediary, silo or otherwise¹.2013-04-19 twitter.com/eschnou.com posted a brief note on his personal site with #atMentions of a few domains (putting an '@' sign immediately before a domain name to indicate an explicit cross-web @-mention), which itself was also a first² "Testing #indieweb federation with twitter.com/waterpigs.co.uk, twitter.com/aaronparecki.com and twitter.com/indiewebcamp.com !"When twitter.com/aaronpk.com was notified and replied from his site within minutes³, it became the first peer-to-peer federated IndieWeb comment thread, at the time using h-entry and Pingback. I blogged about it a few days later⁴.Earlier this year I blogged more observations of all the user interactions that happened on that day and shortly thereafter to make this all work: tantek.com/2023/014/t4/domain-first-federated-atmentionUnfortunately Laurent Eschnou’s original post is no longer up, and we only have the Internet Archive copy. However most of the IndieWeb reply posts are still up including Barnaby’s: waterpigs.co.uk/notes/1334/The oldest still working federated post and comment thread was second overall, unsurprisingly from twitter.com/aaronparecki.com⁵, a whole 40 days after Laurent’s first.This is day 37 of #100DaysOfIndieWeb. #100Days #OpenWeb #federation #fediverse← Day 36: tantek.com/2023/100/t1/auto-linked-hashtags-federated→ Day 38: tantek.com/2023/110/t2/beyond-mastodon-indieweb-own-domainGlossaryfederation indieweb.org/federationh-entry microformats.org/wiki/h-entryPingback indieweb.org/Pingbackreply post indieweb.org/replyReferences¹ web.archive.org/web/20130427010301/http://eschnou.com/entry/testing-indieweb-fed…² tantek.com/2023/014/t4/domain-first-federated-atmention³ aaronparecki.com/2013/04/19/3/indiewebtantek.com/2013/113/b1/first-federated-indieweb-comment-threadaaronparecki.com/2013/05/21/4/xkcd
mentioned aaronparecki.com mention sent '429'
I’ve added Webmention support to the posts on this blog. Webmentions are a method for websites to know that they’ve been linked to (or mentioned) from elsewhere on the web. Webmention is a web standard for mentions and conversations across the web, a powerful building block that is used for a growing federated network of comments, likes, reposts, and other rich interactions across the decentralized social web. When you link to a website, you can send it a Webmention to notify it. If it supports Webmentions, then that website may display your post as a comment, like, or other response, and presto, you’re having a conversation from one site to another! It depends on a couple of things being in place for it all to work, but I’ve implemented the basics to fetch and display any mentions that have been detected by the webmention.io service. I have already been using Github Issues-powered commenting for the past couple of years, so I took the time to consolidate comments and Webmentions in to a single chunk of “interactions” functionality to fetch, cache, and render any comments or Webmentions. This is all done with native JS and could probably be improved further with a framework like Vue.js, but it works fine for now. I’m using brid.gy to recieve Webmentions from Twitter and Reddit interactions via webmention.io — this will mean that if somebody shares/likes/retweets a link to one of my blog posts on either platform it will display that here below the post. I’m using webmention.app and IFTTT to automatically try and send webmentions to sites I link to from within my posts. As you can see it’s a bit complicated, and it feels like it’s held together with duct tape in places, but for now it works! Lots of others have written about how they’ve implemented Webmentions on their sites, and these write-ups were really useful when arriving at my own implementation. So to share the love, here are some links to those posts: Webmentions - Phil Gyford Webmentions for your Static Site - Rowan Manning Using Web Mentions in a static site (Hugo) - Paul Kinlan Adding Webmention Support to a Static Site - Keith J. Grant Adding Webmentions to My Static Hugo Site - Ana Ulin Using Webmentions in Eleventy - Max Böck Webmentions: Enabling Better Communication on the Internet - Chris Aldrich Add Webmention support to your website in ten minutes - Daniel Aleksandersen Sending your First Webmention from Scratch - Aaron Parecki Implementing Webmention on a static website - Deluvi Adding Webmention Support from Scratch - Dwayne Harris Social media responses on a Jekyll site using webmentions - James Dinsdale Adding webmentions to my blog - Sebastian De Deyne A Brief Look at WebMention - Ben Shi IndieWebify.Me And that’s about it really. I’ll be tweeting a link to this post once it’s published and then any replies or likes will hopefully appear at the bottom of the page.
mentioned aaronparecki.com/2018/06/30/11/your-first-webmention mention sent '201'
A (very) belated follow up to Getting Started with Microformats 2, covering the basics of consuming and using microformats 2 data. Originally posted on waterpigs.co.uk. More and more people are using microformats 2 to mark up profiles, posts, events and other data on their personal sites, enabling developers to build applications which use this data in useful and interesting ways. Whether you want to add basic support for webmention comments to your personal site, or have ambitious plans for a structured-data-aware-social-graph-search-engine-super-feed-reader, you’re going to need a solid grasp of how to parse and handle microformats 2 data. Choose a Parser To turn a web page containing data marked up with microformats 2 (or classic microformats, if supported) into a canonical MF2 JSON data structure, you’ll need a parser. At the time of writing, there are actively supported microformats 2 parsers available for the following programming languages: Go Javascript (server-side and browser) PHP Python Ruby Rust Parsers for various other languages exist, but might not be actively supported or support recent changes to the parsing specification. There are also various websites which you can use to experiment with microformats markup without having to download a library and write any code: My own live-updating php-mf2 sandbox The various parser comparison tools hosted on microformats.io Aaron Parecki’s pin13.net microformats parser for parsing either URLs or HTML fragments If there’s not currently a parser available for your language of choice, you have a few options: Call the command-line tools provided by one of the existing libraries from your code, and consume the JSON they provide Make use of one of the online mf2 parsers capable of parsing sites, and consume the JSON it returns (only recommended for very low volume usage!) Write your own microformats 2 parser! There are plenty of people happy to help, and a language-agnostic test suite you can plug your implementation into for testing. Considerations During Fetching and Parsing Most real-world microformats data is fetched from a URL, which could potentially redirect to a different URL one or more times. The final URL in the redirect chain is called the “effective URL”. HTML often contains relative URLs, which need to be resolved against a base URL in order to be useful out of context. If your parser has a function for “parsing microformats from a URL”, it should deal with all of this for you. If you’re making the request yourself (e.g. to use custom caching or network settings) and then passing the response HTML and base URL to the parser, make sure to use the effective URL, not the starting URL! The parser will handle relative URL resolution, but it needs to know the correct base URL. When parsing microformats, an HTTP request which returns a non-200 value doesn’t necessarily mean that there’s nothing to parse! For example, a 410 Gone response might contain a h-entry with a message explaining the deletion of whatever was there before. Storing Raw HTML vs Parsed Canonical JSON vs Derived Data When consuming microformats 2 data, you’ll most often be fetching raw HTML from a URL, parsing it to canonical JSON, then finally processing it into a simpler, cleaned and sanitised format ready for use in your website or application. That’s three different representations of the same data — you’ll most likely end up storing the derived data somewhere for quick access, but what about the other two? Experience shows that, over time: the way a particular application cleans up mf2 data will be tweaked and improved as you add new features and handle unexpected edge-cases mf2 parsers gradually get improved, fixing bugs and occasionally adding entirely new features. Therefore, if it makes sense for your use case, I recommend archiving a copy of the original HTML as well as your derived data, leaving out the intermediate canonical JSON. That way, you can easily create scripts or background jobs to update all the derived data based on the original HTML, taking advantage of both parser improvements and improvements to your own code at the same time, without having to re-fetch potentially hundreds of potentially broken links. As mentioned in the previous section, if you archive original HTML for re-parsing, you’ll need to additionally store the effective URL for correct relative URL resolution. For some languages, there are already libraries (such as XRay for PHP) which will perform common cleaning and sanitisation for you. If the assumptions with which these libraries are built suit your applications, you may be able to avoid a lot of the hard work of handling raw microformats 2 data structures! If not, read on… Navigating Microformat Structures A parsed page may contain a number of microformat data structures (mf structs), in various different places. Take a look at the parsed canonical microformats JSON for the article you’re reading right now, for example. items is a list of top-level mf structs, each of which may contain nested mf structs either under their properties or children keys. Each individual mf struct is guaranteed to have at least two keys, type and properties. type is the primary way of identifying what sort of thing that struct represents (e.g. a person, a post, an event). Structs can have more than one type if they represent multiple things at once without wanting to nest them — for example, a post detailing an event might be both a h-entry and a h-event at the same time. Structs can also have additional top-level keys such as id and lang. Generally speaking, type information is most useful when dealing with top-level mf structs, and mf structs nested under a children key. Nested mf structs found in properties will also have type information, but their usage is usually implied by the property name they’re found under. For many common use cases (e.g. a homepage feed and profile) there are several different ways people might nest mf structs to achieve the same goals, so it’s important that your code is capable of searching the entire tree, rather than just looking at the top-level mf structs. Never assume that the microformat struct you’re looking for will be in the top-level of the items list! You need to search the whole tree. I recommend writing some functions which can traverse a mf tree and return all structs which match a filtering callback. This can then be used as a basis for writing more specific convenience functions for common tasks such as finding all microformats on a page of a particular type, or where a certain property matches a certain value. See my microformats2 PHP functions for some working examples. Possible Property Values Each key in a mf struct’s properties dict maps to a list of values for that property. Every property may map to multiple values, and those values may be a mixture of any of the following: A plain string value, containing no HTML, and leaving HTML entities unescaped (e.g. <) { "items": [{ "type": ["h-card"], "properties": { "name": ["Barnaby Walters"] } }] } (In future examples I will leave out the encapsulating {"items": [{"type": [•••], •••}]} for brevity, focusing on the properties key of a single mf struct.) An embedded HTML struct, containing two keys: html, which maps to an HTML representation of the property, and value, mapping to a plain text version. "properties": { "content": [{ "html": "

The content of a post, as raw HTML (or not).

", "value": "The content of a post, as raw HTML (or not)." }] } An img/alt struct, containing the URL of a parsed image under value, and its alt text under alt. "properties": { "photo": [{ "value": "a photo", "alt": "Example Person" }] } A nested microformat data structure, with an additional value key containing a plaintext representation of the data contained within. "properties": { "author": [{ "type": ["h-card"], "properties": { "name": ["Barnaby Walters"] }, "value": "Barnaby Walters }] } All properties may have more than one value. In cases where you expect a single property value (e.g. name), simply take the first one you find, and in cases where you expect multiple values, use all values you consider valid. There are also some cases where it may make sense to use multiple values, but to prioritise one based on some heuristic — for example, an h-card may have multiple url values, in which case the first one is usually the “canonical” URL, and further URLs refer to external profiles. Let’s look at the implications of each of the potential property value structures in turn. Firstly, Never assume that a property value will be a plaintext string. Microformats publishers can nest microformats, embedded content and img/alt structures in a variety of different ways, and your consuming code should be as flexible as possible. To partially make up for this complexity, you can always rely on the value key of nested structs to provide you with an equivalent plaintext value, regardless of what type of struct you’ve found. When you start consuming microformats 2, write a function like this, and get into the habit of using it every time you want a single, plaintext value from a property: def get_first_plaintext(mf_struct, property_name): try: first_val = mf_struct['properties'][property_name][0] if isinstance(first_val, str): return first_val else: return first_val['value'] except (IndexError, KeyError): return None Secondly, Never assume that a particular property will contain an embedded HTML struct — this usually applies to content, but is relevant anywhere your application expects embedded HTML. If you want to reliably get a value encoded as raw HTML, then you need to: Check whether the first property value is an embedded HTML struct (i.e. has an html key). If so, take the value of the html key Otherwise, get the first plaintext property value using the approach above, and HTML-escape it If neither is found, the property has no value. In Python 3.5+, that could look something like this: from html import escape def get_first_html(mf_struct, property_name): try: first_val = mf_struct['properties'][property_name][0] if isinstance(first_val, dict) and 'html' in first_val: return first_val['html'] else: plaintext_val = get_first_plaintext(mf_struct, property_name) if plaintext_val is not None: plaintext_val = escape(plaintext_val) return plaintext_val except (IndexError, KeyError): return None In some cases, it may make sense for your application to be aware of whether a value was parsed as embedded HTML or a plain text string, and to store/treat them differently. In all other cases, always use a function like this when you’re expecting embedded HTML data. Thirdly, when expecting an image URL, check for an img/alt structure, falling back to the plain text value (and either assuming an empty alt text or inferring an appropriate one, depending on your specific use case). Something like this could be a good starting point: def get_img_alt(mf_struct, property_name): try: first_val = mf_struct['properties'][property_name][0] if isinstance(first_val, dict) and 'alt' in first_val: return first_val else: plaintext_val = get_first_plaintext(mf_struct, property_name) if plaintext_val is not None: return {'value': plaintext_val, 'alt': ''} return None except (IndexError, KeyError): return None Finally, in cases where you expect a nested microformat, you might end up getting something else. This is the hardest case to deal with, and the one which depends the most on the specific data and use-case you’re dealing with. For example, if you’re expecting a nested h-card under an author property, but get something else, you could use any of the following approaches: If you got a plain string which doesn’t look like a URL, treat it as the name property of an implied h-card structure with no other properties (and if you need a URL, you could potentially take the hostname of the effective URL, if it works in context as a useful fallback value) If you got an img alt struct, you could treat the value as the photo property, the alt as the name property, and potentially even take the hostname of the photo URL to be the implied fallback url property (although that’s pushing it a bit, and in most cases it’s probably better to just leave out the url) If you got an embedded HTML struct, take its plaintext value and use one of the first two approaches If you got a plain string, check to see if it looks like a URL. If so, fetch that URL and look for a representative h-card to use as the author value If you get an embedded mf struct with a url property but no photo, you could fetch the url, look for a representative h-card (more on that in the next section) and see if it has a photo property Treat the author property as invalid and run the h-entry (or entire page if relevant) through the authorship algorithm The first three are general principles which can be applied to many scenarios where you expect an embedded mf struct but find something else. The last three, however, are examples of a common trend in consuming microformats 2 data: for many common use-cases, there are well-thought-through algorithms you can use to interpret data in a standardised way. Know Your Algorithms and Vocabularies The authorship algorithm mentioned above is one of several more-or-less formally established algorithms used to solve common problems in indieweb usages of microformats 2. Some others which are worth knowing about include: “Who wrote this post?”: authorship algorithm “There’s more than one h-card on this page, which one should I use?”: representative h-card “I want to get a paginated feed of posts from this page”: How to consume h-feed “How do I find and display the main post on this page?”: How to consume h-entry “I received a response to one of my posts via webmention, how do I display it?”: How to display comments Library implementations of these algorithms exist for some languages, although they often deviate slightly from the exact text. See if you can find one which meets your needs, and if not, write your own and share it with the community! In addition to the formal consumption algorithms, it’s worth looking through the definitions of the microformats vocabularies you’re using (as well as testing with real-world data) and adding support for properties or publishing techniques you might not have thought of the first time around. Some examples to get you started: If an h-card has no valid photo, see if there’s a valid logo you can use instead When presenting a h-entry with a featured photo, check both the photo property and the featured property, as one or the other might be used in different scenarios When dealing with address or location data (e.g. on an h-card, h-entry or h-event), be aware that either might be present in various different forms. Co-ordinates might be separate latitude and longitude properties, a combined plaintext geo property, or an embedded h-geo. Addresses might be separate top-level properties or an embedded h-adr. There are many variations which are totally valid to publish, and your consuming code should be as liberal as possible in what it accepts. If a h-entry contains images which are marked up with u-photo within the e-content, they’ll be present both in the content html key and also under the photo property. If your app shows the embedded content HTML rather than using the plaintext version, and also supports photo properties (which may also be present outside the content), you may have to sniff the presence of photos within the content, and either remove them from it or ignore the corresponding photo properties to avoid showing photos twice. Sanitise, Validate, and Truncate In the vast majority of cases, consuming microformats 2 data involves handling, storing and potentially re-publishing untrusted and potentially dangerous input data. Preventing XSS and other attacks is out of the scope of the microformats parsing algorithm, so the data your parser gives you is just as dangerous as the original source. You need to take your own measures for sanitising and truncating it so you can store and display it safely. Covering every possible injection and XSS attack is out of the scope of this article, so I highly recommend referring to the OWASP resources on XSS Prevention, Unicode Attacks and Injection Attacks for more information. Other than that, the following ideas are a good start: Use plaintext values where possible, only using embedded HTML when absolutely necessary Pass everything (HTML or not) through a well-respected HTML sanitizer such as PHP’s HTML Purifier. Configure it to make sure that embedded HTML can’t interfere with your own markup or CSS. It probably shouldn’t contain any javascript ever, either. In any case where you’re expecting a value with a specific format, validate it as appropriate. More specifically, everywhere that you expect a URL, check that what you got was actually a URL. If you’re using the URL as an image, consider fetching it an checking its content type Consider either proxying resource such as images, or storing local copies of them (reducing size and resolution as necessary), to avoid mixed content issues, potential attacks, and missing images if the links break in the future. Decide on relevant maximum length values for each separate piece of external content, and truncate them as necessary. Ideally, use a language-aware truncation algorithm to avoid breaking words apart. When the content of a post is truncated, consider adding a “Read More” link for convenience. Test with Real-World Data The web is a diverse place, and microformats are a flexible, permissive method of marking up structured data. There are often several different yet perfectly valid ways to achieve the same goal, and as a good consumer of mf2 data, your application should strive to accept as many of them as possible! The best way to test this is with real world data. If your application is built with a particular source of data in mind, then start off with testing it against that. If you want to be able to handle a wider variety of sources, the best way is to determine what vocabularies and publishing use-cases your application consumes, and look at the Examples sections of the relevant indieweb.org wiki pages for real-world sites to test your code against. Don’t forget to test your code against examples you’ve published on your own personal site! Next Steps Hopefully this article helped you avoid a lot of common gotchas, and gave you a good head-start towards successfully consuming real-world microformats 2 data. If you have questions or issues, or want to share something cool you’ve built, come and join us in the indieweb chat room.
mentioned aaronparecki.com mention sent '201'
Webmention is one of the fundamental indieweb building blocks. It enables rich interactions between websites, like posting a comment or favorite on one site from another site. This post will walk you through the simplest way to get started sending webmentions to other sites so that you can use your own site to join the conversations happening on the Indie Web. So what do you need to walk through this tutorial? We'll use static files and simple command line tools so that you can easily adapt this to any environment or programming language later. Get started First, we'll create a new HTML file that we'll use to contain the comment to post. At the very minimum, that file will need to contain a link to the post we're replying to. Hello World

in reply to: @aaronpk

Trying out this guide to sending webmentions

Go ahead and copy that HTML and save it into a new file on your web server, for example: aaronpk.com/reply.html. Take your new post's URL and paste it into the webmention form at the bottom of this post. After a few seconds, reload this page and you should see your post show up under "Other Mentions"! Making it look better That's a great start! But you might be wondering where your comment text is. To make your comment show up better on other peoples' websites, you'll need to add a little bit of HTML markup to tell the site where your comment text is and to add your name and photo. Let's take the HTML from before and add a couple pieces. Hello World

in reply to: @aaronpk

Trying out this guide to sending webmentions

Note the parts added in green. These are Microformats! This tells the site that's receiving your webmention where to find specific parts of your post. We first wrap the whole post in a
to indicate that this is a post. Then we add a class to the tag of the post we're replying to, as well as a class to the element that contains our reply text. Now, take your URL and paste it into the webmention form below again. After a few seconds, reload the page and your reply should look more complete here! Now we see the text of the reply, and also notice that it moved out of the "Other Mentions" section and shows up along with the rest of the replies! Of course this web page still looks pretty plain on your own website, but that's up to you to make it look however you like for visitors visiting your website! As long as you leave the h-entry and other Microformats in your post, you can add additional markup and style the page however you like! Adding your name and photo Let's make the comment appear with your name and photo now! To do this, you'll need to add a little section to your web page that indicates who wrote the post. In Microformats, the author of a post is represented as an h-cards. An h-card is another type of object like h-entry, but is intended to represent people or places instead of posts. Below is a simple h-card that we'll add to the post. When we add this h-card into the post we've written, we need to tell it that this h-card is the author of the post. To do that, add the class u-author before the h-card class like the example below. Hello World

in reply to: @aaronpk

Trying out this guide to sending webmentions

Now when you re-send the webmention, the receiver will find your author name, photo and URL and show it in the comment! Great job! If you've successfully gotten this far, you're now able to comment on things and even RSVP to events using your own website! One more detail that you'll want to include on your posts is the date that your post was written. This will ensure the receiving website shows the correct timestamp of your post. If you eventually incorporate this into a static site generator or CMS where you show a list of your replies all on one page, then you'll also want to add a permalink to the individual reply in this post. Typically an easy way to solve both is with the markup below. We can add that to the post below the content. Hello World

in reply to: @aaronpk

Trying out this guide to sending webmentions

Automatically sending webmentions The last piece to the puzzle is having your website send webmentions automatically when a new post is created. This part will require writing some code in your particular language of choice. You'll start by making an HTTP request to get the contents of the page you're replying to, then looking in the response for the webmention endpoint. We can simulate this on the command line using curl and grep. curl -si aaronparecki.com/2018/06/30/11/your-first-webmention | grep rel=\"webmention\" The response will include any HTTP Link headers or HTML tags that have a rel value of "webmention". Link: <webmention.io/aaronpk/webmention>; rel="webmention" If you get more than one, the first one wins. You'll need to extract the URL from the tag and then send the webmention there. Sending a webmention is just a simple POST request to the webmention endpoint with two URLs: the URL of your post (source) and the URL of the post you're replying to (target). curl -si webmention.io/aaronpk/webmention \ -d source=aaronpk.com/reply.html \ -d target=aaronparecki.com/2018/06/30/11/your-first-webmention The only significant part of the response is the HTTP response code. Any 2xx response code is considered a success. You'll most often receive either a 202 which indicates that the webmention processing is happening asynchronously, or if the receiver processes webmentions synchronously and everything worked, you'll get a 201 or 200. In practice, you'll probably use a library for discovering the endpoint and sending the webmention, so here are a few pointers to start you out in a variety of languages. Ruby PHP Node Python Go Elixir ...more on indieweb.org Hopefully this guide was helpful to get you going in the right direction! If you want to dive into the weeds, check out the Webmention spec as well as more details on reply posts. When you want to put your automatic webmention sending implementation to the test, try sending webmentions to all of the links on the test suite, webmention.rocks! If you have any questions or run into any issues, feel free to ping me or anyone else in the IndieWeb chat! #post-id-41108 .content-area pre.example { font-family: 'Roboto Mono', Consolas, Monaco, Courier, monospace; line-height: 1.4rem !important; } #post-id-41108 .content-area pre.example b { color: #689B07; font-weight: bold; } #post-id-41108 .content-area img { display: block; margin: 0 auto; }
mentioned aaronparecki.com/2018/06/30/11/your-first-webmention mention sent '201'
likes Day 21: Twitter Support for XRay #100DaysOfIndieWeb • Aaron Parecki
mentioned aaronparecki.com/2017/01/10/6/day-21-twitter-xray could not fetch https://aaronparecki.com/2017/01/10/6/day-21-twitter-xray '555'
Replied to Checked in at TriMet Hollywood/NE 42nd Ave Transit Center by Aaron Parecki (Aaron Parecki) Leaving the snow to go to LA! If you’ve got the time and inclination on your trip for a coffee, meal, impromptu HWC, let me know.
mentioned aaronparecki.com/2020/01/14/17/ mention sent '201'
mentioned aaronparecki.com/2019/09/30/3/unlisted-posts mention sent '201'
mentioned aaronparecki.com/2019/10/01/7/seatbelt mention sent '201'
Regarding our conversation yesterday for OAuth and API aggregation, I mentioned that while working on PSD2/Open Banking we've been doing similar, for instance with a third party who would register on behalf of a fourth party. I've tracked down bitbucket.org/openid/obuk/src/6b4300bdc872dd55573f3ce9c65b66ada640efaf/uk-openba… as the definition for the way this works with the use of new fields in the Signed Software Assertions (for use with openbanking.atlassian.net/wiki/spaces/DZ/pages/1078034771/Dynamic+Client+Registr…). It may be worth reaching out to OpenID/Open Banking to see if they've got this officially specified about this, or whether this is the latest source of truth you can use Hope this helps with your hope to standardise this into an OAuth spec!
mentioned aaronparecki.com mention sent '201'
mentioned aaronparecki.com/2019/09/01/8/litter-box mention sent '201'
mentioned aaronparecki.com/2019/09/28/42/indiewebcamp mention sent '201'
As part of my move into the IndieWeb movement, I wanted to increase the social interactions I have across multiple sites. I currently use social silos services like Twitter and Slack for a lot of social communication, but I need to have more interactions with the Social Web.To do this, there is a Web standard called Webmention which encapsulates social interactions between pages, such as "liking" or "replying" as well as others. It is described in the IndieWeb wiki article as:Webmention is a web standard for mentions and conversations across the web, a powerful building block that is used for a growing federated network of comments, likes, reposts, and other rich interactions across the decentralized social web.As I'm running Hugo on this website, I wanted to stick to something that would work well with a static site generator. I'd wanted to write my own Webmention software myself but, as ever, I was time challenged and wanted to get something up and running quickly.That's where I found out about Aaron Parecki's project webmention.io which is a hosted Webmention endpoint with a friendly API. I was able to really easily set up my site and add the required markup for making it discoverable for clients.At the time of enabling discovery, I decided not to tackle the rendering of the Webmentions as I wasn't really sure how many I would get. Soon after, Josh Hawxwell spoke at NottsJS with his talk Indie What?, and mentioned that he used a tool called Brid.gy to bridge social silos such as Twitter to the Social Web.This was again really easy to get started with and started producing regular Webmentions through interactions on Twitter, but it wasn't until my recent post announcing Homebrew Website Club: Nottingham that I started to receive Webmentions from outside of the social silos, which was a really cool achievement! And then that made me think, wouldn't it be great if others could start to see these interactions, too?So as per this article's publishing, you can view webmentions on my posts, if there are any. I'd recommend checking out Homebrew Website Club: Nottingham as it has, at time of writing, 34 webmentions.Note that, for now, I'll only be sharing links to other webmentions, rather than directly embedding them - this is a first pass, and while I look at understanding the best way to deal with spam and untrusted inputs.I've also added the ability to send a Webmention via an HTML form, in case you don't yet support automagically sending them.
mentioned aaronparecki.com/ mention sent '201'
mentioned aaronparecki.com/2019/10/02/21/monocle mention sent '201'
mentioned aaronparecki.com/2019/09/30/3/unlisted-posts mention sent '201'
I've had a great couple of days at IndieWebCamp Amsterdam. It was my first IndieWebCamp, and it was a great in-person introduction to the wider IndieWeb community, although I've been active on Chat for some time!The IndieWebCamp Amsterdam 2019 Attendees on Saturday, original photo CC-BY-2.0 by Aaron Parecki.Saturday - SessionsSaturday was the day for conversations and sessions.It was also quite a surreal experience meeting some of the IndieWeb folks. I've been on the edge of the community since at least June 2017, but likely before that, as I can only find so far back on my Firefox history (read: this isn't because I haven't felt welcome, but just that I've not yet got everything in the right place that I can start to "be IndieWeb"). It's been a few years of reading posts by Tantek or the IndieWeb wiki, building my understanding and thinking about the ways the community has looked at things, as well as some of the cool technologies in use.But then being in a room, and being warmly greeted by Tantek, and having folks recognising me from my URL / chat avatar was really nice. It definitely gave me some warm fuzzies! It was really nice, as well, to see the faces behind the URLs/chat names that I'd become so used to seeing!There were almost 25 of us in-person, and a number of remote participants over the day.Introduction to IndieWebCampTon kicked off the day by sharing some background on the IndieWeb and what the movement is about.Ton spoke about the agency that new technology gives us, and how awesome it can be to get playing with something new that gives you lots of new opportunities, but that really there hasn't been that much recently that has felt like that.Ton shared a quote:the next big thing will be lots of smaller thingsWhich he mentioned was what the IndieWeb is. It's lots of smaller pieces of technology working together to make a huge difference to folks, and their agency to own their identities and data.We heard about how silos (such as Twitter or Facebook) aren't going to be around forever, as well as sharing some of the other big names we thought would be, and that when they finally do go out of business, they're unlikely to care about whether they should let you export all your data - so why put so much data in that you know it's not going to be easy to get out?We heard how the IndieWeb revolves, most importantly, around identity, and that identity being your website. It was interesting to talk about this at lunch with Aaron Parecki, who shared that if you used Tumblr or Medium, but did use your own personal domain, you'd still be counted as IndieWeb. This was a bit of a misconception of mine, assuming that IndieWeb meant owning data, but it's more fundamentally about identity, although it helps to have data ownership too.Ton then spoke a little about how we should work to find others who are interested in this, but may not know it under the term "IndieWeb", and connect to them and build our community outwards. We should also look at how AI/Machine Learning/IoT will work, as well as engage folks from other side of tech, such as UX/UI/Design to build more intuitive interfaces and experiences with these tools, so it's better for a wider group of folks.Personal IntroductionsA nice way of getting to know the folks around us was sitting around having a coffee and a chat before the day started, but also through the personal introductions section.For this, each attendee came to the front (if they were comfortable with this) and talked through their website, if any, showing off some of the features, be it Anna's dark mode, my recent Micropub functionality or Seb's private posts.This was nice, because we were able to easily find out who was who, what level of web experience they had, and then through to experience with the IndieWeb.One thing I'm quite bad with is names - it may be worth having name badges for the next one, as then it'll make it easier (and less awkward) for folks to get names right in sessions!SchedulingIn order to determine which sessions folks were going to be run, we in BarCamp/Unconference style, put post-it notes up with the talk title, after which the person proposing it would be able to give a little more info.We then started to look at how many people wanted to attend which sessions, and split the talks down by which area would fit the amount of people.Web Standards and Accessibility for EveryoneThe first session I attended was Anna's on building accessibility into the Web.We spoke about how accessibility is one of those important things that will affect everyone - it's not just a matter of if, it's when! Over time we'll all encounter accessibility issues, be they buttons that are too small to click, carrying a baby, being hungover, being on a bad network connection, or inevitable old age.It's not one of those things that we can only partially do because we're immediately locking out lots of folks who would want to get into it, effectively saying that we don't care about them!I shared that my own site isn't the most accessible with its search functionality because it downloads my (currently) 4MB JSON Feed, just so I don't have to maintain another format for search - this isn't ideal, and makes it such a poor experience for folks who don't have the best network.We talked about the fact that publishing software should be telling users they're posting inaccessible content, as well as having periodic audits of the site, because accessibility needs change over time.We talked a bit about alt tags on images, and what level of detail folks go to - for instance, I have an automated check that blocks me committing any changes that don't have alt tags for images. It doesn't test the quality of them, but at least helps me think and I generally add an okay-ish description. Other folks have this as purely opt-in, but generally do add it.And of course, there was the underlying worry of syndication to silos not supporting it. For instance, some non-IndieWeb folks are starting to add an alt tag of sorts in their tweets, but this is a manual step they're doing. We'd need our publishing software to perform this for us, taking the alt tag and embedding it into the syndicated content.We talked about the fact that, on the whole, the IndieWeb community are a little more switched on accessibility wise, but that there is always more to do!We had a bit more of a discussion around dark mode, after Anna's demo of it in the introductions, which seemed to spark ideas for Sunday's hack day - there were at least 2 sites that now have dark mode after that!We had an interesting discussion about how Facebook has tonnes of great info on the alt tags for images, such as Image may contain: 8 people, people smiling, people standing and outdoor. This is very useful for context, but also is scary because they must be doing lots of crazy things to scrape that data from photos!But I did also remind folks that Facebook have done some pretty horrible things accessibility-wise to stop Adblockers:Facebook adds 5 divs, 9 spans and 30 css classes to every single post in the timeline to make it more difficult to identify and block 'Sponsored' posts, oh my. t.co/OghvQU1vdw— Wolfie Christl (twitter.com/WolfieChristl) December 8, 2018This was a thought provoking session, and helped set the day with an air of empathy and thinking a bit more compassionately for our users.Private PostsFollowing on from Seb's demo in the introductions earlier in the day, this session was taking a further look at how to maintain privacy in an own-your-data world, in terms of what content you'd want to make private and then how to implement it.We could've spent a little more at the beginning talking about the differences unlisted posts vs private posts, as some folks weren't as aware that unlisted posts were present at a guessable URL, and would be readable if you found them, but they wouldn't be discoverable in your feeds/be linked from elsewhere. This is a subtle difference to a private post which will not allow you to read it if you're not authorized.We spoke a little bit about restricting posts for certain people (i.e. for private conversations), circles of friends (which could provide maintenance overhead) or only visible to yourself.It was interesting to hear that Seb uses private posts as a way to draft content before it's ready to go live (which Tantek wants to do, too) - I mentioned that as all my site is Git-driven, I use a Git branch for draft posts which gives me freedom to update it as much as possible, then clean up history and push it live.Ton brought up a really interesting point about how in real life conversations he'll swap between "my daughter" vs "" depending on who he's talking to, and that he'd quite like to make this possible via some functionality through private posts.Charlie mentioned that for some folks, they use a different silo account depending on the audience, to which Seb mentioned that he has one Twitter account for Dutch folks, and one for English + tech, but that it could go one further to have a private Twitter account just for friends.There was a bit of a conversation following a question from Charlie (that I was going to raise a bit later) about how to work this with static sites. I suggested that something could happen with client-side decryption of the post content, but that it'd need to be stored in source control somewhere and that key would need to be retrievable. Charlie mentioned that this was against the way that Charlie wants to publish content.We spoke a fair bit about check-ins, and the inherent privacy/safety issues that come with them. Because this is some highly dangerous data (for vulnerable folks, or otherwise) as it could allow a stalker, attacker, etc almost real-time access to where you are, which is not to be given out lightly! Charlie mentioned that they she publishes her check-ins after multiple days later, as then it's not useful to anyone aside from owning that data.Ton mentioned that he uses check-ins as a way to announce to folks that he's come to town, which I quite like as an idea because then people can reach out if they see it.This was an interesting session, as I'd seen lots of conversations over the last few months on the IndieWeb Chat but not looked into it and what it could do for me, as for now, I'm happy with things being public.Definitely some food for thought, especially with respect to how it'll work with a static site.Licensing and OwnershipI started off with a bit of a monologue about the importance of Free and Open Source licenses, as well as things like the Creative Commons, and that it's actually quite difficult currently to have a machine-readable way to share the licensing of a piece of content.I spoke about how licensing has been an interesting one for me as I practice Blogumentation - Writing Blog Posts as a Method of Documentation which means I want to be able to share these articles and tips with my colleagues. However, if they're not licensed permissively, a big company (such as the one I work for) will not be happy with it. (Aside: I went into this a bit more in my post in 2018, Being More Explicit on Content Licensing).Following a question from one of the participants about how to understand licenses from a non-lawyer, I mentioned that I too was not a lawyer, but had spent some time looking into licensing. I recommended TL;DR Legal which is an awesome resource for understanding licenses in a clearer language. We also spoke about "what the best license is", to which I mentioned that unfortunately that question is incredibly personal, and that folks have different thoughts for what they want. Because it depends on whether the person you're asking is thinking of it in terms of a Free Software "this is for the user" perspective, or a permissive license "I just want people to use this".We spoke a little time talking about how Creative Commons is better for creative content, rather than code, which is why you'll see it used for those specific uses.We also touched upon lack of licenses on i.e. GitHub/GitLab not meaning Open Source, but actually meaning "All Rights Reserved". This is counter intuitive if you're literally showing people the source code, but is legally sound!It was interesting to hear from Ton that in Europe, government need to specify a license if they release it, otherwise it's public domain. But for individuals, we retain copyright unless said otherwise.And we spoke a lot more about the existing methods of indicating licensing as being a bit wanting, because using applies to the whole document, which is very inflexible for an article that includes photos from different sources as well as code snippets, as all three forms are likely to be licensed under different licenses.I've written up some of my thoughts in a separate blog post following this session, along with my proposal of how we could alternatively mark it up.Finally we had a little chat about finding other references to your site (i.e. if they don't send webmentions) as well as license violations. I shared a misunderstanding between myself and sizeof.cat around licensing, and Ton shared a Hong Kong newspaper (as well as 20+ other publications) using photos of his.Post on Established Platforms / RoadmapIn this session we spoke a lot about syndication and how to publish content across platforms.The question "can I post on Twitter, even though I have everything on my own website?" started off conversations, which was met with a fairly resounding yes! Although it's not an official IndieWeb principle, we don't want to force people to move platforms, but instead want to make it easier for folks to continue using the silo'd web and hear from us, rather than split the community.If we did try to force people to move, we'll either find that folks do it, won't find it very easy, and then end up back on the silos, but bad-mouthing the experience. Alternatively, you turn people completely against it by trying to force them to move, which is very user hostile, and they likely boycott you!I mentioned that throughout the day, I had been tweeting about the event, as a way of giving greater visibility of what was happening to folks that weren't around, and who may not already know what the IndieWeb was.The group definitely agreed that things weren't necessarily in the right place "for the masses", and that if a group of technical folks can't get up and running very easily, we've no hope for folks that aren't really bought in to the politics behind it, or have the technical knowledge to do it.We spoke a bit about "what it means to be IndieWeb", which to many has been described with a vague definition. I said that's perfect, because one of the key principles of the IndieWeb is to avoid monocultures, so having a movement that is many things to many people is great. That being said, if we can't consistently describe it to new folks, maybe it's not at the right point?We talked a bit about how Aaron had mentioned that at lunch, the ownership of identity is really the most important, even if not the ownership of data. For instance, www.jvt.me could be pointing to this Hugo website, Tumblr or Medium, and I wouldn't be necessarily owning my data. However, I'd own the identity that corresponds to the content.We heard a little about how we could see it as a label for a lifestyle choice and principles associated with it, instead of a set of technologies/tools.When talking about "how do you know if you're IndieWeb", I shared that there is IndieWebify me and IndieMark which both add a bit of gamification to give you scores in terms of how many of the technologies you've got.Our closing thoughts on the session was that some folks are already part of the IndieWeb, they just don't know it, at least under that exact label. A nice thought that there are more folks out there, without even knowing they're part of something bigger!Calendaring, Events, RSVPs, InvitationsThis session was quite good as we spoke about the various ways that events can work on the IndieWeb.As I've recently been starting to own my RSVPs much more, as well as making it easier for folks to keep up to date with Homebrew Website Club, this was an interesting session for me to hear how other folks do this.We spoke a bit about how to own RSVPs/events on our sites, as well as the semantic differences between them - RSVPs being "I'm attending that thing", and events being "this is a thing that is happening".There were some mentions about how RSVPing no is very important, as it may show others that there's something interesting to go to, even if you're not able to make it - I like this, and am definitely going to try and do it more!We also spent some time talking about calendar feeds, and how some folks delegate to H2VX to provide these feeds, but a couple of us mentioned that we rendered a iCalendar feed as part of our site which means we don't have to rely on others.We spoke a little about "Add to Calendar", to which I mentioned that I recently added "Add to Calendar" support for both iCalendar format and Google Calendar.We also talked a little bit about Meetup.com, which many folks use for meetups / usergroups. I spoke about how my workflow still requires some manual work for RSVPing on Meetup.com once I've published it to my site, but that on the hack day I'd be starting work on Meetup.com support for brid.gy.SyndicationThis session was largely spent with me talking through what syndication was in the context of the IndieWeb and going through the feature set of brid.gy and how it can be used.It was interesting to go through some of the differences in the flow of syndication - be it from your site to the silo (Publish on Your Own Site, Syndicate Elsewhere (POSSE)), or from the silo to your own website (commonly called Publish Elsewhere, Syndicate to your Own Site (PESOS) or reverse syndication) and where ownership lies for these.We also had some chats about backfeed, and how this allows you to take i.e. Twitter likes to a piece of your content and translate that to a Webmention like.It definitely made me think that I really need to start syndicating notes from my website to Twitter, so I no longer have to do it manually.Sunday - Hack DayOn Sunday, we had the hack day. Folks spent time working on building the things that we'd been talking about the day before, or things they've wanted to do for a while.We had a wide range of things that folks were able to get to - private posts, dark mode, RSVP support, and starting their own blog.My primary goal was to start looking at how to extend Brid.gy to allow Publish on your Own Site, Syndicate Elsewhere (POSSE) support for Meetup.com, which would save a manual step I have to go through for owning my RSVPs.I'd unfortunately spent a lot of my time fighting against Python packaging issues (especially with respect to Python 2 vs Python 3) which I've definitely put down to my lack of Python skills over the last few years.However, I'd been making a fair bit of progress, although it's still a bit of a way off until it can be actually tried, I'm feeling positive and am looking forward to sharing it!General ThoughtsIndieWeb for BeginnersOne thing that was clear at the beginning was that we had a few folks who weren't as familiar with a lot of the terminology and technologies within the IndieWeb, and at this point I feel that I should've volunteered to run a "getting started" session, which I could've used my IndieWeb talk that I am presenting at OggCamp in October. It could've been a good second run-through, as well as helping the new folks.It may be worth, in the future, having an explicit "IndieWeb for beginners" track to go through some of the common things and help give a bit more understanding before getting stuck into the sessions.EtherpadA nice touch that the IndieWeb community does is uses the collaborative editor Etherpad while the talks are going on, allowing all the attendees of the talk (in-person or remote) to make notes.I was already aware of the use of Etherpad at IndieWebCamp events, but I know some folks weren't so a little discussion about what it was used for, and the way that we look to have our sessions documented for posterity.Some attendees shared that they didn't want their names on the Etherpad which I feel we should've talked about before possibly putting them in the history, and maybe talking a bit more up front on that.Static WebsitesI had a great chat with Anna and Marty over lunch on Sunday about the use of static websites, and the joys and difficulties of them, namely speed to publish.The three of us all use Hugo as our static site generator, but have different models of how it gets pushed live, which means we have different speeds at which things are deployed.Marty shared his approach for more intelligent Webmentions, which allowed him to only send webmentions for content that has changed since the last run.I shared that mine goes through everything in my feed which likely sends a tonne of unnecessary webmentions, but only because I was being a bit lazy and didn't want to think about adding any special cases / state in place, at least for my MVP.Closing remarksI want to say another big thanks to Ton and Frank, they did a great job with the organisation and getting everyone together.The venue, Codam Coding College was great for the event, but was also such a great idea as a place to exist. Anna and I were bowled over at the fact that you could go and learn there for free.
mentioned aaronparecki.com/ mention sent '201'
Following Aimee Gamble-Milner's talk Error: Property "X" does not exist on type "Genders", I was thinking about making my pronouns more visible.At DevOpsDays London 2018, I was incredibly impressed with the use of pronoun stickers to share with other attendees how you want others to refer to you.There have been some discussions at Women in Tech Nottingham (after DevOpsDays donated the stickers) since then about it, and how cis-gendered people need to share their pronouns too.This makes it much more normalised, meaning it's not just non cis-gendered people who should add their pronouns, but everyone! This makes it much more inclusive and allows for people to share how they want to be referred to - guessing is never a good idea!At this time, I'd added my pronouns to my personal Twitter account but also wanted something in my Microformats setup.After reaching out in the IndieWeb chat around whether it'd been considered yet (as I had an inkling that I had seen something about it before), I was pointed to the Pronouns section in h-card Brainstorming by Aaron Parecki.I've followed gRegor Morrill's pattern and added my pronouns to my personal h-card on www.jvt.me with three forms:he/ him/ his/Currently it's just a draft for Microformats, but in the future I hope it'll become part of the spec.
mentioned aaronparecki.com/ mention sent '201'
Regarding our conversation yesterday for OAuth and API aggregation, I mentioned that while working on PSD2/Open Banking we've been doing similar, for instance with a third party who would register on behalf of a fourth party. I've tracked down bitbucket.org/openid/obuk/src/6b4300bdc872dd55573f3ce9c65b66ada640efaf/uk-openba… as the definition for the way this works with the use of new fields in the Signed Software Assertions (for use with openbanking.atlassian.net/wiki/spaces/DZ/pages/1078034771/Dynamic+Client+Registr…). It may be worth reaching out to OpenID/Open Banking to see if they've got this officially specified about this, or whether this is the latest source of truth you can use Hope this helps with your hope to standardise this into an OAuth spec!
mentioned aaronparecki.com mention sent '201'
With this post, I've now set up my site to expose IndieAuth configuration to all IndieWeb applications.I had hoped that when it came to switching it on, it would be my own implementation, but unfortunately I've got too many other things going on to write my own IndieAuth server for now! So until then, I'm delegating to IndieAuth.com to allow me to start to interact with IndieWeb applications that require a full authorization server, as well as those I could already log in with using RelMeAuth.This has taken a bit of priority, as in the last week I've found out about Aaron Parecki's MicroSub server, Aperture, which will allow me to more easily keep up to date with my friends in and out of the indieweb, and more easily follow their posts.But longer term, this will make it easier for me to interact with more applications and hopefully build some of my own!
mentioned aaronparecki.com/ mention sent '201'
mentioned aaronparecki.com/2019/10/18/15/ mention sent '201'
mentioned aaronparecki.com/2019/10/18/15/ mention sent '201'
I'm probably not the best person to comment on it as I'm used to tweaking my Linux installs and going a more pain-induced way around things, but it's not _that_ bad. It's a learning curve, it's not nearly as polished an experience that you may expect (for some things) but I find it such a better experience on Linux - I use mac daily for work and it constantly frustrates me!
mentioned aaronparecki.com/2019/11/03/13/ mention sent '201'
mentioned aaronparecki.com/2019/09/28/42/indiewebcamp mention sent '201'
I'm very happy to announce that meetup-mf2.jvt.me is now live and provides a Meetup.com translation layer for Microformats. This makes it possible to integrate with your favourite Microformats parser and get programmatic access to a meetup's metadata.Having Microformats available is incredibly useful because it is a standardised format that makes it possible to use a wide range of clients to understand what i.e. a Meetup event is without having to either use the Meetup API or understand how Meetup's specific HTML works to render their events, and then parse out the data we need.Unfortunately there's no support in Meetup.com itself to render Microformats, which is why I've had to create a wrapper. But it'd be great to see the upstream produce this data themselves, instead of folks having to set it up themselves!It turns out that actually this was a fairly small piece of work to perform a quick transformation of data, as we'll see below, but it doesn't yet seem to have been done, so I thought I'd do it.This has been on my list for a while, largely as an interesting side project to work on, but it's been recently borne out of necessity.My Personal UsageI've got into a really good place with starting to own my RSVPs on my website, and even create an iCalendar feed for RSVPs which means I can easily integrate my RSVPs into my personal/work calendar, as well as let others follow along with what I'm upto.To make this work, I store some extra metadata in the RSVP about the event, where it is, and the time it starts and ends at. This is a manual process I go through when creating the data for the RSVP, which has been a pain up until now.However when I got to writing my Micropub server, I knew that I couldn't populate this data myself, as there was no way to provide all of this very specific data to the Micropub request, without writing my own client - and the whole point of using Micropub was the many clients available. I wanted to have the generation of this event metadata automated, but in the interest of time, I decided not to support RSVPs for now, and at least support the other types of content.With this API now live, I was able to integrate it with my Micropub server, so it would fetch the data dynamically and integrate it with the RSVP. I've proved this works with a couple of RSVPs just now, so I'm happy to say it's working well!CaveatsHowever, there are a couple of caveats with using it, beware!I've not yet worked on handling / avoiding rate limiting, nor anything around caching data so I'm not hammering the API.It's still a little rough around the edges, and is still v0.1, but I hope to improve it over time. I'll likely convert it to an AWS Lambda so I can avoid having it running on some infrastructure, and I know Aaron Parecki was interested in adding it to XRay, as well as hopefully some other implementations available elsewhere.As Ryan Barrett noticed the API only responds to requests on certain routes following the meetup's URL, as I've not yet created i.e. a landing page.Update 2019-09-14: The landing page for the meetup itself is this blog post - so if you're trying to hit meetup-mf2.jvt.me and keep coming back here, that's why!DemoLet's say that we want to get information about the event www.meetup.com/PHPMiNDS-in-Nottingham/events/264008439/. If we were to hit the Meetup.com v3 events listing API and retrieve information about this event I would receive the following JSON response:(Note that the below is a truncated set of data returned by the API, as this is all we need to render our h-event)GET api.meetup.com/PHPMiNDS-in-Nottingham/events/264008439/ { "duration": 7200000, "name": "September Double Whammy - Noobs on Ubs and the IndieWeb *ONE WEEK EARLIER*", "time": 1567706400000, "utc_offset": 3600000, "venue": { "name": "JH", "address_1": " 34a Stoney Street, Nottingham, NG1 1NB.", "city": "Nottingham", "localized_country_name": "United Kingdom" }, "link": "www.meetup.com/PHPMiNDS-in-Nottingham/events/264008439/" }But if we rewrite the host and hit my API instead (noting that the path in the URL remains the same), we get a handy h-event:GET meetup-mf2.jvt.me/PHPMiNDS-in-Nottingham/events/264008439/ { "items": [ { "type": [ "h-event" ], "properties": { "name": [ "\u26a1\ufe0fLightning Talks!\u26a1\ufe0f" ], "description": [ "... truncated for brevity ..." ], "start": [ "2019-09-10T18:00:00+01:00" ], "end": [ "2019-09-10T21:00:00+01:00" ], "url": [ "www.meetup.com/NottsJS/events/mcrkhryzmbnb/" ], "location": [ { "type": [ "h-adr" ], "properties": { "locality": [ "Nottingham" ], "street-address": [ "Capital One (Europe) plc, Station St" ], "country-name": [ "United Kingdom" ] } } ] } } ] }Source CodeIf you're interested in looking at the code for this, check out  jamietanna/meetup-mf2.
mentioned aaronparecki.com/ mention sent '201'
mentioned aaronparecki.com/2019/09/01/8/litter-box mention sent '201'
mentioned aaronparecki.com/2019/10/01/7/seatbelt mention sent '201'
mentioned aaronparecki.com/2019/11/02/32/april1 mention sent '201'
mentioned aaronparecki.com/2019/09/28/13/iwc mention sent '201'
mentioned aaronparecki.com/2019/10/02/21/monocle mention sent '201'
mentioned aaronparecki.com/2019/09/28/13/iwc mention sent '201'
mentioned aaronparecki.com/2019/10/25/32/wrong mention sent '201'
mentioned aaronparecki.com/2019/11/06/19/oredev mention sent '201'
mentioned aaronparecki.com mention sent '201'
mentioned aaronparecki.com/2018/06/30/11/your-first-webmention mention sent '201'
Calum Ryan: Welcome to Homebrew website club - my website is calumryan.com - I started working on it 5 years ago the most recent change I have made to it is to use CSS Grid for it, which is more cosmetic My site supports webmentions, and is hooked up to brid.gy for twitter and facebook replies too. I was the first person to post weather status I post checkins to my site and syndicate them out Dave Letorey: I'm Dave - I only just built a personal website at letorey.co.uk/ - it has not much design at the moment, but the most important part is the content not the way it looks as we go into the future wiht screen readers and voice UI how it looks matters less, so rather than worrying about looks I just made a simple grid layout I don't have any javascript - just simple CSS - the whole point is to learn, and docusmetn what I am doing Chris Burnell: I'm Chris - I use my website for testing mainly - I went the other way round and obsessed with how it looked this year is the year of writing content. I am using webmention.io at the moment - I'd like to add a micropub endpoiny Kevin Marks: my website is kevinmarks.com but I have been experimenting with the Beaker browser and Fritter so my website is also available at dat://b7930c5e0d55aee8aeb6fa996c8e782e2e9b99b62bf25cab0be7ae195f56a158 in other news, we are celebrating one million webmentions snarfed.org/1-million-webmentions - and twitter.com/calumn_ryan brought cupcakes More news this week - WebSub (formerly known as PubSubHubbub) is a w3c REC and IndieAuth is a w3c NOTE aaronparecki.com/2018/01/23/34/w3c-websub-indieauth the beaker browser is at beakerbrowser.com/ and Fritter is at github.com/beakerbrowser/fritter Calum Ryan: to make your website more indieweb friendly, go to indiewebify.me and try the tools there to see if you have it marked up well Kevin Marks: twitter.com/calum_ryan is walking twitter.com/dletorey and twitter.com/iamchrisburnell through indiewebify.me -they're signed into the indieweb.org wiki Calum Ryan: I'm working on indiewebguides.org/ which is based on the indieweb.org wiki, but focused on less technical users of the web Kevin Marks: an editorial on the advantages of #indieweb from twitter.com/godaddy www.godaddy.com/garage/indieweb-facebook-opportunities/ a progressive web app generator that is a PWA itself: joreteg.com/blog/pwa-spawns-pwas
mentioned aaronparecki.com/2018/01/23/34/w3c-websub-indieauth mention sent '201'
oh man, awesome! comparing to granary-demo.appspot.com/instagram/-/@self/@app/BM4rGs-lApG?format=json-mf2, looks like they match up pretty well. one interesting difference: did you do an extra profile URL fetch to get aaronparecki.com/? it’s not in www.instagram.com/p/BM4rGs-lApG/ anywhere. otherwise, next step, comments and likes? :P
mentioned aaronparecki.com/2017/01/09/4/day-20-instagram-for-xray mention sent '201'
likes Day 18: Showing Full Repost Content in p3k #100DaysOfIndieWeb • Aaron Parecki
mentioned aaronparecki.com/2017/01/07/5/day-18-repost-content mention sent '201'
likes Day 17: Documentation for Quill #100DaysOfIndieWeb • Aaron Parecki
mentioned aaronparecki.com/2017/01/06/8/day-17-quill-docs mention sent '201'
cool!!! auto linking and images in comments are underrated. it’s definitely not perfect, but feel free to plunder my code for auto-linking HTML, based on kylewm’s: also, did you only switch articles to name? or notes too? the wordpress plugins originally only showed name for both, which annoyed me, so i made both show full content if it was short enough: github.com/pfefferle/wordpress-semantic-linkbacks/pull/64
mentioned aaronparecki.com/2017/01/05/6/day-16-comments mention sent '201'
fun! i’ve always been low tech about this, i just scp files to my server. simple, and a single small command, but the automation here is very cool.
mentioned aaronparecki.com/2016/11/02/5/screenshots mention sent '201'
great idea, love it! you’d need to tolerate some reuse of codes, due to the overlap of multiple people seeing the same code and taking a bit of time to post it, so it’d maybe be more like “probably verified.” you could definitely find ways to extend it to handle that, but they might complicate the UX too much. regardless, fun idea!
mentioned aaronparecki.com/2016/10/14/20/verified-checkins mention sent '201'
mentioned aaronparecki.com/2016/09/07/1/hwc mention sent '201'
Yes, the facepalm emoji shows up in android N So Aaron doesn't have to use shortcodes
mentioned aaronparecki.com/2016/05/16/11/ mention sent '201'

find mentions for a domain

target: