summaryrefslogtreecommitdiffstats
path: root/2022/info/indieweb-after.md
blob: b6c80433cf2de8e2917640f215d55efd51928f68 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
<!-- 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)


<!-- End of emacsconf-publish-after-page -->