4.4.3 Receiving Webmentions

Receiving Webmentions may seem like a particularly daunting problem for the staticly generated site owner. In order to receive them, we need a server capable of handling the HTTP posts and implement the server-side of the protocol (Webmention validation, asynchronous processing, possibly another endpoint at which senders can check their results).

It turns out, there’s a service for that: webmention.io. Once you sign-up via See IndieAuth, advertise your Webmention endpoint like so:

<link rel="webmention" href="https://webmention.io/indie-org.sh/webmention" />
<link rel="pingback" href="https://webmention.io/indie-org.sh/xmlrpc" />

Webmention senders will now POST to webmention.io who will store them on your behalf. You can retrieve them via API call to webmention.io.

indie-org handles this for you via indie-org-webmentions-check. This function takes the domain name for which you are checking Webmentions, your webmtion.io API token, and an indie-org-webmentions-received struct (another attribute of indie-org-publication-state). indie-org-webmentions-check will update the struct with any new Webmentions made.

So armed, we can add a method to our site’s Lisp, meant to be invoked periodically, for checking Webmentions made to our site:

(defun iosh/check-webmentions ()
  "Check for new webmentions; update publication state."
  (indie-org-enable)
  (let* ((env :prod) ;; no staging support ATM
         (publication-state
          (if (file-exists-p publication-state-file)
              (indie-org-state-read publication-state-file)))
         (state-for-env
          (or (plist-get publication-state env) (indie-org-state-make)))
         (webmentions-received
          (or (indie-org-state-v2-webmentions-received state-for-env)
              (indie-org-webmentions-make-received)))
         (token
          (indie-org-read-token
           webmentions-io-token-file)))
    (indie-org-webmentions-check "indie-org.sh" token webmentions-received)
    (setf (indie-org-state-v2-webmentions-received state-for-env) webmentions-received)
    (plist-put publication-state env state-for-env)
    (indie-org-state-write publication-state publication-state-file)))

The site owner will need to arrange for this method to be invoked on a regular basis, perhaps as a cron job. If the owner wishes to display mentions as part of their page template(s), they will need to re-publish on receipt of new Webmentions.