summaryrefslogtreecommitdiffstats
path: root/2022
diff options
context:
space:
mode:
authorSacha Chua <sacha@sachachua.com>2022-12-04 15:25:58 -0500
committerSacha Chua <sacha@sachachua.com>2022-12-04 15:25:58 -0500
commitcbf62b3abb21e9d87b92ecd7b811abc9c15a52d2 (patch)
treee0ce32e43823ed064e880857a81b55ce20ba57a7 /2022
parent1ab6cc921040073fbb00e82198a8a7e29bb22ffa (diff)
downloademacsconf-wiki-cbf62b3abb21e9d87b92ecd7b811abc9c15a52d2.tar.xz
emacsconf-wiki-cbf62b3abb21e9d87b92ecd7b811abc9c15a52d2.zip
Automated commit
Diffstat (limited to '2022')
-rw-r--r--2022/captions/emacsconf-2022-indieweb--putting-org-mode-on-the-indieweb--michael-herstine--main--chapters.vtt43
-rw-r--r--2022/captions/emacsconf-2022-indieweb--putting-org-mode-on-the-indieweb--michael-herstine--main.vtt1048
-rw-r--r--2022/info/indieweb-after.md356
-rw-r--r--2022/info/indieweb-before.md28
4 files changed, 1473 insertions, 2 deletions
diff --git a/2022/captions/emacsconf-2022-indieweb--putting-org-mode-on-the-indieweb--michael-herstine--main--chapters.vtt b/2022/captions/emacsconf-2022-indieweb--putting-org-mode-on-the-indieweb--michael-herstine--main--chapters.vtt
new file mode 100644
index 00000000..7446a15d
--- /dev/null
+++ b/2022/captions/emacsconf-2022-indieweb--putting-org-mode-on-the-indieweb--michael-herstine--main--chapters.vtt
@@ -0,0 +1,43 @@
+WEBVTT
+
+00:00:00.000 --> 00:00:14.080
+Introduction
+
+00:00:14.080 --> 00:01:13.880
+Maintaining a personal website using Org mode
+
+00:01:13.880 --> 00:02:32.040
+Problems with comments and isolation
+
+00:02:32.040 --> 00:03:17.800
+The Indieweb
+
+00:03:17.800 --> 00:05:00.600
+Webmentions
+
+00:05:00.600 --> 00:07:04.160
+Decentralized commenting
+
+00:07:04.160 --> 00:08:48.080
+The publication framework
+
+00:08:48.080 --> 00:09:54.000
+Sending Webmentions
+
+00:09:54.000 --> 00:11:36.840
+The process of publication
+
+00:11:36.840 --> 00:12:31.920
+Defining new link types
+
+00:12:31.920 --> 00:14:07.349
+org-publish-to
+
+00:14:07.349 --> 00:14:46.520
+Sending Webmentions with request.el
+
+00:14:46.520 --> 00:15:51.400
+Summary
+
+00:15:51.400 --> 00:16:34.920
+The future
diff --git a/2022/captions/emacsconf-2022-indieweb--putting-org-mode-on-the-indieweb--michael-herstine--main.vtt b/2022/captions/emacsconf-2022-indieweb--putting-org-mode-on-the-indieweb--michael-herstine--main.vtt
new file mode 100644
index 00000000..f41a3981
--- /dev/null
+++ b/2022/captions/emacsconf-2022-indieweb--putting-org-mode-on-the-indieweb--michael-herstine--main.vtt
@@ -0,0 +1,1048 @@
+WEBVTT captioned by bhavin192
+
+00:00:00.000 --> 00:00:02.280
+Hey everyone, I'm Michael,
+
+00:00:02.280 --> 00:00:03.640
+and I'm going to be talking about
+
+00:00:03.640 --> 00:00:06.000
+Org mode and the IndieWeb.
+
+00:00:06.000 --> 00:00:08.840
+I am located in the San Francisco Bay Area,
+
+00:00:08.840 --> 00:00:10.321
+where I'm a developer as well as
+
+00:00:10.321 --> 00:00:14.080
+a longtime Emacs user.
+
+00:00:14.080 --> 00:00:17.560
+So, I maintain a personal website using Org mode.
+
+00:00:17.560 --> 00:00:19.080
+If you're watching this talk,
+
+00:00:19.080 --> 00:00:21.560
+I'm going to guess that you probably are too.
+
+00:00:21.560 --> 00:00:24.880
+For anybody who isn't,
+
+00:00:24.880 --> 00:00:28.680
+let me explain exactly what I mean by that.
+
+00:00:28.680 --> 00:00:32.280
+I have a static website. I author the pages
+
+00:00:32.280 --> 00:00:34.000
+in Org mode's markup language,
+
+00:00:34.000 --> 00:00:36.280
+otherwise known as Orgdown.
+
+00:00:36.280 --> 00:00:38.440
+I use the Org export facility
+
+00:00:38.440 --> 00:00:43.760
+to transcode that markup to HTML.
+
+00:00:43.760 --> 00:00:47.000
+And then I just use rsync to push
+
+00:00:47.000 --> 00:00:51.760
+the resulting HTML pages up to a VPS.
+
+00:00:51.760 --> 00:00:52.854
+I like the workflow.
+
+00:00:52.854 --> 00:00:57.840
+It's familiar to me as a coder.
+
+00:00:57.840 --> 00:01:03.960
+I get to use familiar tools like Git and Make.
+
+00:01:03.960 --> 00:01:06.120
+Publishing and then pushing the site
+
+00:01:06.120 --> 00:01:09.800
+to a local test server is just `make`.
+
+00:01:09.800 --> 00:01:13.880
+Pushing it to the live site is just `make prod`.
+
+00:01:13.880 --> 00:01:18.680
+That said, certain problems made themselves apparent
+
+00:01:18.680 --> 00:01:22.080
+with this arrangement pretty quickly.
+
+00:01:22.080 --> 00:01:25.840
+Commenting was one. It's very difficult
+
+00:01:25.840 --> 00:01:28.200
+to support commenting on a static website.
+
+00:01:28.200 --> 00:01:29.501
+I've got no database.
+
+00:01:29.501 --> 00:01:34.120
+I have no real server, and so on.
+
+00:01:34.120 --> 00:01:35.960
+Yes, of course, there is Disqus
+
+00:01:35.960 --> 00:01:37.868
+and other third party services
+
+00:01:37.868 --> 00:01:38.800
+that will do this for you,
+
+00:01:38.800 --> 00:01:43.880
+but I was uncomfortable outsourcing that job.
+
+00:01:43.880 --> 00:01:45.320
+And it was more than just comments.
+
+00:01:45.320 --> 00:01:48.360
+There was a general sense of isolation.
+
+00:01:48.360 --> 00:01:50.680
+There's no connection to places
+
+00:01:50.680 --> 00:01:53.360
+like Reddit, or Mastodon, or Twitter,
+
+00:01:53.360 --> 00:01:56.560
+you know, where all the people are.
+
+00:01:56.560 --> 00:01:59.520
+I guess you can post, then Tweet a link to it.
+
+00:01:59.520 --> 00:02:01.960
+But suppose somebody responds to your Tweet.
+
+00:02:01.960 --> 00:02:05.520
+Now you've got a conversation going on on Twitter
+
+00:02:05.520 --> 00:02:07.640
+that you're a visitor, and
+
+00:02:07.640 --> 00:02:09.960
+that a non-Twitter-using visitor to your site
+
+00:02:09.960 --> 00:02:15.400
+would be completely disconnected from.
+
+00:02:15.400 --> 00:02:19.000
+I am seeing people using Reddit effectively
+
+00:02:19.000 --> 00:02:22.640
+as the comment section for their sites.
+
+00:02:22.640 --> 00:02:24.760
+But unless you've got an audience, you know,
+
+00:02:24.760 --> 00:02:27.720
+the size of Derek's or Amos's,
+
+00:02:27.720 --> 00:02:32.040
+I don't think that's really feasible either.
+
+00:02:32.040 --> 00:02:34.200
+Now, after casting about for some time,
+
+00:02:34.200 --> 00:02:37.680
+I stumbled upon something called the IndieWeb.
+
+00:02:37.680 --> 00:02:39.280
+In their own words, the IndieWeb is
+
+00:02:39.280 --> 00:02:41.960
+a community of independent and personal websites
+
+00:02:41.960 --> 00:02:44.401
+connected by simple standards based on
+
+00:02:44.401 --> 00:02:46.720
+the principles of owning your domain
+
+00:02:46.720 --> 00:02:48.480
+and using it as your primary identity,
+
+00:02:48.480 --> 00:02:50.360
+publishing on your own site,
+
+00:02:50.360 --> 00:02:52.418
+and optionally syndicating elsewhere,
+
+00:02:52.418 --> 00:02:54.320
+and owning your data.
+
+00:02:54.320 --> 00:02:57.680
+I would describe it as a collection of individuals
+
+00:02:57.680 --> 00:03:01.360
+who've chosen to own their own platforms,
+
+00:03:01.360 --> 00:03:05.520
+alongside a loosely specked set of standards
+
+00:03:05.520 --> 00:03:07.480
+that tie those sites together.
+
+00:03:07.480 --> 00:03:09.218
+And it's really those standards
+
+00:03:09.218 --> 00:03:10.640
+that make the IndieWeb
+
+00:03:10.640 --> 00:03:13.120
+more than just a call for everybody
+
+00:03:13.120 --> 00:03:14.735
+to go back to the arts
+
+00:03:14.735 --> 00:03:17.800
+and blog on on their own sites.
+
+00:03:17.800 --> 00:03:19.640
+Now, this presentation isn't going to
+
+00:03:19.640 --> 00:03:21.480
+focus on the IndieWeb as such.
+
+00:03:21.480 --> 00:03:23.360
+It's more about using Org mode
+
+00:03:23.360 --> 00:03:24.640
+to put your site on the IndieWeb.
+
+00:03:24.640 --> 00:03:28.040
+I'm a little limited by time here,
+
+00:03:28.040 --> 00:03:30.351
+so I'm going to focus on
+
+00:03:30.351 --> 00:03:32.080
+just one of those protocols,
+
+00:03:32.080 --> 00:03:33.400
+and that's Webmentions.
+
+00:03:33.400 --> 00:03:35.720
+So, what's a Webmention?
+
+00:03:35.720 --> 00:03:38.520
+Let's begin with the inveterate Alice,
+
+00:03:38.520 --> 00:03:39.468
+who has a website
+
+00:03:39.468 --> 00:03:42.680
+and has posted content to that site.
+
+00:03:42.680 --> 00:03:46.080
+Her old friend Bob comes along,
+
+00:03:46.080 --> 00:03:47.440
+notices that content
+
+00:03:47.440 --> 00:03:49.360
+and wishes to say something about it.
+
+00:03:49.360 --> 00:03:51.468
+He posts to his site
+
+00:03:51.468 --> 00:03:54.920
+and his publication software will,
+
+00:03:54.920 --> 00:03:57.080
+if it supports Webmentions,
+
+00:03:57.080 --> 00:04:00.160
+will notice that he's mentioned Alice's post.
+
+00:04:00.160 --> 00:04:04.320
+At that point, his publication software
+
+00:04:04.320 --> 00:04:07.240
+reaches out to Alice's site,
+
+00:04:07.240 --> 00:04:11.040
+asks for the mentioned document,
+
+00:04:11.040 --> 00:04:12.560
+and will examine it to see
+
+00:04:12.560 --> 00:04:15.600
+if Alice advertises an endpoint at her site
+
+00:04:15.600 --> 00:04:18.160
+capable of receiving Webmentions.
+
+00:04:18.160 --> 00:04:19.600
+In this case, it does.
+
+00:04:19.600 --> 00:04:23.480
+So, Bob's publishing software does it.
+
+00:04:23.480 --> 00:04:24.468
+At the end of the day,
+
+00:04:24.468 --> 00:04:26.000
+a Webmention is really just
+
+00:04:26.000 --> 00:04:30.360
+an HTTP post request with two parameters,
+
+00:04:30.360 --> 00:04:33.000
+a source and a target.
+
+00:04:33.000 --> 00:04:36.818
+On receipt, Alice's server will
+
+00:04:36.818 --> 00:04:39.400
+reach out to Bob's site,
+
+00:04:39.400 --> 00:04:43.280
+request the document that contains the mention,
+
+00:04:43.280 --> 00:04:45.920
+and validate it, decide whether or not
+
+00:04:45.920 --> 00:04:48.120
+she wants to accept the Webmention.
+
+00:04:48.120 --> 00:04:50.960
+In this case, it's legit, it's accepted,
+
+00:04:50.960 --> 00:04:54.000
+and Alice chooses to make a note,
+
+00:04:54.000 --> 00:04:56.760
+to update her content,
+
+00:04:56.760 --> 00:04:58.720
+to make a note of the fact
+
+00:04:58.720 --> 00:05:00.600
+that it was mentioned by Bob.
+
+00:05:00.600 --> 00:05:01.960
+Now a couple of things to note here.
+
+00:05:01.960 --> 00:05:03.480
+The first is that this is effectively
+
+00:05:03.480 --> 00:05:04.960
+decentralized commenting.
+
+00:05:04.960 --> 00:05:07.440
+Both parties own their content,
+
+00:05:07.440 --> 00:05:09.080
+and there's no third party involved,
+
+00:05:09.080 --> 00:05:13.640
+trusted or otherwise.
+
+00:05:13.640 --> 00:05:16.080
+Now at this point, you might object that, well,
+
+00:05:16.080 --> 00:05:18.720
+as the owner of a statically generated site,
+
+00:05:18.720 --> 00:05:21.600
+I have essentially none of the infrastructure
+
+00:05:21.600 --> 00:05:22.920
+I need to implement this.
+
+00:05:22.920 --> 00:05:27.120
+I have no server above and beyond Apache.
+
+00:05:27.120 --> 00:05:30.600
+I can't really…, I have no database.
+
+00:05:30.600 --> 00:05:33.680
+I guess you could send Webmentions with curl,
+
+00:05:33.680 --> 00:05:37.040
+but now to do Webmention endpoint discovery,
+
+00:05:37.040 --> 00:05:39.640
+you're going to be parsing arbitrary HTML.
+
+00:05:39.640 --> 00:05:41.120
+It's a lot of work.
+
+00:05:41.120 --> 00:05:45.080
+That's okay. There are sites out there
+
+00:05:45.080 --> 00:05:48.840
+that offer Webmentions as a service.
+
+00:05:48.840 --> 00:05:51.000
+So, let's take a look at how that goes.
+
+00:05:51.000 --> 00:05:54.920
+We return to our original example.
+
+00:05:54.920 --> 00:05:57.840
+Alice continues to advertise an endpoint
+
+00:05:57.840 --> 00:06:00.320
+capable of receiving Webmentions,
+
+00:06:00.320 --> 00:06:01.840
+but it's no longer on her site.
+
+00:06:01.840 --> 00:06:03.840
+It's at webmention.io.
+
+00:06:03.840 --> 00:06:08.000
+Bob is essentially in the same position,
+
+00:06:08.000 --> 00:06:09.920
+but he now has in his world
+
+00:06:09.920 --> 00:06:13.920
+a third party site called Telegraph.
+
+00:06:13.920 --> 00:06:16.040
+When Bob wants to publish,
+
+00:06:16.040 --> 00:06:19.760
+he no longer needs to go through all the work
+
+00:06:19.760 --> 00:06:21.760
+of sending Webmention,
+
+00:06:21.760 --> 00:06:25.280
+and of carrying out Webmention endpoint discovery.
+
+00:06:25.280 --> 00:06:27.880
+He sends one API request to Telegraph,
+
+00:06:27.880 --> 00:06:31.120
+effectively saying, please send a Webmention for me.
+
+00:06:31.120 --> 00:06:36.640
+Asynchronously, telegraph.io is going to
+
+00:06:36.640 --> 00:06:38.718
+retrieve Alice's post,
+
+00:06:38.718 --> 00:06:41.320
+do Webmention endpoint discovery,
+
+00:06:41.320 --> 00:06:45.400
+and send the Webmention on Bob's behalf.
+
+00:06:45.400 --> 00:06:48.280
+Except this time he's sending it to webmention.io.
+
+00:06:48.280 --> 00:06:53.080
+Now, at some arbitrary point in the future,
+
+00:06:53.080 --> 00:06:55.800
+Alice can ask webmention.io,
+
+00:06:55.800 --> 00:06:57.720
+"Hey, do I have any new Webmentions?"
+
+00:06:57.720 --> 00:07:00.480
+And if she does, she may choose
+
+00:07:00.480 --> 00:07:04.160
+to update her content and publish.
+
+00:07:04.160 --> 00:07:07.240
+Okay, so let's code this up.
+
+00:07:07.240 --> 00:07:09.120
+Now, I'm recording this talk
+
+00:07:09.120 --> 00:07:10.960
+about a month ahead of time
+
+00:07:10.960 --> 00:07:12.520
+and I haven't been able to put together
+
+00:07:12.520 --> 00:07:13.920
+a little demo project.
+
+00:07:13.920 --> 00:07:16.600
+Hopefully, I can hack something together
+
+00:07:16.600 --> 00:07:18.920
+before this video streams.
+
+00:07:18.920 --> 00:07:20.920
+But in the meantime,
+
+00:07:20.920 --> 00:07:22.960
+I'd like to imagine a little test site.
+
+00:07:22.960 --> 00:07:25.218
+It has a single page,
+
+00:07:25.218 --> 00:07:28.880
+maybe we'll call it index.org,
+
+00:07:28.880 --> 00:07:30.520
+and we're going to publish it.
+
+00:07:30.520 --> 00:07:32.600
+We're going to export it to
+
+00:07:32.600 --> 00:07:35.840
+a subdirectory of our project directory,
+
+00:07:35.840 --> 00:07:39.080
+simply called www.
+
+00:07:39.080 --> 00:07:44.800
+So, the entry point to the Org export system
+
+00:07:44.800 --> 00:07:46.640
+is the function org-publish,
+
+00:07:46.640 --> 00:07:49.960
+whose docstring helpfully says,
+
+00:07:49.960 --> 00:07:52.240
+it publishes all projects.
+
+00:07:52.240 --> 00:07:56.760
+The set of all projects is defined by
+
+00:07:56.760 --> 00:07:59.520
+the variable `org-publish-project-alist`,
+
+00:07:59.520 --> 00:08:02.320
+which is a very flexible association list
+
+00:08:02.320 --> 00:08:03.868
+that lets you define
+
+00:08:03.868 --> 00:08:05.520
+what files are in your project,
+
+00:08:05.520 --> 00:08:07.000
+how you wish to export them,
+
+00:08:07.000 --> 00:08:10.320
+where they're going to go, etc, etc, etc.
+
+00:08:10.320 --> 00:08:13.840
+So great. This is actually pretty straightforward.
+
+00:08:13.840 --> 00:08:15.880
+We just give ourselves a little Elisp file
+
+00:08:15.880 --> 00:08:17.040
+and a single function.
+
+00:08:17.040 --> 00:08:18.640
+I'll call it publish,
+
+00:08:18.640 --> 00:08:22.360
+and all it will do is define
+
+00:08:22.360 --> 00:08:25.000
+`org-publish-project-alist`
+
+00:08:25.000 --> 00:08:26.840
+and invoke `org-publish-all`.
+
+00:08:26.840 --> 00:08:31.880
+At that point, exporting is a one-liner.
+
+00:08:31.880 --> 00:08:35.560
+We just invoke Emacs, load up our site.el file,
+
+00:08:35.560 --> 00:08:37.280
+and invoke the publish function.
+
+00:08:37.280 --> 00:08:43.668
+And if we want to publish to the live server,
+
+00:08:43.668 --> 00:08:45.520
+that's just another one-liner of ours.
+
+00:08:45.520 --> 00:08:48.080
+So, that's the publication framework.
+
+00:08:48.080 --> 00:08:51.280
+Now, let's take a look at sending Webmentions.
+
+00:08:51.280 --> 00:08:54.400
+The idea is that we're going to
+
+00:08:54.400 --> 00:08:57.240
+get our fingers into the publication process.
+
+00:08:57.240 --> 00:09:01.000
+Note when we see a Webmention in
+
+00:09:01.000 --> 00:09:04.000
+the process of exporting our Orgdown,
+
+00:09:04.000 --> 00:09:07.840
+and write it out to disk for sending later on.
+
+00:09:07.840 --> 00:09:11.520
+Now, I didn't want to send a Webmention
+
+00:09:11.520 --> 00:09:13.040
+for every single link in the post.
+
+00:09:13.040 --> 00:09:14.960
+I wanted this to be an intentional choice.
+
+00:09:14.960 --> 00:09:16.960
+And it turns out there are
+
+00:09:16.960 --> 00:09:19.120
+different sorts of Webmentions
+
+00:09:19.120 --> 00:09:20.160
+you can make on a page.
+
+00:09:20.160 --> 00:09:22.520
+For instance, if you add
+
+00:09:22.520 --> 00:09:26.800
+the CSS class u-in-reply-to to your link,
+
+00:09:26.800 --> 00:09:28.635
+the recipient will
+
+00:09:28.635 --> 00:09:30.920
+interpret this Webmention as a reply.
+
+00:09:30.920 --> 00:09:33.440
+There are similar CSS classes
+
+00:09:33.440 --> 00:09:37.240
+for likes, reposts, and generalized mentions.
+
+00:09:37.240 --> 00:09:42.800
+When the recipient gets your Webmention,
+
+00:09:42.800 --> 00:09:45.640
+if they want to know who's talking to them,
+
+00:09:45.640 --> 00:09:47.960
+they need to parse your page
+
+00:09:47.960 --> 00:09:51.800
+and look for DOM elements with certain CSS classes
+
+00:09:51.800 --> 00:09:54.000
+defined by the protocol as well.
+
+00:09:54.000 --> 00:09:57.520
+I'm a visual thinker,
+
+00:09:57.520 --> 00:10:00.680
+so I kind of drew out the process of publication,
+
+00:10:00.680 --> 00:10:03.320
+and exactly where we're going to
+
+00:10:03.320 --> 00:10:05.160
+get our fingers into this.
+
+00:10:05.160 --> 00:10:07.320
+So, this is me invoking make,
+
+00:10:07.320 --> 00:10:09.800
+which of course fires up Emacs.
+
+00:10:09.800 --> 00:10:14.440
+Just as before, my publish function will define
+
+00:10:14.440 --> 00:10:17.920
+`org-publish-project-alist` with one difference.
+
+00:10:17.920 --> 00:10:21.040
+There is an attribute,
+
+00:10:21.040 --> 00:10:23.520
+a property in the list called `publishing-function`.
+
+00:10:23.520 --> 00:10:26.280
+We're going to need to customize that.
+
+00:10:26.280 --> 00:10:28.960
+As usual, we then call…,
+
+00:10:28.960 --> 00:10:31.960
+we kick off the process by calling `org-publish-all`.
+
+00:10:31.960 --> 00:10:36.468
+org-publish-all will invoke
+
+00:10:36.468 --> 00:10:37.320
+your publishing function
+
+00:10:37.320 --> 00:10:40.560
+for each page, and it will hand to
+
+00:10:40.560 --> 00:10:42.520
+your publishing function for each page.
+
+00:10:42.520 --> 00:10:45.080
+The name of the file you're publishing,
+
+00:10:45.080 --> 00:10:50.680
+where it's going, and a parameter entitled plist.
+
+00:10:50.680 --> 00:10:53.200
+This is not super well documented.
+
+00:10:53.200 --> 00:10:55.280
+There are points in the docs
+
+00:10:55.280 --> 00:10:57.440
+that refer to this as a communication channel.
+
+00:10:57.440 --> 00:11:01.800
+What I discovered by simply reading the code was that
+
+00:11:01.800 --> 00:11:04.560
+it's a property list that is initialized
+
+00:11:04.560 --> 00:11:09.680
+for each invocation of your publication function.
+
+00:11:09.680 --> 00:11:13.560
+The initial properties are
+
+00:11:13.560 --> 00:11:16.200
+inherited from your project,
+
+00:11:16.200 --> 00:11:20.801
+but you are free to add properties as you go
+
+00:11:20.801 --> 00:11:23.880
+to communicate between different portions
+
+00:11:23.880 --> 00:11:25.520
+of the publication process.
+
+00:11:25.520 --> 00:11:30.400
+My publication function really does one thing,
+
+00:11:30.400 --> 00:11:34.080
+and that's simply swap out the HTML template
+
+00:11:34.080 --> 00:11:36.840
+that's passed to `org-publish-to`.
+
+00:11:36.840 --> 00:11:43.696
+Now, in order to take note of
+
+00:11:43.696 --> 00:11:45.680
+each Webmention that I send,
+
+00:11:45.680 --> 00:11:47.585
+I took advantage of another
+
+00:11:47.585 --> 00:11:49.880
+Org mode extension point
+
+00:11:49.880 --> 00:11:52.720
+called defining new link types.
+
+00:11:52.720 --> 00:11:54.851
+Here you can see
+
+00:11:54.851 --> 00:11:58.560
+I've created a new link type called reply.
+
+00:11:58.560 --> 00:12:01.960
+One of the attributes that you can attach to this
+
+00:12:01.960 --> 00:12:06.160
+is the function that is used to export your link.
+
+00:12:06.160 --> 00:12:08.562
+I've elided the code for
+
+00:12:08.562 --> 00:12:10.720
+mentions, likes, and reposts.
+
+00:12:10.720 --> 00:12:13.520
+If you look at my export function,
+
+00:12:13.520 --> 00:12:16.280
+you can see that it ultimately yields
+
+00:12:16.280 --> 00:12:19.440
+the appropriate HTML for this link.
+
+00:12:19.440 --> 00:12:22.320
+Before that, it calls a little helper function
+
+00:12:22.320 --> 00:12:24.518
+that will pull out the actual
+
+00:12:24.518 --> 00:12:26.160
+target URL of the link
+
+00:12:26.160 --> 00:12:28.680
+and shove it into this communication channel
+
+00:12:28.680 --> 00:12:31.920
+under the property name `sp1ff/mentions`.
+
+00:12:31.920 --> 00:12:37.360
+So, `org-publish-to` is really the workhorse
+
+00:12:37.360 --> 00:12:40.240
+of the publication process.
+
+00:12:40.240 --> 00:12:42.120
+The first thing it's going to do is
+
+00:12:42.120 --> 00:12:47.400
+transcode from the parsed Orgdown,
+
+00:12:47.400 --> 00:12:50.320
+which is an intermediate representation
+
+00:12:50.320 --> 00:12:53.200
+known as Org elements, to HTML.
+
+00:12:53.200 --> 00:12:57.680
+In particular, for every one of my new links
+
+00:12:57.680 --> 00:13:00.440
+that I'm using to mark Webmentions,
+
+00:13:00.440 --> 00:13:04.040
+it's going to invoke my little export function.
+
+00:13:04.040 --> 00:13:06.600
+And so as we work our way through the post,
+
+00:13:06.600 --> 00:13:09.040
+I'm going to accumulate all the Webmentions
+
+00:13:09.040 --> 00:13:10.920
+that I've made in the property list.
+
+00:13:10.920 --> 00:13:14.360
+The second step is to actually render
+
+00:13:14.360 --> 00:13:16.560
+the final HTML document,
+
+00:13:16.560 --> 00:13:18.800
+and that's where my specialized template comes in.
+
+00:13:18.800 --> 00:13:21.480
+All I do there is, use it to get
+
+00:13:21.480 --> 00:13:24.920
+my authorship information into the page.
+
+00:13:24.920 --> 00:13:29.000
+And then the last step is called finalization.
+
+00:13:29.000 --> 00:13:32.320
+At this point, we have the rendered HTML document,
+
+00:13:32.320 --> 00:13:35.720
+and Org mode gives you an extension point here,
+
+00:13:35.720 --> 00:13:38.080
+where you can do arbitrary post-processing
+
+00:13:38.080 --> 00:13:39.200
+on that document.
+
+00:13:39.200 --> 00:13:42.160
+I arguably abuse it to retrieve
+
+00:13:42.160 --> 00:13:44.440
+all the Webmentions I've made
+
+00:13:44.440 --> 00:13:46.280
+out of the communication channel
+
+00:13:46.280 --> 00:13:47.920
+and write them to disk.
+
+00:13:47.920 --> 00:13:54.840
+At this point, when we type make,
+
+00:13:54.840 --> 00:13:59.160
+we wind up with the rendered HTML
+
+00:13:59.160 --> 00:14:01.080
+for our Orgdown document,
+
+00:14:01.080 --> 00:14:03.880
+along with a little text file
+
+00:14:03.880 --> 00:14:06.040
+in which we've recorded all the Webmentions
+
+00:14:06.040 --> 00:14:07.349
+that need to be sent.
+
+00:14:07.349 --> 00:14:11.800
+The next step is to send said Webmentions.
+
+00:14:11.800 --> 00:14:15.560
+This is surprisingly easy in Emacs Lisp.
+
+00:14:15.560 --> 00:14:17.360
+This is my actual implementation.
+
+00:14:17.360 --> 00:14:22.360
+I use the request.el package to talk to Telegraph.
+
+00:14:22.360 --> 00:14:26.920
+And at this point, we really don't need to
+
+00:14:26.920 --> 00:14:30.640
+add a lot to our little site Elisp file.
+
+00:14:30.640 --> 00:14:34.320
+I sketched out a `send-webmentions` implementation
+
+00:14:34.320 --> 00:14:36.160
+that just goes through in a loop
+
+00:14:36.160 --> 00:14:39.000
+and calls my send-webmention function.
+
+00:14:39.000 --> 00:14:42.640
+And now publication becomes a two-step process.
+
+00:14:42.640 --> 00:14:46.520
+First, the org-publish, then sending Webmentions.
+
+00:14:46.520 --> 00:14:51.418
+Okay, so I realize this has been
+
+00:14:51.418 --> 00:14:52.800
+a bit of a whirlwind.
+
+00:14:52.800 --> 00:14:55.240
+So, where are we now?
+
+00:14:55.240 --> 00:15:00.600
+We have a sample site that we can publish
+
+00:15:00.600 --> 00:15:02.400
+and have sent Webmentions.
+
+00:15:02.400 --> 00:15:05.480
+And we've done it with just Emacs, Org mode,
+
+00:15:05.480 --> 00:15:07.080
+a little Lisp, and a make file.
+
+00:15:07.080 --> 00:15:09.080
+If you'd like to see more,
+
+00:15:09.080 --> 00:15:11.680
+I've put my library up on GitHub.
+
+00:15:11.680 --> 00:15:13.754
+It has logic for both
+
+00:15:13.754 --> 00:15:15.560
+sending and receiving Webmentions
+
+00:15:15.560 --> 00:15:16.960
+as well as something
+
+00:15:16.960 --> 00:15:19.120
+that on the IndieWeb is called POSSE,
+
+00:15:19.120 --> 00:15:22.400
+which is an acronym standing for
+
+00:15:22.400 --> 00:15:25.400
+Publish (on your) Own Site, Syndicate Elsewhere.
+
+00:15:25.400 --> 00:15:27.818
+What that means is that
+
+00:15:27.818 --> 00:15:31.400
+you turn the publication step
+
+00:15:31.400 --> 00:15:35.400
+from merely publishing new content to your site
+
+00:15:35.400 --> 00:15:36.920
+to also replicating it to places
+
+00:15:36.920 --> 00:15:39.160
+like Twitter and Facebook and so forth.
+
+00:15:39.160 --> 00:15:44.120
+And also when people like, comment,
+
+00:15:44.120 --> 00:15:45.960
+and retweet your content,
+
+00:15:45.960 --> 00:15:47.680
+that gets fed back to your site,
+
+00:15:47.680 --> 00:15:51.400
+where you can display it as comments.
+
+00:15:51.400 --> 00:15:52.600
+In terms of the future,
+
+00:15:52.600 --> 00:15:54.520
+I feel like I'm at a decision point.
+
+00:15:54.520 --> 00:15:58.000
+Org mode is admirably flexible,
+
+00:15:58.000 --> 00:16:00.320
+and I'm confident that I can continue to
+
+00:16:00.320 --> 00:16:02.560
+add support for IndieWeb protocols.
+
+00:16:02.560 --> 00:16:05.440
+On the other hand, it is so flexible
+
+00:16:05.440 --> 00:16:07.880
+that the process of figuring out
+
+00:16:07.880 --> 00:16:10.680
+which extension points to use in any situation
+
+00:16:10.680 --> 00:16:12.000
+is very challenging.
+
+00:16:12.000 --> 00:16:14.800
+When I started down this path,
+
+00:16:14.800 --> 00:16:17.840
+my mindset was keep it simple
+
+00:16:17.840 --> 00:16:20.400
+and let's just see how far I could get with Org mode.
+
+00:16:20.400 --> 00:16:23.160
+And I feel like I might be bumping up
+
+00:16:23.160 --> 00:16:25.800
+against the limitations of that approach now.
+
+00:16:25.800 --> 00:16:34.920
+Thank you very much.
diff --git a/2022/info/indieweb-after.md b/2022/info/indieweb-after.md
index 36c2dcfa..b6c80433 100644
--- a/2022/info/indieweb-after.md
+++ b/2022/info/indieweb-after.md
@@ -1,6 +1,362 @@
<!-- Automatically generated by emacsconf-publish-after-page -->
+<a name="indieweb-mainVideo-transcript"></a>
+# Transcript
+
+[[!template new="1" text="""Hey everyone, I'm Michael,""" start="00:00:00.000" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""and I'm going to be talking about""" start="00:00:02.280" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""Org mode and the IndieWeb.""" start="00:00:03.640" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""I am located in the San Francisco Bay Area,""" start="00:00:06.000" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""where I'm a developer as well as""" start="00:00:08.840" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""a longtime Emacs user.""" start="00:00:10.321" video="mainVideo-indieweb" id="subtitle"]]
+[[!template new="1" text="""So, I maintain a personal website using Org mode.""" start="00:00:14.080" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""If you're watching this talk,""" start="00:00:17.560" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""I'm going to guess that you probably are too.""" start="00:00:19.080" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""For anybody who isn't,""" start="00:00:21.560" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""let me explain exactly what I mean by that.""" start="00:00:24.880" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""I have a static website. I author the pages""" start="00:00:28.680" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""in Org mode's markup language,""" start="00:00:32.280" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""otherwise known as Orgdown.""" start="00:00:34.000" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""I use the Org export facility""" start="00:00:36.280" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""to transcode that markup to HTML.""" start="00:00:38.440" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""And then I just use rsync to push""" start="00:00:43.760" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""the resulting HTML pages up to a VPS.""" start="00:00:47.000" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""I like the workflow.""" start="00:00:51.760" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""It's familiar to me as a coder.""" start="00:00:52.854" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""I get to use familiar tools like Git and Make.""" start="00:00:57.840" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""Publishing and then pushing the site""" start="00:01:03.960" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""to a local test server is just `make`.""" start="00:01:06.120" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""Pushing it to the live site is just `make prod`.""" start="00:01:09.800" video="mainVideo-indieweb" id="subtitle"]]
+[[!template new="1" text="""That said, certain problems made themselves apparent""" start="00:01:13.880" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""with this arrangement pretty quickly.""" start="00:01:18.680" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""Commenting was one. It's very difficult""" start="00:01:22.080" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""to support commenting on a static website.""" start="00:01:25.840" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""I've got no database.""" start="00:01:28.200" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""I have no real server, and so on.""" start="00:01:29.501" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""Yes, of course, there is Disqus""" start="00:01:34.120" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""and other third party services""" start="00:01:35.960" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""that will do this for you,""" start="00:01:37.868" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""but I was uncomfortable outsourcing that job.""" start="00:01:38.800" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""And it was more than just comments.""" start="00:01:43.880" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""There was a general sense of isolation.""" start="00:01:45.320" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""There's no connection to places""" start="00:01:48.360" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""like Reddit, or Mastodon, or Twitter,""" start="00:01:50.680" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""you know, where all the people are.""" start="00:01:53.360" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""I guess you can post, then Tweet a link to it.""" start="00:01:56.560" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""But suppose somebody responds to your Tweet.""" start="00:01:59.520" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""Now you've got a conversation going on on Twitter""" start="00:02:01.960" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""that you're a visitor, and""" start="00:02:05.520" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""that a non-Twitter-using visitor to your site""" start="00:02:07.640" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""would be completely disconnected from.""" start="00:02:09.960" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""I am seeing people using Reddit effectively""" start="00:02:15.400" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""as the comment section for their sites.""" start="00:02:19.000" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""But unless you've got an audience, you know,""" start="00:02:22.640" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""the size of Derek's or Amos's,""" start="00:02:24.760" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""I don't think that's really feasible either.""" start="00:02:27.720" video="mainVideo-indieweb" id="subtitle"]]
+[[!template new="1" text="""Now, after casting about for some time,""" start="00:02:32.040" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""I stumbled upon something called the IndieWeb.""" start="00:02:34.200" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""In their own words, the IndieWeb is""" start="00:02:37.680" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""a community of independent and personal websites""" start="00:02:39.280" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""connected by simple standards based on""" start="00:02:41.960" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""the principles of owning your domain""" start="00:02:44.401" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""and using it as your primary identity,""" start="00:02:46.720" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""publishing on your own site,""" start="00:02:48.480" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""and optionally syndicating elsewhere,""" start="00:02:50.360" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""and owning your data.""" start="00:02:52.418" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""I would describe it as a collection of individuals""" start="00:02:54.320" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""who've chosen to own their own platforms,""" start="00:02:57.680" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""alongside a loosely specked set of standards""" start="00:03:01.360" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""that tie those sites together.""" start="00:03:05.520" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""And it's really those standards""" start="00:03:07.480" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""that make the IndieWeb""" start="00:03:09.218" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""more than just a call for everybody""" start="00:03:10.640" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""to go back to the arts""" start="00:03:13.120" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""and blog on on their own sites.""" start="00:03:14.735" video="mainVideo-indieweb" id="subtitle"]]
+[[!template new="1" text="""Now, this presentation isn't going to""" start="00:03:17.800" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""focus on the IndieWeb as such.""" start="00:03:19.640" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""It's more about using Org mode""" start="00:03:21.480" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""to put your site on the IndieWeb.""" start="00:03:23.360" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""I'm a little limited by time here,""" start="00:03:24.640" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""so I'm going to focus on""" start="00:03:28.040" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""just one of those protocols,""" start="00:03:30.351" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""and that's Webmentions.""" start="00:03:32.080" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""So, what's a Webmention?""" start="00:03:33.400" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""Let's begin with the inveterate Alice,""" start="00:03:35.720" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""who has a website""" start="00:03:38.520" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""and has posted content to that site.""" start="00:03:39.468" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""Her old friend Bob comes along,""" start="00:03:42.680" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""notices that content""" start="00:03:46.080" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""and wishes to say something about it.""" start="00:03:47.440" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""He posts to his site""" start="00:03:49.360" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""and his publication software will,""" start="00:03:51.468" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""if it supports Webmentions,""" start="00:03:54.920" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""will notice that he's mentioned Alice's post.""" start="00:03:57.080" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""At that point, his publication software""" start="00:04:00.160" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""reaches out to Alice's site,""" start="00:04:04.320" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""asks for the mentioned document,""" start="00:04:07.240" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""and will examine it to see""" start="00:04:11.040" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""if Alice advertises an endpoint at her site""" start="00:04:12.560" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""capable of receiving Webmentions.""" start="00:04:15.600" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""In this case, it does.""" start="00:04:18.160" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""So, Bob's publishing software does it.""" start="00:04:19.600" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""At the end of the day,""" start="00:04:23.480" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""a Webmention is really just""" start="00:04:24.468" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""an HTTP post request with two parameters,""" start="00:04:26.000" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""a source and a target.""" start="00:04:30.360" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""On receipt, Alice's server will""" start="00:04:33.000" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""reach out to Bob's site,""" start="00:04:36.818" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""request the document that contains the mention,""" start="00:04:39.400" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""and validate it, decide whether or not""" start="00:04:43.280" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""she wants to accept the Webmention.""" start="00:04:45.920" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""In this case, it's legit, it's accepted,""" start="00:04:48.120" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""and Alice chooses to make a note,""" start="00:04:50.960" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""to update her content,""" start="00:04:54.000" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""to make a note of the fact""" start="00:04:56.760" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""that it was mentioned by Bob.""" start="00:04:58.720" video="mainVideo-indieweb" id="subtitle"]]
+[[!template new="1" text="""Now a couple of things to note here.""" start="00:05:00.600" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""The first is that this is effectively""" start="00:05:01.960" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""decentralized commenting.""" start="00:05:03.480" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""Both parties own their content,""" start="00:05:04.960" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""and there's no third party involved,""" start="00:05:07.440" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""trusted or otherwise.""" start="00:05:09.080" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""Now at this point, you might object that, well,""" start="00:05:13.640" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""as the owner of a statically generated site,""" start="00:05:16.080" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""I have essentially none of the infrastructure""" start="00:05:18.720" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""I need to implement this.""" start="00:05:21.600" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""I have no server above and beyond Apache.""" start="00:05:22.920" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""I can't really…, I have no database.""" start="00:05:27.120" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""I guess you could send Webmentions with curl,""" start="00:05:30.600" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""but now to do Webmention endpoint discovery,""" start="00:05:33.680" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""you're going to be parsing arbitrary HTML.""" start="00:05:37.040" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""It's a lot of work.""" start="00:05:39.640" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""That's okay. There are sites out there""" start="00:05:41.120" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""that offer Webmentions as a service.""" start="00:05:45.080" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""So, let's take a look at how that goes.""" start="00:05:48.840" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""We return to our original example.""" start="00:05:51.000" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""Alice continues to advertise an endpoint""" start="00:05:54.920" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""capable of receiving Webmentions,""" start="00:05:57.840" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""but it's no longer on her site.""" start="00:06:00.320" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""It's at webmention.io.""" start="00:06:01.840" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""Bob is essentially in the same position,""" start="00:06:03.840" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""but he now has in his world""" start="00:06:08.000" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""a third party site called Telegraph.""" start="00:06:09.920" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""When Bob wants to publish,""" start="00:06:13.920" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""he no longer needs to go through all the work""" start="00:06:16.040" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""of sending Webmention,""" start="00:06:19.760" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""and of carrying out Webmention endpoint discovery.""" start="00:06:21.760" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""He sends one API request to Telegraph,""" start="00:06:25.280" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""effectively saying, please send a Webmention for me.""" start="00:06:27.880" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""Asynchronously, telegraph.io is going to""" start="00:06:31.120" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""retrieve Alice's post,""" start="00:06:36.640" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""do Webmention endpoint discovery,""" start="00:06:38.718" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""and send the Webmention on Bob's behalf.""" start="00:06:41.320" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""Except this time he's sending it to webmention.io.""" start="00:06:45.400" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""Now, at some arbitrary point in the future,""" start="00:06:48.280" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""Alice can ask webmention.io,""" start="00:06:53.080" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""&quot;Hey, do I have any new Webmentions?&quot;""" start="00:06:55.800" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""And if she does, she may choose""" start="00:06:57.720" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""to update her content and publish.""" start="00:07:00.480" video="mainVideo-indieweb" id="subtitle"]]
+[[!template new="1" text="""Okay, so let's code this up.""" start="00:07:04.160" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""Now, I'm recording this talk""" start="00:07:07.240" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""about a month ahead of time""" start="00:07:09.120" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""and I haven't been able to put together""" start="00:07:10.960" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""a little demo project.""" start="00:07:12.520" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""Hopefully, I can hack something together""" start="00:07:13.920" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""before this video streams.""" start="00:07:16.600" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""But in the meantime,""" start="00:07:18.920" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""I'd like to imagine a little test site.""" start="00:07:20.920" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""It has a single page,""" start="00:07:22.960" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""maybe we'll call it index.org,""" start="00:07:25.218" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""and we're going to publish it.""" start="00:07:28.880" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""We're going to export it to""" start="00:07:30.520" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""a subdirectory of our project directory,""" start="00:07:32.600" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""simply called www.""" start="00:07:35.840" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""So, the entry point to the Org export system""" start="00:07:39.080" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""is the function org-publish,""" start="00:07:44.800" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""whose docstring helpfully says,""" start="00:07:46.640" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""it publishes all projects.""" start="00:07:49.960" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""The set of all projects is defined by""" start="00:07:52.240" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""the variable `org-publish-project-alist`,""" start="00:07:56.760" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""which is a very flexible association list""" start="00:07:59.520" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""that lets you define""" start="00:08:02.320" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""what files are in your project,""" start="00:08:03.868" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""how you wish to export them,""" start="00:08:05.520" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""where they're going to go, etc, etc, etc.""" start="00:08:07.000" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""So great. This is actually pretty straightforward.""" start="00:08:10.320" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""We just give ourselves a little Elisp file""" start="00:08:13.840" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""and a single function.""" start="00:08:15.880" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""I'll call it publish,""" start="00:08:17.040" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""and all it will do is define""" start="00:08:18.640" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""`org-publish-project-alist`""" start="00:08:22.360" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""and invoke `org-publish-all`.""" start="00:08:25.000" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""At that point, exporting is a one-liner.""" start="00:08:26.840" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""We just invoke Emacs, load up our site.el file,""" start="00:08:31.880" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""and invoke the publish function.""" start="00:08:35.560" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""And if we want to publish to the live server,""" start="00:08:37.280" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""that's just another one-liner of ours.""" start="00:08:43.668" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""So, that's the publication framework.""" start="00:08:45.520" video="mainVideo-indieweb" id="subtitle"]]
+[[!template new="1" text="""Now, let's take a look at sending Webmentions.""" start="00:08:48.080" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""The idea is that we're going to""" start="00:08:51.280" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""get our fingers into the publication process.""" start="00:08:54.400" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""Note when we see a Webmention in""" start="00:08:57.240" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""the process of exporting our Orgdown,""" start="00:09:01.000" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""and write it out to disk for sending later on.""" start="00:09:04.000" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""Now, I didn't want to send a Webmention""" start="00:09:07.840" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""for every single link in the post.""" start="00:09:11.520" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""I wanted this to be an intentional choice.""" start="00:09:13.040" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""And it turns out there are""" start="00:09:14.960" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""different sorts of Webmentions""" start="00:09:16.960" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""you can make on a page.""" start="00:09:19.120" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""For instance, if you add""" start="00:09:20.160" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""the CSS class u-in-reply-to to your link,""" start="00:09:22.520" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""the recipient will""" start="00:09:26.800" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""interpret this Webmention as a reply.""" start="00:09:28.635" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""There are similar CSS classes""" start="00:09:30.920" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""for likes, reposts, and generalized mentions.""" start="00:09:33.440" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""When the recipient gets your Webmention,""" start="00:09:37.240" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""if they want to know who's talking to them,""" start="00:09:42.800" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""they need to parse your page""" start="00:09:45.640" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""and look for DOM elements with certain CSS classes""" start="00:09:47.960" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""defined by the protocol as well.""" start="00:09:51.800" video="mainVideo-indieweb" id="subtitle"]]
+[[!template new="1" text="""I'm a visual thinker,""" start="00:09:54.000" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""so I kind of drew out the process of publication,""" start="00:09:57.520" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""and exactly where we're going to""" start="00:10:00.680" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""get our fingers into this.""" start="00:10:03.320" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""So, this is me invoking make,""" start="00:10:05.160" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""which of course fires up Emacs.""" start="00:10:07.320" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""Just as before, my publish function will define""" start="00:10:09.800" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""`org-publish-project-alist` with one difference.""" start="00:10:14.440" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""There is an attribute,""" start="00:10:17.920" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""a property in the list called `publishing-function`.""" start="00:10:21.040" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""We're going to need to customize that.""" start="00:10:23.520" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""As usual, we then call…,""" start="00:10:26.280" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""we kick off the process by calling `org-publish-all`.""" start="00:10:28.960" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""org-publish-all will invoke""" start="00:10:31.960" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""your publishing function""" start="00:10:36.468" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""for each page, and it will hand to""" start="00:10:37.320" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""your publishing function for each page.""" start="00:10:40.560" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""The name of the file you're publishing,""" start="00:10:42.520" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""where it's going, and a parameter entitled plist.""" start="00:10:45.080" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""This is not super well documented.""" start="00:10:50.680" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""There are points in the docs""" start="00:10:53.200" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""that refer to this as a communication channel.""" start="00:10:55.280" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""What I discovered by simply reading the code was that""" start="00:10:57.440" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""it's a property list that is initialized""" start="00:11:01.800" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""for each invocation of your publication function.""" start="00:11:04.560" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""The initial properties are""" start="00:11:09.680" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""inherited from your project,""" start="00:11:13.560" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""but you are free to add properties as you go""" start="00:11:16.200" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""to communicate between different portions""" start="00:11:20.801" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""of the publication process.""" start="00:11:23.880" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""My publication function really does one thing,""" start="00:11:25.520" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""and that's simply swap out the HTML template""" start="00:11:30.400" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""that's passed to `org-publish-to`.""" start="00:11:34.080" video="mainVideo-indieweb" id="subtitle"]]
+[[!template new="1" text="""Now, in order to take note of""" start="00:11:36.840" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""each Webmention that I send,""" start="00:11:43.696" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""I took advantage of another""" start="00:11:45.680" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""Org mode extension point""" start="00:11:47.585" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""called defining new link types.""" start="00:11:49.880" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""Here you can see""" start="00:11:52.720" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""I've created a new link type called reply.""" start="00:11:54.851" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""One of the attributes that you can attach to this""" start="00:11:58.560" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""is the function that is used to export your link.""" start="00:12:01.960" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""I've elided the code for""" start="00:12:06.160" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""mentions, likes, and reposts.""" start="00:12:08.562" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""If you look at my export function,""" start="00:12:10.720" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""you can see that it ultimately yields""" start="00:12:13.520" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""the appropriate HTML for this link.""" start="00:12:16.280" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""Before that, it calls a little helper function""" start="00:12:19.440" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""that will pull out the actual""" start="00:12:22.320" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""target URL of the link""" start="00:12:24.518" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""and shove it into this communication channel""" start="00:12:26.160" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""under the property name `sp1ff/mentions`.""" start="00:12:28.680" video="mainVideo-indieweb" id="subtitle"]]
+[[!template new="1" text="""So, `org-publish-to` is really the workhorse""" start="00:12:31.920" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""of the publication process.""" start="00:12:37.360" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""The first thing it's going to do is""" start="00:12:40.240" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""transcode from the parsed Orgdown,""" start="00:12:42.120" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""which is an intermediate representation""" start="00:12:47.400" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""known as Org elements, to HTML.""" start="00:12:50.320" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""In particular, for every one of my new links""" start="00:12:53.200" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""that I'm using to mark Webmentions,""" start="00:12:57.680" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""it's going to invoke my little export function.""" start="00:13:00.440" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""And so as we work our way through the post,""" start="00:13:04.040" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""I'm going to accumulate all the Webmentions""" start="00:13:06.600" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""that I've made in the property list.""" start="00:13:09.040" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""The second step is to actually render""" start="00:13:10.920" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""the final HTML document,""" start="00:13:14.360" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""and that's where my specialized template comes in.""" start="00:13:16.560" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""All I do there is, use it to get""" start="00:13:18.800" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""my authorship information into the page.""" start="00:13:21.480" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""And then the last step is called finalization.""" start="00:13:24.920" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""At this point, we have the rendered HTML document,""" start="00:13:29.000" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""and Org mode gives you an extension point here,""" start="00:13:32.320" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""where you can do arbitrary post-processing""" start="00:13:35.720" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""on that document.""" start="00:13:38.080" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""I arguably abuse it to retrieve""" start="00:13:39.200" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""all the Webmentions I've made""" start="00:13:42.160" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""out of the communication channel""" start="00:13:44.440" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""and write them to disk.""" start="00:13:46.280" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""At this point, when we type make,""" start="00:13:47.920" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""we wind up with the rendered HTML""" start="00:13:54.840" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""for our Orgdown document,""" start="00:13:59.160" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""along with a little text file""" start="00:14:01.080" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""in which we've recorded all the Webmentions""" start="00:14:03.880" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""that need to be sent.""" start="00:14:06.040" video="mainVideo-indieweb" id="subtitle"]]
+[[!template new="1" text="""The next step is to send said Webmentions.""" start="00:14:07.349" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""This is surprisingly easy in Emacs Lisp.""" start="00:14:11.800" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""This is my actual implementation.""" start="00:14:15.560" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""I use the request.el package to talk to Telegraph.""" start="00:14:17.360" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""And at this point, we really don't need to""" start="00:14:22.360" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""add a lot to our little site Elisp file.""" start="00:14:26.920" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""I sketched out a `send-webmentions` implementation""" start="00:14:30.640" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""that just goes through in a loop""" start="00:14:34.320" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""and calls my send-webmention function.""" start="00:14:36.160" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""And now publication becomes a two-step process.""" start="00:14:39.000" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""First, the org-publish, then sending Webmentions.""" start="00:14:42.640" video="mainVideo-indieweb" id="subtitle"]]
+[[!template new="1" text="""Okay, so I realize this has been""" start="00:14:46.520" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""a bit of a whirlwind.""" start="00:14:51.418" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""So, where are we now?""" start="00:14:52.800" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""We have a sample site that we can publish""" start="00:14:55.240" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""and have sent Webmentions.""" start="00:15:00.600" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""And we've done it with just Emacs, Org mode,""" start="00:15:02.400" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""a little Lisp, and a make file.""" start="00:15:05.480" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""If you'd like to see more,""" start="00:15:07.080" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""I've put my library up on GitHub.""" start="00:15:09.080" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""It has logic for both""" start="00:15:11.680" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""sending and receiving Webmentions""" start="00:15:13.754" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""as well as something""" start="00:15:15.560" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""that on the IndieWeb is called POSSE,""" start="00:15:16.960" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""which is an acronym standing for""" start="00:15:19.120" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""Publish (on your) Own Site, Syndicate Elsewhere.""" start="00:15:22.400" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""What that means is that""" start="00:15:25.400" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""you turn the publication step""" start="00:15:27.818" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""from merely publishing new content to your site""" start="00:15:31.400" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""to also replicating it to places""" start="00:15:35.400" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""like Twitter and Facebook and so forth.""" start="00:15:36.920" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""And also when people like, comment,""" start="00:15:39.160" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""and retweet your content,""" start="00:15:44.120" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""that gets fed back to your site,""" start="00:15:45.960" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""where you can display it as comments.""" start="00:15:47.680" video="mainVideo-indieweb" id="subtitle"]]
+[[!template new="1" text="""In terms of the future,""" start="00:15:51.400" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""I feel like I'm at a decision point.""" start="00:15:52.600" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""Org mode is admirably flexible,""" start="00:15:54.520" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""and I'm confident that I can continue to""" start="00:15:58.000" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""add support for IndieWeb protocols.""" start="00:16:00.320" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""On the other hand, it is so flexible""" start="00:16:02.560" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""that the process of figuring out""" start="00:16:05.440" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""which extension points to use in any situation""" start="00:16:07.880" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""is very challenging.""" start="00:16:10.680" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""When I started down this path,""" start="00:16:12.000" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""my mindset was keep it simple""" start="00:16:14.800" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""and let's just see how far I could get with Org mode.""" start="00:16:17.840" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""And I feel like I might be bumping up""" start="00:16:20.400" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""against the limitations of that approach now.""" start="00:16:23.160" video="mainVideo-indieweb" id="subtitle"]]
+[[!template text="""Thank you very much.""" start="00:16:25.800" video="mainVideo-indieweb" id="subtitle"]]
+
+
+
+Captioner: bhavin192
Questions or comments? Please e-mail [emacsconf-org-private@gnu.org](mailto:emacsconf-org-private@gnu.org?subject=Comment%20for%20EmacsConf%202022%20indieweb%3A%20Putting%20Org%20Mode%20on%20the%20Indieweb)
diff --git a/2022/info/indieweb-before.md b/2022/info/indieweb-before.md
index 502eb1dc..286ddb53 100644
--- a/2022/info/indieweb-before.md
+++ b/2022/info/indieweb-before.md
@@ -3,16 +3,40 @@ In this talk, Michael Herstine shows how to set up Org Mode for sending and publ
The following image shows where the talk is in the schedule for Sun 2022-12-04. Solid lines show talks with Q&A via BigBlueButton. Dashed lines show talks with Q&A via IRC or Etherpad.<div class="schedule-in-context schedule-svg-container" data-slug="indieweb">
-<svg width="800" height="150" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <title> Schedule for Sunday</title> <rect width="800" height="150" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Sunday</text> <a href="/2022/talks/sun-open" title="Sunday opening remarks" data-slug="sun-open"> <title> 9:00- 9:05 Sunday opening remarks</title> <rect x="0" y="15" opacity="0.5" width="7" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(5,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sun-open</text></g></a> <a href="/2022/talks/survey" title="Results of the 2022 Emacs Survey" data-slug="survey"> <title> 9:05- 9:25 Results of the 2022 Emacs Survey</title> <rect x="7" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(36,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> survey</text></g></a> <a href="/2022/talks/orgyear" title="This Year in Org" data-slug="orgyear"> <title> 9:35- 9:45 This Year in Org</title> <rect x="54" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(67,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgyear</text></g></a> <a href="/2022/talks/rolodex" title="Build a Zettelkasten with the Hyperbole Rolodex" data-slug="rolodex"> <title> 9:55-10:20 Build a Zettelkasten with the Hyperbole Rolodex</title> <rect x="86" y="15" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(123,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rolodex</text></g></a> <a href="/2022/talks/orgsuperlinks" title="Linking headings with org-super-links (poor-man's Zettelkasten)" data-slug="orgsuperlinks"> <title> 10:40-10:50 Linking headings with org-super-links (poor-man's Zettelkasten)</title> <rect x="156" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(169,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgsuperlinks</text></g></a> <a href="/2022/talks/orgvm" title="orgvm: a simple HTTP server for org" data-slug="orgvm"> <title> 11:10-11:20 orgvm: a simple HTTP server for org</title> <rect x="203" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(216,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgvm</text></g></a> <a href="/2022/talks/hyperorg" title="Powerful productivity with Hyperbole and Org Mode" data-slug="hyperorg"> <title> 1:00- 1:30 Powerful productivity with Hyperbole and Org Mode</title> <rect x="376" y="15" opacity="0.5" width="47" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(421,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> hyperorg</text></g></a> <a href="/2022/talks/workflows" title="Org workflows for developers" data-slug="workflows"> <title> 1:50- 2:15 Org workflows for developers</title> <rect x="454" y="15" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(491,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> workflows</text></g></a> <a href="/2022/talks/grail" title="GRAIL---A Generalized Representation and Aggregation of Information Layers" data-slug="grail"> <title> 2:35- 2:55 GRAIL---A Generalized Representation and Aggregation of Information Layers</title> <rect x="525" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(554,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> grail</text></g></a> <a href="/2022/talks/indieweb" title="Putting Org Mode on the Indieweb" data-slug="indieweb"> <title> 3:25- 3:45 Putting Org Mode on the Indieweb</title> <rect stroke-width="3" x="603" y="15" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(632,73)"> <text font-weight="bold" fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> indieweb</text></g></a> <a href="/2022/talks/devel" title="Emacs development updates" data-slug="devel"> <title> 4:05- 4:15 Emacs development updates</title> <rect x="666" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(679,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> devel</text></g></a> <a href="/2022/talks/fanfare" title="Fanfare for the Common Emacs User" data-slug="fanfare"> <title> 4:25- 4:35 Fanfare for the Common Emacs User</title> <rect x="698" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(711,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> fanfare</text></g></a> <a href="/2022/talks/sun-close" title="Sunday closing remarks" data-slug="sun-close"> <title> 4:50- 5:00 Sunday closing remarks</title> <rect x="737" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(750,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sun-close</text></g></a> <a href="/2022/talks/rde" title="rde Emacs introduction" data-slug="rde"> <title> 10:00-10:25 rde Emacs introduction</title> <rect x="94" y="75" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(131,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rde</text></g></a> <a href="/2022/talks/justl" title="justl: Driving recipes within Emacs" data-slug="justl"> <title> 10:50-11:05 justl: Driving recipes within Emacs</title> <rect x="172" y="75" opacity="0.5" width="23" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(193,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> justl</text></g></a> <a href="/2022/talks/rms" title="What I'd like to see in Emacs" data-slug="rms"> <title> 11:15-11:35 What I'd like to see in Emacs</title> <rect x="211" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(240,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rms</text></g></a> <a href="/2022/talks/detached" title="Getting detached from Emacs" data-slug="detached"> <title> 1:00- 1:15 Getting detached from Emacs</title> <rect x="376" y="75" opacity="0.5" width="23" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(397,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> detached</text></g></a> <a href="/2022/talks/eshell" title="Top 10 reasons why you should be using Eshell" data-slug="eshell"> <title> 1:40- 1:55 Top 10 reasons why you should be using Eshell</title> <rect x="439" y="75" opacity="0.5" width="23" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(460,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eshell</text></g></a> <a href="/2022/talks/async" title="Emacs was async before async was cool" data-slug="async"> <title> 2:20- 2:40 Emacs was async before async was cool</title> <rect x="501" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(530,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> async</text></g></a> <a href="/2022/talks/dbus" title="The Wheels on D-Bus" data-slug="dbus"> <title> 3:15- 3:35 The Wheels on D-Bus</title> <rect x="588" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(617,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> dbus</text></g></a> <a href="/2022/talks/localizing" title="Pre-localizing Emacs" data-slug="localizing"> <title> 4:00- 4:10 Pre-localizing Emacs</title> <rect x="658" y="75" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(671,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> localizing</text></g></a> <a href="/2022/talks/python" title="Short hyperlinks to Python docs" data-slug="python"> <title> 4:30- 4:35 Short hyperlinks to Python docs</title> <rect x="705" y="75" opacity="0.5" width="7" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(710,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> python</text></g></a> <g transform="translate(0,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 9 AM</text></g> <g transform="translate(94,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 10 AM</text></g> <g transform="translate(188,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 11 AM</text></g> <g transform="translate(282,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 12 PM</text></g> <g transform="translate(376,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 1 PM</text></g> <g transform="translate(470,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 2 PM</text></g> <g transform="translate(564,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 3 PM</text></g> <g transform="translate(658,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 4 PM</text></g> <g transform="translate(752,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 5 PM</text></g></svg>
+<svg width="800" height="150" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <title> Schedule for Sunday</title> <rect width="800" height="150" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Sunday</text> <a href="/2022/talks/sun-open" title="Sunday opening remarks" data-slug="sun-open"> <title> 9:00- 9:05 Sunday opening remarks</title> <rect x="0" y="15" opacity="0.5" width="7" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(5,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sun-open</text></g></a> <a href="/2022/talks/survey" title="Results of the 2022 Emacs Survey" data-slug="survey"> <title> 9:06- 9:26 Results of the 2022 Emacs Survey</title> <rect x="9" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(38,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> survey</text></g></a> <a href="/2022/talks/orgyear" title="This Year in Org" data-slug="orgyear"> <title> 9:35- 9:45 This Year in Org</title> <rect x="54" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(67,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgyear</text></g></a> <a href="/2022/talks/rolodex" title="Build a Zettelkasten with the Hyperbole Rolodex" data-slug="rolodex"> <title> 9:57-10:22 Build a Zettelkasten with the Hyperbole Rolodex</title> <rect x="89" y="15" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(126,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rolodex</text></g></a> <a href="/2022/talks/orgsuperlinks" title="Linking headings with org-super-links (poor-man's Zettelkasten)" data-slug="orgsuperlinks"> <title> 10:40-10:50 Linking headings with org-super-links (poor-man's Zettelkasten)</title> <rect x="156" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(169,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgsuperlinks</text></g></a> <a href="/2022/talks/orgvm" title="orgvm: a simple HTTP server for org" data-slug="orgvm"> <title> 11:10-11:20 orgvm: a simple HTTP server for org</title> <rect x="203" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(216,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgvm</text></g></a> <a href="/2022/talks/hyperorg" title="Powerful productivity with Hyperbole and Org Mode" data-slug="hyperorg"> <title> 1:00- 1:30 Powerful productivity with Hyperbole and Org Mode</title> <rect x="376" y="15" opacity="0.5" width="47" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(421,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> hyperorg</text></g></a> <a href="/2022/talks/workflows" title="Org workflows for developers" data-slug="workflows"> <title> 1:50- 2:15 Org workflows for developers</title> <rect x="454" y="15" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(491,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> workflows</text></g></a> <a href="/2022/talks/grail" title="GRAIL---A Generalized Representation and Aggregation of Information Layers" data-slug="grail"> <title> 2:35- 2:55 GRAIL---A Generalized Representation and Aggregation of Information Layers</title> <rect x="525" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(554,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> grail</text></g></a> <a href="/2022/talks/indieweb" title="Putting Org Mode on the Indieweb" data-slug="indieweb"> <title> 3:25- 3:45 Putting Org Mode on the Indieweb</title> <rect stroke-width="3" x="603" y="15" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(632,73)"> <text font-weight="bold" fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> indieweb</text></g></a> <a href="/2022/talks/devel" title="Emacs development updates" data-slug="devel"> <title> 4:05- 4:15 Emacs development updates</title> <rect x="666" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(679,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> devel</text></g></a> <a href="/2022/talks/fanfare" title="Fanfare for the Common Emacs User" data-slug="fanfare"> <title> 4:25- 4:35 Fanfare for the Common Emacs User</title> <rect x="698" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(711,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> fanfare</text></g></a> <a href="/2022/talks/sun-close" title="Sunday closing remarks" data-slug="sun-close"> <title> 4:50- 5:00 Sunday closing remarks</title> <rect x="737" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(750,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sun-close</text></g></a> <a href="/2022/talks/rde" title="rde Emacs introduction" data-slug="rde"> <title> 10:00-10:25 rde Emacs introduction</title> <rect x="94" y="75" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(131,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rde</text></g></a> <a href="/2022/talks/justl" title="justl: Driving recipes within Emacs" data-slug="justl"> <title> 10:50-11:05 justl: Driving recipes within Emacs</title> <rect x="172" y="75" opacity="0.5" width="23" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(193,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> justl</text></g></a> <a href="/2022/talks/rms" title="What I'd like to see in Emacs" data-slug="rms"> <title> 11:15-11:35 What I'd like to see in Emacs</title> <rect x="211" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(240,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rms</text></g></a> <a href="/2022/talks/detached" title="Getting detached from Emacs" data-slug="detached"> <title> 1:01- 1:16 Getting detached from Emacs</title> <rect x="378" y="75" opacity="0.5" width="23" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(399,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> detached</text></g></a> <a href="/2022/talks/eshell" title="Top 10 reasons why you should be using Eshell" data-slug="eshell"> <title> 1:40- 1:55 Top 10 reasons why you should be using Eshell</title> <rect x="439" y="75" opacity="0.5" width="23" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(460,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eshell</text></g></a> <a href="/2022/talks/async" title="Emacs was async before async was cool" data-slug="async"> <title> 2:20- 2:40 Emacs was async before async was cool</title> <rect x="501" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(530,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> async</text></g></a> <a href="/2022/talks/dbus" title="The Wheels on D-Bus" data-slug="dbus"> <title> 3:15- 3:35 The Wheels on D-Bus</title> <rect x="588" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(617,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> dbus</text></g></a> <a href="/2022/talks/localizing" title="Pre-localizing Emacs" data-slug="localizing"> <title> 4:00- 4:10 Pre-localizing Emacs</title> <rect x="658" y="75" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(671,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> localizing</text></g></a> <a href="/2022/talks/python" title="Short hyperlinks to Python docs" data-slug="python"> <title> 4:30- 4:35 Short hyperlinks to Python docs</title> <rect x="705" y="75" opacity="0.5" width="7" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(710,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> python</text></g></a> <g transform="translate(0,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 9 AM</text></g> <g transform="translate(94,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 10 AM</text></g> <g transform="translate(188,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 11 AM</text></g> <g transform="translate(282,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 12 PM</text></g> <g transform="translate(376,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 1 PM</text></g> <g transform="translate(470,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 2 PM</text></g> <g transform="translate(564,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 3 PM</text></g> <g transform="translate(658,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 4 PM</text></g> <g transform="translate(752,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 5 PM</text></g></svg>
</div>
[[!toc ]]
Format: 17-min talk followed by live Q&A (<https://emacsconf.org/current/indieweb/room>)
Etherpad: <https://pad.emacsconf.org/2022-indieweb>
Discuss on IRC: [#emacsconf-gen](https://chat.emacsconf.org/?join=emacsconf,emacsconf-gen)
-Status: Talk captioned
+Status: Now playing on the conference livestream
<div>Times in different timezones:</div><div class="times" start="2022-12-04T20:25:00Z" end="2022-12-04T20:45:00Z"><div class="conf-time">Sunday, Dec 4 2022, ~3:25 PM - 3:45 PM EST (US/Eastern)</div><div class="others"><div>which is the same as:</div>Sunday, Dec 4 2022, ~2:25 PM - 2:45 PM CST (US/Central)<br />Sunday, Dec 4 2022, ~1:25 PM - 1:45 PM MST (US/Mountain)<br />Sunday, Dec 4 2022, ~12:25 PM - 12:45 PM PST (US/Pacific)<br />Sunday, Dec 4 2022, ~8:25 PM - 8:45 PM UTC <br />Sunday, Dec 4 2022, ~9:25 PM - 9:45 PM CET (Europe/Paris)<br />Sunday, Dec 4 2022, ~10:25 PM - 10:45 PM EET (Europe/Athens)<br />Monday, Dec 5 2022, ~1:55 AM - 2:15 AM IST (Asia/Kolkata)<br />Monday, Dec 5 2022, ~4:25 AM - 4:45 AM +08 (Asia/Singapore)<br />Monday, Dec 5 2022, ~5:25 AM - 5:45 AM JST (Asia/Tokyo)</div></div><div><a href="/2022/watch/gen/">Find out how to watch and participate</a></div>
+[[!template id="vid" vidid="indieweb-mainVideo" src="https://media.emacsconf.org/2022/emacsconf-2022-indieweb--putting-org-mode-on-the-indieweb--michael-herstine--main.webm" poster="https://media.emacsconf.org/2022/emacsconf-2022-indieweb--putting-org-mode-on-the-indieweb--michael-herstine--main.png" captions="""<track label="English" kind="captions" srclang="en" src="/2022/captions/emacsconf-2022-indieweb--putting-org-mode-on-the-indieweb--michael-herstine--main.vtt" default />"""
+size="51M" duration="16:35" other_resources="""[Download --main.webm (51MB)](https://media.emacsconf.org/2022/emacsconf-2022-indieweb--putting-org-mode-on-the-indieweb--michael-herstine--main.webm)
+[Download --main.vtt](https://media.emacsconf.org/2022/emacsconf-2022-indieweb--putting-org-mode-on-the-indieweb--michael-herstine--main.vtt)
+[Download --main--chapters.vtt](https://media.emacsconf.org/2022/emacsconf-2022-indieweb--putting-org-mode-on-the-indieweb--michael-herstine--main--chapters.vtt)
+[View transcript](https://emacsconf.org/2022/talks/indieweb#indieweb-mainVideo-transcript)
+[View on Toobnix](https://toobnix.org/w/bTV1JohHSkRvnHYQKZ39hm)
+"""]]
+[[!template id="chapters" vidid="indieweb-mainVideo" data="""
+00:00:00.000 Introduction
+00:14.080 Maintaining a personal website using Org mode
+01:13.880 Problems with comments and isolation
+02:32.040 The Indieweb
+03:17.800 Webmentions
+05:00.600 Decentralized commenting
+07:04.160 The publication framework
+08:48.080 Sending Webmentions
+09:54.000 The process of publication
+11:36.840 Defining new link types
+12:31.920 org-publish-to
+14:07.349 Sending Webmentions with request.el
+14:46.520 Summary
+15:51.400 The future
+
+"""]]
# Description