summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--2025/captions/emacsconf-2025-blee-lcnt--bleelcnt-an-emacscentered-content-production-and-selfpublication-framework--mohsen-banan--main--chapters.vtt77
-rw-r--r--2025/captions/emacsconf-2025-blee-lcnt--bleelcnt-an-emacscentered-content-production-and-selfpublication-framework--mohsen-banan--main.vtt2058
-rw-r--r--2025/captions/emacsconf-2025-calc--basic-calc-functionality-for-engineering-or-electronics--christopher-howard--main--chapters.vtt41
-rw-r--r--2025/captions/emacsconf-2025-calc--basic-calc-functionality-for-engineering-or-electronics--christopher-howard--main.vtt888
-rw-r--r--2025/captions/emacsconf-2025-gnus--reading-and-writing-emails-in-gnu-emacs-with-gnus--amin-bandali--main--chapters.vtt50
-rw-r--r--2025/captions/emacsconf-2025-gnus--reading-and-writing-emails-in-gnu-emacs-with-gnus--amin-bandali--main.vtt1332
-rw-r--r--2025/captions/emacsconf-2025-llm--emacs-editors-and-llm-driven-workflows--andrew-hyatt--main.vtt1069
-rw-r--r--2025/captions/emacsconf-2025-python--interactive-python-programming-in-emacs--david-vujic--main.vtt731
-rw-r--r--2025/captions/emacsconf-2025-swanky--swanky-python-interactive-development-for-python--scott-zimmermann--main.vtt1108
-rw-r--r--2025/info/blee-lcnt-after.md701
-rw-r--r--2025/info/blee-lcnt-before.md29
-rw-r--r--2025/info/calc-after.md307
-rw-r--r--2025/info/calc-before.md17
-rw-r--r--2025/info/gmail-before.md2
-rw-r--r--2025/info/gnus-after.md456
-rw-r--r--2025/info/gnus-before.md20
-rw-r--r--2025/info/juicemacs-before.md2
-rw-r--r--2025/info/latex-before.md4
-rw-r--r--2025/info/llm-after.md366
-rw-r--r--2025/info/llm-before.md4
-rw-r--r--2025/info/private-ai-before.md4
-rw-r--r--2025/info/python-after.md252
-rw-r--r--2025/info/python-before.md4
-rw-r--r--2025/info/swanky-after.md380
-rw-r--r--2025/info/swanky-before.md4
-rw-r--r--2025/organizers-notebook/schedule.svg2
-rw-r--r--2025/schedule-details.md12
-rw-r--r--2025/talks/weights.md2
-rw-r--r--2025/watch/dev.md3
-rw-r--r--2025/watch/gen.md3
-rw-r--r--2025/watch/info.md2
-rw-r--r--organizers-notebook/index.org4
32 files changed, 9908 insertions, 26 deletions
diff --git a/2025/captions/emacsconf-2025-blee-lcnt--bleelcnt-an-emacscentered-content-production-and-selfpublication-framework--mohsen-banan--main--chapters.vtt b/2025/captions/emacsconf-2025-blee-lcnt--bleelcnt-an-emacscentered-content-production-and-selfpublication-framework--mohsen-banan--main--chapters.vtt
new file mode 100644
index 00000000..a32fdf09
--- /dev/null
+++ b/2025/captions/emacsconf-2025-blee-lcnt--bleelcnt-an-emacscentered-content-production-and-selfpublication-framework--mohsen-banan--main--chapters.vtt
@@ -0,0 +1,77 @@
+WEBVTT
+
+
+00:00:05.760 --> 00:01:20.079
+Introduction
+
+00:01:20.080 --> 00:02:10.319
+Scope: A complete multi-media content processing framework
+
+00:02:10.320 --> 00:03:02.419
+Prior art and similar art
+
+00:03:02.420 --> 00:03:57.159
+LaTeX-Beamer + Reveal.js with Blee and BISOS
+
+00:03:57.160 --> 00:05:12.519
+Blee-LCNT novel concepts
+
+00:05:12.520 --> 00:06:32.559
+Part of a bigger picture - part of a series
+
+00:06:32.560 --> 00:12:52.639
+Nature of polyexistentials
+
+00:12:52.640 --> 00:14:23.119
+Content processing - a ByStar/BISOS/Blee Capability Bundle (BCB)
+
+00:14:23.120 --> 00:14:31.279
+ByStar containment hierarchy and ByStar capability bundles
+
+00:14:31.280 --> 00:15:21.999
+Aggregated conviviality of ByStar capabilities
+
+00:15:22.000 --> 00:15:47.867
+Parts list: integrated components
+
+00:15:47.868 --> 00:18:45.719
+Resulting contents - output forms and formats
+
+00:18:45.720 --> 00:20:31.979
+reveal.js
+
+00:20:31.980 --> 00:21:33.479
+Generating the video
+
+00:21:33.480 --> 00:22:39.179
+A unified single input -- a sequencef of frames
+
+00:22:39.180 --> 00:23:16.199
+Abstractions to keep in mind
+
+00:23:16.200 --> 00:24:24.359
+Frame control types
+
+00:24:24.360 --> 00:26:25.199
+How outputs are generate from the inputs
+
+00:26:25.200 --> 00:27:46.479
+Context for unified source walkthrough
+
+00:27:46.480 --> 00:29:24.079
+One slide
+
+00:29:24.080 --> 00:31:05.799
+Dynamic blocks
+
+00:31:05.800 --> 00:33:42.279
+Internationalization - a non-Americanist perspective
+
+00:33:42.280 --> 00:35:07.719
+Autonomous self-publication and federated re-publications
+
+00:35:07.720 --> 00:36:02.559
+Ingredients of BISOS platforms and their progression
+
+00:36:02.560 --> 00:36:41.640
+Moving forward
diff --git a/2025/captions/emacsconf-2025-blee-lcnt--bleelcnt-an-emacscentered-content-production-and-selfpublication-framework--mohsen-banan--main.vtt b/2025/captions/emacsconf-2025-blee-lcnt--bleelcnt-an-emacscentered-content-production-and-selfpublication-framework--mohsen-banan--main.vtt
new file mode 100644
index 00000000..90f7b470
--- /dev/null
+++ b/2025/captions/emacsconf-2025-blee-lcnt--bleelcnt-an-emacscentered-content-production-and-selfpublication-framework--mohsen-banan--main.vtt
@@ -0,0 +1,2058 @@
+WEBVTT captioned by mohsen
+
+NOTE Introduction
+
+00:00:05.760 --> 00:00:08.159
+Greetings. Salaam.
+
+00:00:08.160 --> 00:00:10.159
+This is Mohsen Banan.
+
+00:00:10.160 --> 00:00:12.839
+I am a software and internet engineer.
+
+00:00:12.840 --> 00:00:14.679
+The title of this presentation
+
+00:00:14.680 --> 00:00:18.839
+is "Blee-LCNT: An Emacs Centered
+
+00:00:18.840 --> 00:00:23.659
+Content Production and Self-Publication Framework".
+
+00:00:23.660 --> 00:00:25.559
+Blee stands for
+
+00:00:25.560 --> 00:00:29.279
+ByStar Libre-Halaal Emacs Environment.
+
+00:00:29.280 --> 00:00:31.799
+In last year's EmacsConf,
+
+00:00:31.800 --> 00:00:36.079
+I introduced Blee, BISOS and ByStar
+
+00:00:36.080 --> 00:00:39.439
+as concepts and as foundations.
+
+00:00:39.440 --> 00:00:41.079
+This year I want to focus
+
+00:00:41.080 --> 00:00:43.879
+on one concrete capability.
+
+00:00:43.880 --> 00:00:47.959
+Content Production and Self-Publication
+
+00:00:47.960 --> 00:00:54.119
+is a foundational Blee and BISOS Capability Bundle.
+
+00:00:54.120 --> 00:00:55.759
+Both this presentation
+
+00:00:55.760 --> 00:00:59.079
+and the Nature of Polyexistentials book
+
+00:00:59.080 --> 00:01:02.879
+were developed with Blee-LCNT.
+
+00:01:02.880 --> 00:01:06.759
+In this presentation I want to look at Emacs
+
+00:01:06.760 --> 00:01:08.519
+as a central ingredient
+
+00:01:08.520 --> 00:01:10.959
+for a usage environment
+
+00:01:10.960 --> 00:01:14.919
+that we can use to orchestrate production of
+
+00:01:14.920 --> 00:01:20.079
+quite fancy multi-media presentations.
+
+NOTE Scope: A complete multi-media content processing framework
+
+00:01:20.080 --> 00:01:23.079
+Let's consider two different scopes.
+
+00:01:23.080 --> 00:01:27.919
+First, the scope of Blee-LCNT Capabilities Bundle,
+
+00:01:27.920 --> 00:01:29.919
+which is that of a complete
+
+00:01:29.920 --> 00:01:32.599
+multi-media content authorship,
+
+00:01:32.600 --> 00:01:34.799
+generation, publication
+
+00:01:34.800 --> 00:01:37.639
+and distribution framework.
+
+00:01:37.640 --> 00:01:40.999
+That complete scope is presented in this slide
+
+00:01:41.000 --> 00:01:44.239
+and it spans both black ink
+
+00:01:44.240 --> 00:01:46.639
+and violet ink.
+
+00:01:46.640 --> 00:01:49.799
+Second, the scope of this presentation,
+
+00:01:49.800 --> 00:01:52.119
+which is more limited.
+
+00:01:52.120 --> 00:01:54.919
+In this presentation I confine myself
+
+00:01:54.920 --> 00:01:58.519
+to the bullets is violet ink.
+
+00:01:58.520 --> 00:02:01.159
+Here, I focus on presentation
+
+00:02:01.160 --> 00:02:03.599
+and video as content types
+
+00:02:03.600 --> 00:02:05.999
+and their authorship and generation
+
+00:02:06.000 --> 00:02:10.319
+and their federated re-publication.
+
+NOTE Prior art and similar art
+
+00:02:10.320 --> 00:02:12.559
+This is a common topic.
+
+00:02:12.560 --> 00:02:14.839
+It makes good sense for us to start with
+
+00:02:14.840 --> 00:02:19.079
+a review of prior art and similar art.
+
+00:02:19.080 --> 00:02:21.959
+I went through the past EmacsConf talks
+
+00:02:21.960 --> 00:02:23.919
+and found a good number of them
+
+00:02:23.920 --> 00:02:25.999
+that also deal with the topic
+
+00:02:26.000 --> 00:02:28.839
+of content generation.
+
+00:02:28.840 --> 00:02:30.319
+A few of these are included
+
+00:02:30.320 --> 00:02:33.359
+in black ink in this slide.
+
+00:02:33.360 --> 00:02:35.599
+Many of these have chosen the Babel,
+
+00:02:35.600 --> 00:02:40.719
+in other words Org-Mode+LaTeX as primary input.
+
+00:02:40.720 --> 00:02:43.599
+I prefer the inverse of that.
+
+00:02:43.600 --> 00:02:45.839
+I also looked for past talks
+
+00:02:45.840 --> 00:02:49.999
+which have used Reveal.js and LaTeX-Beamer.
+
+00:02:50.000 --> 00:02:53.399
+For example, Sacha's use of Reveal.js
+
+00:02:53.400 --> 00:02:56.959
+is shown in violet inK.
+
+00:02:56.960 --> 00:03:02.419
+And Ihor's use of Beamer is in teal ink.
+
+NOTE LaTeX-Beamer + Reveal.js with Blee and BISOS
+
+00:03:02.420 --> 00:03:05.399
+This presentation is about a combination
+
+00:03:05.400 --> 00:03:08.639
+of Reveal.js and LaTeX-Beamer.
+
+00:03:08.640 --> 00:03:10.599
+For those who may not be familiar
+
+00:03:10.600 --> 00:03:12.619
+with Beamer and Reveal,
+
+00:03:12.620 --> 00:03:14.799
+here is a quick intro.
+
+00:03:14.800 --> 00:03:19.039
+Among academics, LaTeX-Beamer is the go-to tool
+
+00:03:19.040 --> 00:03:22.159
+for producing presentations.
+
+00:03:22.160 --> 00:03:24.239
+Reveal.js is recognized
+
+00:03:24.240 --> 00:03:25.919
+as the best of breed
+
+00:03:25.920 --> 00:03:29.919
+for dispensing HTML slide decks.
+
+00:03:29.920 --> 00:03:32.439
+For many, Reveal and Beamer
+
+00:03:32.440 --> 00:03:35.959
+live in different universes.
+
+00:03:35.960 --> 00:03:38.679
+Beamer is pdf oriented
+
+00:03:38.680 --> 00:03:42.019
+and Reveal is html oriented.
+
+00:03:42.020 --> 00:03:44.519
+Combining two powerful tools
+
+00:03:44.520 --> 00:03:48.359
+makes for an even more powerful tool.
+
+00:03:48.360 --> 00:03:51.879
+This Blee-LCNT Presentations combines
+
+00:03:51.880 --> 00:03:57.159
+the best of LaTeX-Beamer with Reveal.js.
+
+NOTE Blee-LCNT novel concepts
+
+00:03:57.160 --> 00:04:00.679
+Beamer primarily functions as producer
+
+00:04:00.680 --> 00:04:03.099
+and Reveal functions as dispenser
+
+00:04:03.100 --> 00:04:05.579
+and multi-media enhancer.
+
+00:04:05.580 --> 00:04:08.299
+Here is how the combination works.
+
+00:04:08.300 --> 00:04:10.439
+LaTeX Beamer pdf result
+
+00:04:10.440 --> 00:04:13.839
+is dissected into named frame images
+
+00:04:13.840 --> 00:04:18.799
+which can then be inserted in Reveal.js.
+
+00:04:18.800 --> 00:04:21.239
+LaTeX Beamer frames can also be
+
+00:04:21.240 --> 00:04:24.799
+translated into html with HeVeA
+
+00:04:24.800 --> 00:04:28.999
+which can also be inserted in Reveal.js.
+
+00:04:29.000 --> 00:04:31.119
+Voice-overs for Beamer frames
+
+00:04:31.120 --> 00:04:34.039
+can be correlated to frame names
+
+00:04:34.040 --> 00:04:37.119
+and applied to image or html frames.
+
+00:04:37.120 --> 00:04:42.079
+Screen captures and image narrations as videos
+
+00:04:42.080 --> 00:04:44.359
+can be directly dispensed
+
+00:04:44.360 --> 00:04:46.379
+through Reveal.
+
+00:04:46.380 --> 00:04:49.439
+There are various additional novel concepts
+
+00:04:49.440 --> 00:04:50.599
+with regard to the way
+
+00:04:50.600 --> 00:04:54.559
+that we have integrated all of this together.
+
+00:04:54.560 --> 00:04:57.599
+Instead of Org-Mode+LaTeX,
+
+00:04:57.600 --> 00:05:00.999
+we do LaTeX+Org-Mode.
+
+00:05:01.000 --> 00:05:03.999
+Instead of Babel, we do COMEEGA,
+
+00:05:04.000 --> 00:05:05.999
+instead of the Literate model
+
+00:05:06.000 --> 00:05:08.839
+we introduce the Surrounded model.
+
+00:05:08.840 --> 00:05:10.839
+You shall see various examples
+
+00:05:10.840 --> 00:05:12.519
+of these shortly.
+
+NOTE Part of a bigger picture - part of a series
+
+00:05:12.520 --> 00:05:15.639
+All of this is part of a bigger picture.
+
+00:05:15.640 --> 00:05:17.619
+A much bigger picture.
+
+00:05:17.620 --> 00:05:23.599
+My talks at EmacsConf 2021, 2022
+
+00:05:23.600 --> 00:05:26.519
+and 2024 are related.
+
+00:05:26.520 --> 00:05:31.399
+This 2025 talk builds on those.
+
+00:05:31.400 --> 00:05:34.719
+Last year's talk "About Blee:
+
+00:05:34.720 --> 00:05:36.839
+enveloping our own autonomy
+
+00:05:36.840 --> 00:05:38.999
+directed digital ecosystem
+
+00:05:39.000 --> 00:05:42.199
+with Emacs" in particular,
+
+00:05:42.200 --> 00:05:44.979
+lays the foundations for this talk.
+
+00:05:44.980 --> 00:05:47.119
+If you have not seen that,
+
+00:05:47.120 --> 00:05:51.159
+it would make good sense to review it.
+
+00:05:51.160 --> 00:05:54.279
+In my previous talks I have been criticized
+
+00:05:54.280 --> 00:05:58.359
+of having a "prophetic" style.
+
+00:05:58.360 --> 00:06:02.059
+The scope of ByStar is lofty and immense.
+
+00:06:02.060 --> 00:06:04.879
+In many ways it is unbelievable.
+
+00:06:04.880 --> 00:06:09.139
+And EmacsConf talks are meant to be short.
+
+00:06:09.140 --> 00:06:11.839
+So, as a result, sometimes
+
+00:06:11.840 --> 00:06:13.959
+I end up being cryptic.
+
+00:06:13.960 --> 00:06:17.499
+Having accepted the "prophetic" criticism
+
+00:06:17.500 --> 00:06:19.399
+as legitimate,
+
+00:06:19.400 --> 00:06:23.599
+I now need to put a book on the table.
+
+00:06:23.600 --> 00:06:26.839
+With that book in place, moving forward,
+
+00:06:26.840 --> 00:06:29.339
+when needing to be cryptic,
+
+00:06:29.340 --> 00:06:32.559
+I shall cite Chapter and Verse.
+
+NOTE Nature of polyexistentials
+
+00:06:32.560 --> 00:06:34.879
+I am delighted to announce
+
+00:06:34.880 --> 00:06:37.559
+the availability of my recent book,
+
+00:06:37.560 --> 00:06:40.199
+"Nature of Polyexistentials".
+
+00:06:40.200 --> 00:06:42.959
+The full title of my book is:
+
+00:06:42.960 --> 00:06:45.039
+Nature Of Polyexistentials---
+
+00:06:45.040 --> 00:06:48.239
+Basis For Abolishment Of The Western
+
+00:06:48.240 --> 00:06:51.219
+Intellectual Property Rights Regime---
+
+00:06:51.220 --> 00:06:53.899
+And Introduction Of The Libre-Halaal
+
+00:06:53.900 --> 00:06:56.999
+ByStar Digital Ecosystem.
+
+00:06:57.000 --> 00:06:59.199
+Knowledge, know-how, uses of know-how,
+
+00:06:59.200 --> 00:07:02.879
+ideas, formulas, software and information
+
+00:07:02.880 --> 00:07:05.519
+are inherently non-scarce.
+
+00:07:05.520 --> 00:07:08.439
+They are *polyexistentials*.
+
+00:07:08.440 --> 00:07:10.239
+Unlike monoexistentials
+
+00:07:10.240 --> 00:07:12.259
+which exist in singular,
+
+00:07:12.260 --> 00:07:17.539
+polyexistentials naturally exist in multiples.
+
+00:07:17.540 --> 00:07:19.559
+What is abundant in nature
+
+00:07:19.560 --> 00:07:22.599
+is being made artificially scarce
+
+00:07:22.600 --> 00:07:25.399
+through man-made ownership rules
+
+00:07:25.400 --> 00:07:28.599
+called copyright and patents.
+
+00:07:28.600 --> 00:07:31.239
+These mistaken ownership rules,
+
+00:07:31.240 --> 00:07:34.959
+the so called Western IPR regime,
+
+00:07:34.960 --> 00:07:37.319
+has immense ramifications
+
+00:07:37.320 --> 00:07:38.839
+on the shape and the direction
+
+00:07:38.840 --> 00:07:42.619
+of the American Digital Ecosystem.
+
+00:07:42.620 --> 00:07:45.119
+It would be an understatement to say
+
+00:07:45.120 --> 00:07:47.779
+that the American Digital Ecosystem
+
+00:07:47.780 --> 00:07:50.599
+has put humanity in danger.
+
+00:07:50.600 --> 00:07:53.099
+Two parts of the book, in particular
+
+00:07:53.100 --> 00:07:55.679
+are of immediate relevance.
+
+00:07:55.680 --> 00:07:58.219
+Part III, the ethics layer,
+
+00:07:58.220 --> 00:08:01.119
+focuses on contours of cures.
+
+00:08:01.120 --> 00:08:02.839
+Having dismissed the Western
+
+00:08:02.840 --> 00:08:06.119
+intellectual property rights (IPR) regime
+
+00:08:06.120 --> 00:08:11.739
+as an erroneous governance model for polyexistentials,
+
+00:08:11.740 --> 00:08:14.319
+I propose the Libre-Halaal model
+
+00:08:14.320 --> 00:08:17.199
+of governance of polyexistentials
+
+00:08:17.200 --> 00:08:22.779
+towards facilitating conviviality of tools.
+
+00:08:22.780 --> 00:08:25.359
+Part IV, the engineering layer,
+
+00:08:25.360 --> 00:08:29.599
+introduces the Libre-Halaal ByStar Digital Ecosystem.
+
+00:08:29.600 --> 00:08:32.399
+as an ethical alternative
+
+00:08:32.400 --> 00:08:34.239
+to the prevailing proprietary
+
+00:08:34.240 --> 00:08:37.499
+American digital ecosystem.
+
+00:08:37.500 --> 00:08:40.479
+The book also provides additional details
+
+00:08:40.480 --> 00:08:42.919
+about the content generation
+
+00:08:42.920 --> 00:08:44.919
+and publication facilities
+
+00:08:44.920 --> 00:08:46.839
+that I am presenting here.
+
+00:08:46.840 --> 00:08:50.079
+And the book itself, as content,
+
+00:08:50.080 --> 00:08:53.439
+was generated and published
+
+00:08:53.440 --> 00:08:55.319
+using the facilities
+
+00:08:55.320 --> 00:08:57.239
+that I am presenting here.
+
+00:08:57.240 --> 00:08:59.199
+You can think of this book
+
+00:08:59.200 --> 00:09:01.159
+as being in two volumes.
+
+00:09:01.160 --> 00:09:05.919
+Our focus are Blee and BISOS in Volume II.
+
+00:09:05.920 --> 00:09:10.239
+Volume I deals with the general concept
+
+00:09:10.240 --> 00:09:13.879
+of polyexistence and invalidity
+
+00:09:13.880 --> 00:09:18.679
+of IPR and our terminoloy of Libre-Halaal---
+
+00:09:18.680 --> 00:09:23.519
+instead of the common but ill directed vocabulary
+
+00:09:23.520 --> 00:09:28.239
+of Free Software and Open-Source and FOSS.
+
+00:09:28.240 --> 00:09:31.239
+In Chapter 11, I introduce
+
+00:09:31.240 --> 00:09:34.759
+the very sensitive and potent vocabulary
+
+00:09:34.760 --> 00:09:37.719
+of Halaal and Libre-Halaal.
+
+00:09:37.720 --> 00:09:39.079
+The contents of this book
+
+00:09:39.080 --> 00:09:41.659
+belong to all of humanity
+
+00:09:41.660 --> 00:09:45.519
+and verbatim copying of it is unrestricted.
+
+00:09:45.520 --> 00:09:49.479
+If you want to read it, this book is yours.
+
+00:09:49.480 --> 00:09:51.839
+The "Nature of Polyexistentials" book
+
+00:09:51.840 --> 00:09:56.659
+is available both online and in print.
+
+00:09:56.660 --> 00:09:59.439
+This book is available as two editions.
+
+00:09:59.440 --> 00:10:03.819
+The US Edition and the International edition.
+
+00:10:03.820 --> 00:10:05.959
+The US Edition is written
+
+00:10:05.960 --> 00:10:10.079
+with a slightly milder Western unfriendly tone,
+
+00:10:10.080 --> 00:10:12.399
+while the International Edition
+
+00:10:12.400 --> 00:10:17.619
+includes additional original content in Farsi.
+
+00:10:17.620 --> 00:10:20.399
+I consider the International Edition
+
+00:10:20.400 --> 00:10:22.979
+to be the authoritative version.
+
+00:10:22.980 --> 00:10:25.319
+However, many readers in
+
+00:10:25.320 --> 00:10:27.319
+the US and Western countries
+
+00:10:27.320 --> 00:10:31.199
+may prefer the US Edition.
+
+00:10:31.200 --> 00:10:33.999
+I maintain separate Git repositories
+
+00:10:34.000 --> 00:10:36.039
+for each edition on GitHub:
+
+00:10:36.040 --> 00:10:42.839
+US Edition is at bxplpc/120033
+
+00:10:42.840 --> 00:10:51.419
+and International Edition: bxplpc/120074
+
+00:10:51.420 --> 00:10:53.679
+Cloning these repositories
+
+00:10:53.680 --> 00:10:56.399
+will give you access to the book
+
+00:10:56.400 --> 00:11:00.039
+in PDF format (suitable for both
+
+00:11:00.040 --> 00:11:04.039
+A4 and US Letter printing)
+
+00:11:04.040 --> 00:11:06.379
+and in EPUB format.
+
+00:11:06.380 --> 00:11:08.559
+Alternatively, the content
+
+00:11:08.560 --> 00:11:12.039
+can be downloaded directly from your browser
+
+00:11:12.040 --> 00:11:17.259
+without needing to clone the repositories.
+
+00:11:17.260 --> 00:11:19.079
+To ensure broader online
+
+00:11:19.080 --> 00:11:21.899
+availability and stability,
+
+00:11:21.900 --> 00:11:26.159
+I have also published the book on Zenodo,
+
+00:11:26.160 --> 00:11:31.779
+complete with a DOI (Digital Object Identifier).
+
+00:11:31.780 --> 00:11:34.439
+You can download both the A4
+
+00:11:34.440 --> 00:11:39.639
+and 8.5 x 11 PDFs from there as well.
+
+00:11:39.640 --> 00:11:44.119
+The book is also available in print on Amazon
+
+00:11:44.120 --> 00:11:46.239
+and at most major bookstores
+
+00:11:46.240 --> 00:11:49.379
+in the US and Western regions.
+
+00:11:49.380 --> 00:11:51.519
+The ISBNs for both editions
+
+00:11:51.520 --> 00:11:54.139
+are included in this slide.
+
+00:11:54.140 --> 00:11:56.319
+Additionally, I have published
+
+00:11:56.320 --> 00:12:00.719
+this book in Iran through Jangal Publishers.
+
+00:12:00.720 --> 00:12:03.079
+I did not write this book for profit.
+
+00:12:03.080 --> 00:12:05.359
+My aim is to share my thoughts
+
+00:12:05.360 --> 00:12:10.599
+and encourage readers to engage with my views and ideas.
+
+00:12:10.600 --> 00:12:12.499
+Your feedback is welcome,
+
+00:12:12.500 --> 00:12:14.119
+and I am genuinely interested
+
+00:12:14.120 --> 00:12:17.199
+in hearing your perspectives.
+
+00:12:17.200 --> 00:12:20.879
+In Western markets, I have priced the print edition
+
+00:12:20.880 --> 00:12:24.339
+somewhat above production costs.
+
+00:12:24.340 --> 00:12:26.639
+If you find value in the book
+
+00:12:26.640 --> 00:12:28.599
+and the ByStar project,
+
+00:12:28.600 --> 00:12:32.759
+purchasing a copy will help support my work.
+
+00:12:32.760 --> 00:12:37.459
+Thanks in advance for your support.
+
+00:12:37.460 --> 00:12:39.479
+And here are the same links
+
+00:12:39.480 --> 00:12:42.179
+as a native Reveal slide.
+
+00:12:42.180 --> 00:12:43.839
+If instead of a video,
+
+00:12:43.840 --> 00:12:47.759
+you are viewing this presentation as a Reveal web page,
+
+00:12:47.760 --> 00:12:52.639
+you can just click on the pointers and URLs.
+
+NOTE Content processing - a ByStar/BISOS/Blee Capability Bundle (BCB)
+
+00:12:52.640 --> 00:12:55.079
+Instead of the traditional model
+
+00:12:55.080 --> 00:12:59.559
+of giving you recipes in a DIY context
+
+00:12:59.560 --> 00:13:01.479
+towards the goal of creating
+
+00:13:01.480 --> 00:13:04.559
+content processing capabilities
+
+00:13:04.560 --> 00:13:07.659
+on top of what you may already have,
+
+00:13:07.660 --> 00:13:09.959
+I am doing the opposite.
+
+00:13:09.960 --> 00:13:15.159
+I am saying: take this whole BISOS and Blee thing,
+
+00:13:15.160 --> 00:13:17.559
+and in there you will also have
+
+00:13:17.560 --> 00:13:20.239
+the content processing capabilities
+
+00:13:20.240 --> 00:13:22.579
+that I am speaking of here.
+
+00:13:22.580 --> 00:13:24.919
+So, at the top level we have
+
+00:13:24.920 --> 00:13:27.519
+our own autonomy and privacy
+
+00:13:27.520 --> 00:13:30.199
+directed digital ecosystem,
+
+00:13:30.200 --> 00:13:32.839
+which in contrast to the center oriented
+
+00:13:32.840 --> 00:13:35.659
+American digital ecosystem,
+
+00:13:35.660 --> 00:13:38.479
+is edge oriented.
+
+00:13:38.480 --> 00:13:40.919
+We call it: "The Libre-Halaal
+
+00:13:40.920 --> 00:13:43.919
+ByStar Digital Ecosystem".
+
+00:13:43.920 --> 00:13:45.799
+All the systems in ByStar,
+
+00:13:45.800 --> 00:13:50.699
+run BISOS (By* Internet Services OS),
+
+00:13:50.700 --> 00:13:53.759
+which is a layer on top of Debian.
+
+00:13:53.760 --> 00:13:58.199
+The usage environment of ByStar and BISOS is Blee
+
+00:13:58.200 --> 00:14:01.579
+which is a layer on top of Emacs.
+
+00:14:01.580 --> 00:14:04.919
+With those in place, we then create
+
+00:14:04.920 --> 00:14:10.139
+a capability bundle called Blee-LCNT.
+
+00:14:10.140 --> 00:14:13.039
+So, when you buy into Blee and BISOS,
+
+00:14:13.040 --> 00:14:15.199
+you will naturally also get
+
+00:14:15.200 --> 00:14:18.719
+these content processing capabilities---
+
+00:14:18.720 --> 00:14:23.119
+without a need for any recipies or DIY effort.
+
+NOTE ByStar containment hierarchy and ByStar capability bundles
+
+00:14:23.120 --> 00:14:24.879
+If you were to look at the model
+
+00:14:24.880 --> 00:14:29.119
+that I introduced as containment hierarchies,
+
+00:14:29.120 --> 00:14:31.279
+it would look like this.
+
+NOTE Aggregated conviviality of ByStar capabilities
+
+00:14:31.280 --> 00:14:33.779
+We love Emacs and we love Unix
+
+00:14:33.780 --> 00:14:36.759
+because their design is convivial.
+
+00:14:36.760 --> 00:14:39.199
+By convivial, I am referring
+
+00:14:39.200 --> 00:14:40.759
+to Ivan Illich's concept
+
+00:14:40.760 --> 00:14:45.319
+and terminology of "Tools for Conviviality".
+
+00:14:45.320 --> 00:14:48.679
+It was first published in 1973.
+
+00:14:48.680 --> 00:14:50.959
+It's a must read.
+
+00:14:50.960 --> 00:14:52.639
+A goal of the design
+
+00:14:52.640 --> 00:14:54.799
+of the ByStar Digital Ecosystem
+
+00:14:54.800 --> 00:14:57.479
+is to enlarge the aggregated
+
+00:14:57.480 --> 00:15:01.719
+conviviality of its capabilities.
+
+00:15:01.720 --> 00:15:04.719
+What distinguishes Blee-LCNT
+
+00:15:04.720 --> 00:15:08.959
+from other content processing tools and frameworks,
+
+00:15:08.960 --> 00:15:12.439
+is our emphasis on enhancing
+
+00:15:12.440 --> 00:15:15.659
+the aggregated conviviality.
+
+00:15:15.660 --> 00:15:19.259
+These tools let you express yourself.
+
+00:15:19.260 --> 00:15:21.999
+They let you be in charge.
+
+NOTE Parts list: integrated components
+
+00:15:22.000 --> 00:15:24.499
+Here is our parts list.
+
+00:15:24.500 --> 00:15:25.839
+These are the components
+
+00:15:25.840 --> 00:15:27.959
+that we have chosen to bring together
+
+00:15:27.960 --> 00:15:32.779
+towards our goal of creating convivial tools.
+
+00:15:32.780 --> 00:15:36.039
+In this slide, we are using black ink
+
+00:15:36.040 --> 00:15:38.519
+to denote exisiting tools
+
+00:15:38.520 --> 00:15:41.339
+and we use violet ink
+
+00:15:41.340 --> 00:15:44.419
+to denote pieces that we have developed
+
+00:15:44.420 --> 00:15:47.100
+towards cohesive integration.
+
+00:15:46.560 --> 00:15:47.867
+[This] video,
+
+NOTE Resulting contents - output forms and formats
+
+00:15:47.868 --> 00:15:51.479
+the video is just one of the outputs.
+
+00:15:51.480 --> 00:15:54.499
+There are other outputs as well.
+
+00:15:54.500 --> 00:15:56.359
+In this figure, the outputs
+
+00:15:56.360 --> 00:15:58.859
+are shown in the top layer.
+
+00:15:58.860 --> 00:16:02.279
+Using this video as an example,
+
+00:16:02.280 --> 00:16:05.599
+this presentation's output also include
+
+00:16:05.600 --> 00:16:07.599
+the "Presentation Form"
+
+00:16:07.600 --> 00:16:10.999
+and the "Article-Presentation Form".
+
+00:16:11.000 --> 00:16:13.719
+Let's look at these more closely.
+
+00:16:13.720 --> 00:16:17.259
+For Presentations, there are 3 different forms.
+
+00:16:17.260 --> 00:16:19.559
+The Video Form, the Presentation From
+
+00:16:19.560 --> 00:16:22.819
+and the Article-Presentation Form.
+
+00:16:22.820 --> 00:16:27.439
+The Presentation Form produces both a pdf output
+
+00:16:27.440 --> 00:16:29.079
+and Reveal output.
+
+00:16:29.080 --> 00:16:32.879
+Next we will walkthrough some of the benefits
+
+00:16:32.880 --> 00:16:35.519
+that availability of these forms
+
+00:16:35.520 --> 00:16:38.099
+and formats provide.
+
+00:16:38.100 --> 00:16:41.959
+The video presentation that you are watching
+
+00:16:41.960 --> 00:16:44.599
+is just one of the outputs
+
+00:16:44.600 --> 00:16:48.479
+of the Blee-LCNT machinery.
+
+00:16:48.480 --> 00:16:52.679
+There are two PDF format outputs
+
+00:16:52.680 --> 00:16:56.439
+and two HTML outputs
+
+00:16:56.440 --> 00:16:58.859
+that are also quite useful.
+
+00:16:58.860 --> 00:17:02.119
+The primary output of Beamer
+
+00:17:02.120 --> 00:17:04.239
+is a set of slides
+
+00:17:04.240 --> 00:17:10.439
+that people use to give their talks with.
+
+00:17:10.440 --> 00:17:12.479
+Typically that's done live.
+
+00:17:12.480 --> 00:17:19.179
+In my case I dissect the images of each frame
+
+00:17:19.180 --> 00:17:21.639
+and do a voiceover on it
+
+00:17:21.640 --> 00:17:28.839
+and then dispense it through reveal.
+
+00:17:28.840 --> 00:17:33.379
+In a second, you will see that as well.
+
+00:17:33.380 --> 00:17:36.959
+This PDF output is very useful.
+
+00:17:36.960 --> 00:17:39.279
+You get the table of contents, of course,
+
+00:17:39.280 --> 00:17:42.207
+and in addition to that,
+
+00:17:42.208 --> 00:17:46.319
+Beamer generates navigations for you
+
+00:17:46.320 --> 00:17:49.599
+where on any part you get
+
+00:17:49.600 --> 00:17:51.839
+a small table of content as well.
+
+00:17:51.840 --> 00:17:57.119
+This is heavily used amongst academics,
+
+00:17:57.120 --> 00:18:00.959
+and it's a good output on its own,
+
+00:18:00.960 --> 00:18:03.319
+and I'm augmenting it
+
+00:18:03.320 --> 00:18:05.399
+in a variety of ways.
+
+00:18:05.400 --> 00:18:09.719
+In addition to the presentation PDF format,
+
+00:18:09.720 --> 00:18:15.359
+there is also an article-presentation PDF format
+
+00:18:15.360 --> 00:18:18.799
+which gives you the same content,
+
+00:18:18.800 --> 00:18:25.159
+but it gives it to you in a textual form
+
+00:18:25.160 --> 00:18:30.939
+with the table of content and the rest.
+
+00:18:30.940 --> 00:18:34.759
+This is a good form to use
+
+00:18:34.760 --> 00:18:39.919
+when you are giving, for example, class lectures,
+
+00:18:39.920 --> 00:18:45.719
+and the students often prefer this format.
+
+NOTE reveal.js
+
+00:18:45.720 --> 00:18:51.839
+Now for the HTML format output, the most relevant,
+
+00:18:51.840 --> 00:18:55.599
+of course, is the reveal itself.
+
+00:18:55.600 --> 00:19:05.679
+If you have not used reveal before,
+
+00:19:05.680 --> 00:19:10.559
+in my view, it's a HTML slide dispenser.
+
+00:19:10.560 --> 00:19:15.479
+I don't look at it as a presentation framework.
+
+00:19:15.480 --> 00:19:22.599
+I use, as you are seeing, we use Beamer to feed into it
+
+00:19:22.600 --> 00:19:25.759
+and we use it to dispense the information.
+
+00:19:25.760 --> 00:19:33.439
+It has all the typical navigation
+
+00:19:33.440 --> 00:19:39.959
+capabilities that you would expect,
+
+00:19:39.960 --> 00:19:44.319
+and most of what I have as slides are images,
+
+00:19:44.320 --> 00:19:48.239
+but occasionally, particularly when there is a need
+
+00:19:48.240 --> 00:19:52.999
+to provide pointers, HTML pointers,
+
+00:19:53.000 --> 00:20:01.439
+I then also include a textual output.
+
+00:20:01.440 --> 00:20:05.559
+This is also produced
+
+00:20:05.560 --> 00:20:09.839
+from the Beamer LaTeX source,
+
+00:20:09.840 --> 00:20:14.959
+but it's HTML through textual HTML,
+
+00:20:14.960 --> 00:20:19.019
+through HeVeA, not the image.
+
+00:20:19.020 --> 00:20:22.499
+You can... you get a table of contents.
+
+00:20:22.500 --> 00:20:24.574
+You can navigate
+
+00:20:24.575 --> 00:20:28.079
+and there are a whole lot of other features
+
+00:20:28.080 --> 00:20:31.979
+that reveal also provides.
+
+NOTE Generating the video
+
+00:20:31.980 --> 00:20:35.879
+So to generate the video,
+
+00:20:35.880 --> 00:20:40.980
+what I do is I come to
+
+00:20:40.981 --> 00:20:49.459
+the very beginning of the presentation.
+
+00:20:49.460 --> 00:20:51.519
+I turn on the screen capture recorder,
+
+00:20:51.520 --> 00:20:54.159
+and then I start playing
+
+00:20:54.160 --> 00:20:58.239
+the voiceover for each slide
+
+00:20:58.240 --> 00:21:02.519
+and at the very end, you get a video,
+
+00:21:02.520 --> 00:21:08.759
+but what you just did is you dispensed every frame,
+
+00:21:08.760 --> 00:21:11.279
+one at a time, through reveal.
+
+00:21:11.280 --> 00:21:15.319
+In addition to this HTML form,
+
+00:21:15.320 --> 00:21:22.239
+you also get an article presentation form of it,
+
+00:21:22.240 --> 00:21:24.159
+with a full table of contents
+
+00:21:24.160 --> 00:21:27.759
+and the videos are there, and the notes are there,
+
+00:21:27.760 --> 00:21:33.479
+and this is also quite useful.
+
+NOTE A unified single input -- a sequencef of frames
+
+00:21:33.480 --> 00:21:36.519
+Now, let's look at the one single input file
+
+00:21:36.520 --> 00:21:38.879
+that produced all of the outputs
+
+00:21:38.880 --> 00:21:39.879
+that we just saw.
+
+00:21:39.880 --> 00:21:43.079
+I have put both the input file
+
+00:21:43.080 --> 00:21:45.119
+and some of the output files
+
+00:21:45.120 --> 00:21:48.299
+for this presentation on Github.
+
+00:21:48.300 --> 00:21:49.839
+Here are some links
+
+00:21:49.840 --> 00:21:51.679
+to these repos and files.
+
+00:21:51.680 --> 00:21:54.679
+And here are the same links
+
+00:21:54.680 --> 00:21:57.119
+as a native Reveal slide.
+
+00:21:57.120 --> 00:21:59.879
+This figure gives us an overview
+
+00:21:59.880 --> 00:22:02.759
+of how one set of inputs
+
+00:22:02.760 --> 00:22:04.959
+encapsulted in a single file
+
+00:22:04.960 --> 00:22:08.759
+can produce all of the outputs that we saw.
+
+00:22:08.760 --> 00:22:11.439
+The main TeX file shown at the bottom
+
+00:22:11.440 --> 00:22:15.659
+is processed by both XeLaTeX and by HeVeA.
+
+00:22:15.660 --> 00:22:18.279
+That main TeX file, in addition
+
+00:22:18.280 --> 00:22:19.679
+to LaTeX syntax,
+
+00:22:19.680 --> 00:22:22.999
+also include org-mode constructs
+
+00:22:23.000 --> 00:22:27.039
+that facilitate addition of audio and video files.
+
+00:22:27.040 --> 00:22:34.879
+Later, I'll walkthrough the bodyPresArtEnFa.tex file
+
+00:22:34.880 --> 00:22:39.179
+that generated this very presentation with you.
+
+NOTE Abstractions to keep in mind
+
+00:22:39.180 --> 00:22:42.679
+When you construct that primary TeX file,
+
+00:22:42.680 --> 00:22:44.679
+there are several abstractions
+
+00:22:44.680 --> 00:22:46.899
+that you need to keep in mind.
+
+00:22:46.900 --> 00:22:49.119
+Is my presentation going to go
+
+00:22:49.120 --> 00:22:52.739
+from Left-To-Right or from Right-To-Left?
+
+00:22:52.740 --> 00:22:57.039
+Perso-Arabic presentations go from Right-To-Left.
+
+00:22:57.040 --> 00:22:59.679
+Another consideration is the types
+
+00:22:59.680 --> 00:23:03.119
+of forms of results that you want.
+
+00:23:03.120 --> 00:23:05.019
+Just the presentation
+
+00:23:05.020 --> 00:23:08.999
+or Article-Presentation as well?
+
+00:23:09.000 --> 00:23:10.879
+With those choices in place
+
+00:23:10.880 --> 00:23:13.399
+you can produce condition based text
+
+00:23:13.400 --> 00:23:16.199
+for each of your desired outputs.
+
+NOTE Frame control types
+
+00:23:16.200 --> 00:23:18.919
+Think of this video presentation
+
+00:23:18.920 --> 00:23:20.879
+as a sequence of frames.
+
+00:23:20.880 --> 00:23:26.119
+Each frame is controlled by an org-mode dynamic block.
+
+00:23:26.120 --> 00:23:29.039
+This table lists available dblocks
+
+00:23:29.040 --> 00:23:31.559
+from which you can choose.
+
+00:23:31.560 --> 00:23:34.039
+For example, this particular frame
+
+00:23:34.040 --> 00:23:34.839
+that we are watching
+
+00:23:34.840 --> 00:23:41.979
+is controlled by b:lcnt:pres:frame/derivedImage.
+
+00:23:41.980 --> 00:23:44.639
+Beamer creates a pdf file
+
+00:23:44.640 --> 00:23:47.879
+that includes the image of this slide.
+
+00:23:47.880 --> 00:23:51.459
+That image is then injected into Reveal.
+
+00:23:51.460 --> 00:23:55.359
+And in the end, a video of that image is produced
+
+00:23:55.360 --> 00:23:57.239
+with the narrations
+
+00:23:57.240 --> 00:23:59.259
+that I am uttering right now.
+
+00:23:59.260 --> 00:24:02.199
+All of this has similarly been applied
+
+00:24:02.200 --> 00:24:03.599
+to each and every frame
+
+00:24:03.600 --> 00:24:05.919
+that you have been watching.
+
+00:24:05.920 --> 00:24:08.399
+Similar to Frame Controls,
+
+00:24:08.400 --> 00:24:10.719
+there are org-mode dynamic blocks
+
+00:24:10.720 --> 00:24:13.519
+for "Frame Body Types".
+
+00:24:13.520 --> 00:24:15.839
+You can easily insert an image
+
+00:24:15.840 --> 00:24:19.639
+which is typically created by OpenOffice Draw
+
+00:24:19.640 --> 00:24:21.619
+into a frame.
+
+00:24:21.620 --> 00:24:24.359
+Same with say a screen capture video.
+
+NOTE How outputs are generate from the inputs
+
+00:24:24.360 --> 00:24:29.319
+Now that we have looked at the "Outputs" and the "Inputs",
+
+00:24:29.320 --> 00:24:31.679
+let's look at how the Outputs
+
+00:24:31.680 --> 00:24:35.919
+are generated from the Inputs.
+
+00:24:35.920 --> 00:24:39.399
+Let's bootstrap Raw-BISOS and Raw-Blee.
+
+00:24:39.400 --> 00:24:41.719
+Starting from scratch,
+
+00:24:41.720 --> 00:24:45.799
+get yourself a fresh copy of Debian 12.
+
+00:24:45.800 --> 00:24:52.719
+Then go to https://github.com/bxGenesis/start .
+
+00:24:52.720 --> 00:24:55.079
+The README.org file
+
+00:24:55.080 --> 00:24:57.119
+of that github repo
+
+00:24:57.120 --> 00:24:58.639
+is same as Chapter 18,
+
+00:24:58.640 --> 00:25:01.959
+"Engineering Adoption of BISOS and ByStar" of the book.
+
+00:25:01.960 --> 00:25:05.359
+We will next run "raw-bisos.sh",
+
+00:25:05.360 --> 00:25:09.959
+but prior to that, let's take a quick look.
+
+00:25:09.960 --> 00:25:14.759
+This bootstrap scripts will do a lot as root
+
+00:25:14.760 --> 00:25:16.479
+on your Fresh-Debian.
+
+00:25:16.480 --> 00:25:18.599
+It is best to first try it
+
+00:25:18.600 --> 00:25:21.179
+on a disposable VM.
+
+00:25:21.180 --> 00:25:27.159
+raw-bisos.sh adds the current debian user to sudoers.
+
+00:25:27.160 --> 00:25:30.399
+Then it installs pipx.
+
+00:25:30.400 --> 00:25:34.199
+And then with pipx it installs
+
+00:25:34.200 --> 00:25:37.999
+from PyPI bisos.provision.
+
+00:25:38.000 --> 00:25:43.279
+bisos.provision includes additional bash scripts
+
+00:25:43.280 --> 00:25:45.359
+that are then executed.
+
+00:25:45.360 --> 00:25:48.159
+Full installation involves
+
+00:25:48.160 --> 00:25:51.039
+setting up various accounts, groups,
+
+00:25:51.040 --> 00:25:53.279
+various directory hierarchies,
+
+00:25:53.280 --> 00:25:55.439
+lots of apt packages
+
+00:25:55.440 --> 00:25:57.979
+and lots of python packages
+
+00:25:57.980 --> 00:26:01.499
+from the bisos namespace.
+
+00:26:01.500 --> 00:26:03.879
+If you are ready, copy and paste
+
+00:26:03.880 --> 00:26:06.599
+this line and run it.
+
+00:26:06.600 --> 00:26:08.039
+You will be prompted
+
+00:26:08.040 --> 00:26:09.619
+for the root password.
+
+00:26:09.620 --> 00:26:11.279
+Then be patient.
+
+00:26:11.280 --> 00:26:12.559
+Full installation
+
+00:26:12.560 --> 00:26:14.519
+can take 15 minutes or so.
+
+00:26:14.520 --> 00:26:17.079
+The logs of this script
+
+00:26:17.080 --> 00:26:18.519
+are also captured
+
+00:26:18.520 --> 00:26:25.199
+in ~/raw-bisos-${dateTag}-log.org
+
+NOTE Context for unified source walkthrough
+
+00:26:25.200 --> 00:26:28.959
+Now that we have Raw-BISOS and Raw-Blee installed,
+
+00:26:28.960 --> 00:26:31.039
+we are ready to walk through
+
+00:26:31.040 --> 00:26:32.319
+the unified source
+
+00:26:32.320 --> 00:26:34.439
+of the very presentation
+
+00:26:34.440 --> 00:26:36.259
+that you are watching.
+
+00:26:36.260 --> 00:26:40.959
+The "bodyPresArtEnFa.tex" file
+
+00:26:40.960 --> 00:26:42.439
+that we will visit
+
+00:26:42.440 --> 00:26:45.059
+is in COMEEGA-LaTeX syntax
+
+00:26:45.060 --> 00:26:47.699
+with lots of org-mode dblocks
+
+00:26:47.700 --> 00:26:50.479
+which generate Beamer-LaTeX frames
+
+00:26:50.480 --> 00:26:54.139
+and conditioned LaTeX bodies.
+
+00:26:54.140 --> 00:26:55.599
+After the walkthrough,
+
+00:26:55.600 --> 00:27:00.359
+I'll describe dblocks and COMEEGA in more detail.
+
+00:27:00.360 --> 00:27:02.239
+At the tail end of the walkthrough,
+
+00:27:02.240 --> 00:27:05.319
+we will also go through the generation process
+
+00:27:05.320 --> 00:27:10.859
+which runs XeLaTeX and HeVeA and a lot more.
+
+00:27:10.860 --> 00:27:13.619
+Let's look at our input file.
+
+00:27:13.620 --> 00:27:17.019
+It's a LaTeX file in LaTeX mode,
+
+00:27:17.020 --> 00:27:24.279
+and it has org syntax org-mode included in it,
+
+00:27:24.280 --> 00:27:29.559
+and I can toggle between LaTeX and org-mode.
+
+00:27:29.560 --> 00:27:33.599
+So, now I'm gonna be in org-mode,
+
+00:27:33.600 --> 00:27:37.839
+and org-mode gives me everything
+
+00:27:37.840 --> 00:27:39.399
+that org has to offer,
+
+00:27:39.400 --> 00:27:46.479
+including a very convenient navigation framework.
+
+NOTE One slide
+
+00:27:46.480 --> 00:27:54.279
+Let's take one slide and take a look at how it was done.
+
+00:27:54.280 --> 00:27:58.679
+So I would come to this scope slide
+
+00:27:58.680 --> 00:28:03.999
+and while I am there, I'm going to click on N.
+
+00:28:04.000 --> 00:28:09.759
+N takes me to the native LaTeX form back,
+
+00:28:09.760 --> 00:28:16.359
+so that I'll be looking at it not in org, but in LaTeX.
+
+00:28:16.360 --> 00:28:22.906
+So we're back in LaTeX, and as you can see
+
+00:28:22.907 --> 00:28:25.999
+it uses a dynamic block
+
+00:28:26.000 --> 00:28:30.799
+starting with the comments and the BEGIN,
+
+00:28:30.800 --> 00:28:34.839
+and it uses a dynamic block
+
+00:28:34.840 --> 00:28:38.079
+named a framedDrive image,
+
+00:28:38.080 --> 00:28:45.399
+which means the content of this frame
+
+00:28:45.400 --> 00:28:50.439
+will be dispensed as an image, not as text,
+
+00:28:50.440 --> 00:28:56.899
+and it also automatically creates for me
+
+00:28:56.900 --> 00:29:00.439
+a name, a label, that can be used
+
+00:29:00.440 --> 00:29:05.119
+for voiceover augmentation.
+
+00:29:05.120 --> 00:29:08.119
+So a file in the audio directory
+
+00:29:08.120 --> 00:29:13.039
+called ScopeOfBleeLcnt.mp3
+
+00:29:13.040 --> 00:29:19.319
+is this audio that will come on top of this slide
+
+00:29:19.320 --> 00:29:24.079
+and then the rest is the LaTeX itself.
+
+NOTE Dynamic blocks
+
+00:29:24.080 --> 00:29:29.679
+The concept of "Org Dynamic Blocks"
+
+00:29:29.680 --> 00:29:31.519
+is very powerful.
+
+00:29:31.520 --> 00:29:33.599
+I think of them as universal
+
+00:29:33.600 --> 00:29:35.179
+visible macros.
+
+00:29:35.180 --> 00:29:41.359
+But, why should they be primarily used in just Org-Mode?
+
+00:29:41.360 --> 00:29:43.639
+I say, let's generalize them
+
+00:29:43.640 --> 00:29:46.059
+to "Emacs Dynamic Blocks".
+
+00:29:46.060 --> 00:29:49.959
+Have defaults for org-dblock-start-re
+
+00:29:49.960 --> 00:29:52.159
+in every relevant mode
+
+00:29:52.160 --> 00:29:55.099
+and use them everywhere.
+
+00:29:55.100 --> 00:29:56.319
+Blee does that.
+
+00:29:56.320 --> 00:30:01.719
+In COMEEGA-LaTeX, Dynamic Blocks create Frame Controls
+
+00:30:01.720 --> 00:30:05.519
+and insert Image and Video contents.
+
+00:30:05.520 --> 00:30:07.519
+Much of Blee and BISOS
+
+00:30:07.520 --> 00:30:09.959
+are implemented in COMEEGA.
+
+00:30:09.960 --> 00:30:13.599
+Almost all of our Elisp, Python, Bash
+
+00:30:13.600 --> 00:30:17.199
+and LaTeX work uses COMEEGA.
+
+00:30:17.200 --> 00:30:19.299
+COMEEGA stands for Collaborative
+
+00:30:19.300 --> 00:30:21.679
+Org-Mode
+
+00:30:21.680 --> 00:30:24.759
+Enhanced Emacs Generalized Authorship.
+
+00:30:24.760 --> 00:30:27.879
+It is the inverse of org-babel.
+
+00:30:27.880 --> 00:30:29.999
+COMEEGA adds org-mode
+
+00:30:30.000 --> 00:30:33.099
+to your programming mode.
+
+00:30:33.100 --> 00:30:35.079
+Full and proper use of COMEEGA,
+
+00:30:35.080 --> 00:30:38.299
+requires Polymode.
+
+00:30:38.300 --> 00:30:41.359
+Let's call that Poly-COMEEGA.
+
+00:30:41.360 --> 00:30:43.319
+But Emacs's Polymode
+
+00:30:43.320 --> 00:30:45.679
+is work-in-progress,
+
+00:30:45.680 --> 00:30:49.199
+particularly now with the new tree-sitter.
+
+00:30:49.200 --> 00:30:53.199
+So, in the interim, my usage of COMEEGA
+
+00:30:53.200 --> 00:30:55.919
+has been in the form of Toggle-COMEEGA.
+
+00:30:55.920 --> 00:30:59.479
+Where I manually switch between
+
+00:30:59.480 --> 00:31:02.359
+the programming-mode and org-mode.
+
+00:31:02.360 --> 00:31:04.199
+For me this has proved to be
+
+00:31:04.200 --> 00:31:05.799
+a fine interim solution.
+
+NOTE Internationalization - a non-Americanist perspective
+
+00:31:05.800 --> 00:31:09.679
+Naturally, content processing
+
+00:31:09.680 --> 00:31:11.239
+should be multi-lingual
+
+00:31:11.240 --> 00:31:14.159
+and internationalized.
+
+00:31:14.160 --> 00:31:15.839
+Let's look at that dimension.
+
+00:31:15.840 --> 00:31:21.019
+I am Iranian and much of what I write is in Farsi.
+
+00:31:21.020 --> 00:31:23.519
+Getting Perso-Arabic text right
+
+00:31:23.520 --> 00:31:25.519
+is often a challenge,
+
+00:31:25.520 --> 00:31:30.059
+as it involves Bi-Directional text (BIDI)
+
+00:31:30.060 --> 00:31:32.999
+and shaping of characters.
+
+00:31:33.000 --> 00:31:36.039
+In the context of our content generation
+
+00:31:36.040 --> 00:31:39.819
+these need to span all relevant tools,
+
+00:31:39.820 --> 00:31:41.759
+not just emacs.
+
+00:31:41.760 --> 00:31:43.759
+For emacs, I have created
+
+00:31:43.760 --> 00:31:46.239
+my own input method
+
+00:31:46.240 --> 00:31:49.419
+called farsi-transliterate-banan.
+
+00:31:49.420 --> 00:31:54.139
+My EmacsConf 2021 talk was about that.
+
+00:31:54.140 --> 00:31:57.199
+Now let's look at some examples
+
+00:31:57.200 --> 00:32:01.699
+and spice it up a bit with semantics.
+
+00:32:01.700 --> 00:32:05.279
+As an example of proper BIDI text,
+
+00:32:05.280 --> 00:32:07.899
+here is the orignal Farsi text
+
+00:32:07.900 --> 00:32:10.359
+along with English translation
+
+00:32:10.360 --> 00:32:12.519
+of Imam Khomeini's text
+
+00:32:12.520 --> 00:32:15.479
+with respect to invalidity
+
+00:32:15.480 --> 00:32:20.399
+of Western Intellectual Proprty Rights regime.
+
+00:32:20.400 --> 00:32:23.039
+And as another example
+
+00:32:23.040 --> 00:32:24.479
+of proper BIDI text,
+
+00:32:24.480 --> 00:32:29.919
+here is Ayatollah Mothari's take on Western IPR
+
+00:32:29.920 --> 00:32:35.159
+not being private property. Note that these predate
+
+00:32:35.160 --> 00:32:36.919
+by more than half a century
+
+00:32:36.920 --> 00:32:43.239
+Jack Dorsey and Elon Musk's tweets of April 11, 2025
+
+00:32:43.240 --> 00:32:47.199
+saying "Delete all IP law".
+
+00:32:47.200 --> 00:32:49.159
+This topic is too important
+
+00:32:49.160 --> 00:32:50.399
+and too sensitive
+
+00:32:50.400 --> 00:32:53.639
+to be left to American billionaires
+
+00:32:53.640 --> 00:32:55.639
+and their tweets.
+
+00:32:55.640 --> 00:32:58.199
+Let me again refer you to the logic
+
+00:32:58.200 --> 00:33:00.599
+of polyexistentials in my book.
+
+00:33:00.600 --> 00:33:06.359
+Chapter 14 of the book is dedicated to
+
+00:33:06.360 --> 00:33:08.579
+Ethics and ownership in Religions.
+
+00:33:08.580 --> 00:33:10.919
+With respect to my preference
+
+00:33:10.920 --> 00:33:12.719
+for Ethics over Freedom,
+
+00:33:12.720 --> 00:33:16.519
+let me refer you to Section 12.4
+
+00:33:16.520 --> 00:33:19.079
+"A Cynical Perspective
+
+00:33:19.080 --> 00:33:22.859
+on Freedom Orientation of Americans"
+
+00:33:22.860 --> 00:33:25.999
+in which I describe where the FOSS labels
+
+00:33:26.000 --> 00:33:29.039
+and the likes of Stallman, Raymond,
+
+00:33:29.040 --> 00:33:31.599
+Moglen and Lessig have gone wrong.
+
+00:33:31.600 --> 00:33:34.239
+If you are one of their followers,
+
+00:33:34.240 --> 00:33:36.599
+perhaps Chapter 12 is for you.
+
+00:33:36.600 --> 00:33:42.279
+My emphasis thus far has been on content generation.
+
+NOTE Autonomous self-publication and federated re-publications
+
+00:33:42.280 --> 00:33:44.999
+Let's very briefly also look at
+
+00:33:45.000 --> 00:33:47.159
+Autonomous Self-Publication
+
+00:33:47.160 --> 00:33:52.279
+and Federated Re-Publications of our content.
+
+00:33:52.280 --> 00:33:55.759
+From the very beginning the Debian folks
+
+00:33:55.760 --> 00:33:59.039
+understood the importance of "Universality"
+
+00:33:59.040 --> 00:34:03.359
+and coined the "Universal Debian" label.
+
+00:34:03.360 --> 00:34:05.919
+This means that we can base
+
+00:34:05.920 --> 00:34:08.619
+our entire digital ecosystem
+
+00:34:08.620 --> 00:34:13.499
+on just the Libre-Halaal Debian distro.
+
+00:34:13.500 --> 00:34:17.299
+And that is what we have done with ByStar.
+
+00:34:17.300 --> 00:34:20.039
+In ByStar, everything is based on
+
+00:34:20.040 --> 00:34:24.119
+just the Universal Debian everywhere.
+
+00:34:24.120 --> 00:34:26.999
+This has made our Usage Environment
+
+00:34:27.000 --> 00:34:31.319
+totally harmonious with our Service Environment
+
+00:34:31.320 --> 00:34:38.059
+allowing for very powerful software-service continuums.
+
+00:34:38.060 --> 00:34:41.479
+Of course, all of this is immediately applicable
+
+00:34:41.480 --> 00:34:46.019
+to our ByStar Content Bundle as well.
+
+00:34:46.020 --> 00:34:50.519
+Some have asked, why don't you also include Ubuntu?
+
+00:34:50.520 --> 00:34:53.679
+I think the opposite makes more sense.
+
+00:34:53.680 --> 00:34:56.699
+Ubuntu should converge with Debian.
+
+00:34:56.700 --> 00:34:59.639
+I tried to explain this to Mark Shuttleworth
+
+00:34:59.640 --> 00:35:02.479
+in an email a while back.
+
+00:35:02.480 --> 00:35:04.119
+I have included that email
+
+00:35:04.120 --> 00:35:07.719
+in Section 12.1.5.
+
+NOTE Ingredients of BISOS platforms and their progression
+
+00:35:07.720 --> 00:35:10.439
+In this presentation, we have stopped
+
+00:35:10.440 --> 00:35:13.159
+at the "Raw-BISOS" stage.
+
+00:35:13.160 --> 00:35:15.759
+We can further evolve Raw-BISOS
+
+00:35:15.760 --> 00:35:17.959
+and make it be "Sited"
+
+00:35:17.960 --> 00:35:22.239
+and provide autonomous publication services.
+
+00:35:22.240 --> 00:35:25.679
+But here by going through EmacsConf and youtube
+
+00:35:25.680 --> 00:35:30.959
+we are using the "Federated Re-Publications" model.
+
+00:35:30.960 --> 00:35:32.479
+Something this large,
+
+00:35:32.480 --> 00:35:35.479
+should be well documented.
+
+00:35:35.480 --> 00:35:37.079
+In Emacs, the way that
+
+00:35:37.080 --> 00:35:39.319
+we have been dealing with documentation
+
+00:35:39.320 --> 00:35:43.439
+and information retrieval is archaic.
+
+00:35:43.440 --> 00:35:46.079
+Man-pages, TeXInfo, Helpful-Mode
+
+00:35:46.080 --> 00:35:51.599
+and convention based Doc-Strings are old and limited.
+
+00:35:51.600 --> 00:35:55.279
+In BISOS and Blee, we use Blee-Panels
+
+00:35:55.280 --> 00:35:57.739
+for all kinds of documentation.
+
+00:35:57.740 --> 00:36:02.559
+Let me show you some examples.
+
+NOTE Moving forward
+
+00:36:02.560 --> 00:36:05.199
+So, what next?
+
+00:36:05.200 --> 00:36:10.599
+If Blee, BISOS, ByStar, Libre-Halaal, Polyexistentials
+
+00:36:10.600 --> 00:36:14.159
+and these Content Processing capabilities
+
+00:36:14.160 --> 00:36:16.639
+have piqued your interest,
+
+00:36:16.640 --> 00:36:19.379
+please feel welcome to contact me.
+
+00:36:19.380 --> 00:36:22.239
+These Emacs Conferences have proven
+
+00:36:22.240 --> 00:36:25.379
+to be very useful and productive.
+
+00:36:25.380 --> 00:36:27.199
+I look forward to your thoughts,
+
+00:36:27.200 --> 00:36:29.599
+feedback and questions.
+
+00:36:29.600 --> 00:36:35.359
+I want to thank all the EmacsConf 2025 Organizers
+
+00:36:35.360 --> 00:36:37.199
+for their great work,
+
+00:36:37.200 --> 00:36:41.640
+and Sacha in particular.
diff --git a/2025/captions/emacsconf-2025-calc--basic-calc-functionality-for-engineering-or-electronics--christopher-howard--main--chapters.vtt b/2025/captions/emacsconf-2025-calc--basic-calc-functionality-for-engineering-or-electronics--christopher-howard--main--chapters.vtt
new file mode 100644
index 00000000..f3af8a6f
--- /dev/null
+++ b/2025/captions/emacsconf-2025-calc--basic-calc-functionality-for-engineering-or-electronics--christopher-howard--main--chapters.vtt
@@ -0,0 +1,41 @@
+WEBVTT
+
+
+00:00:03.620 --> 00:02:36.639
+Introduction
+
+00:02:36.640 --> 00:04:54.279
+What is Calc?
+
+00:04:54.280 --> 00:06:37.398
+calc-algebraic-entry
+
+00:06:37.399 --> 00:08:07.759
+calc-roll-down
+
+00:08:07.760 --> 00:08:58.179
+Advanced functions
+
+00:08:58.180 --> 00:09:54.719
+Solving equations with calc-solve-for
+
+00:09:54.720 --> 00:12:00.079
+Systems of equations
+
+00:12:00.080 --> 00:12:39.959
+calc-find-root
+
+00:12:39.960 --> 00:14:17.539
+Derivatives and integrals
+
+00:14:17.540 --> 00:18:12.159
+Programmable functions
+
+00:18:12.160 --> 00:20:08.799
+Plotting
+
+00:20:08.800 --> 00:22:38.599
+Wish list
+
+00:22:38.600 --> 00:23:35.920
+Wrapping up
diff --git a/2025/captions/emacsconf-2025-calc--basic-calc-functionality-for-engineering-or-electronics--christopher-howard--main.vtt b/2025/captions/emacsconf-2025-calc--basic-calc-functionality-for-engineering-or-electronics--christopher-howard--main.vtt
new file mode 100644
index 00000000..f0bf2d2a
--- /dev/null
+++ b/2025/captions/emacsconf-2025-calc--basic-calc-functionality-for-engineering-or-electronics--christopher-howard--main.vtt
@@ -0,0 +1,888 @@
+WEBVTT captioned by sachac
+
+NOTE Introduction
+
+00:00:03.620 --> 00:00:08.799
+Hello, my name is Christopher Howard and welcome to my talk.
+
+00:00:08.800 --> 00:00:11.319
+This is basically an introduction
+
+00:00:11.320 --> 00:00:15.119
+to the built-in Emacs calculator,
+
+00:00:15.120 --> 00:00:18.319
+properly known as Emacs Calc,
+
+00:00:18.320 --> 00:00:21.439
+particularly from the perspective of someone
+
+00:00:21.440 --> 00:00:27.559
+with a technical background such as engineering or electronics.
+
+00:00:27.560 --> 00:00:32.879
+I will say, though, my personal interest is not really
+
+00:00:32.880 --> 00:00:37.839
+in digital computing or digital calculators,
+
+00:00:37.840 --> 00:00:42.519
+but lately has been focused more on analog computing.
+
+00:00:42.520 --> 00:00:46.799
+I have, for example, been working to master
+
+00:00:46.800 --> 00:00:50.839
+the venerable slide rule, a mechanical computer
+
+00:00:50.840 --> 00:00:57.319
+that calculates multiplication powers and logarithms.
+
+00:00:57.320 --> 00:01:02.199
+Here's a picture of one.
+
+00:01:02.200 --> 00:01:06.799
+It's a physical tool that was used for hundreds of years
+
+00:01:06.800 --> 00:01:08.999
+for this sort of thing
+
+00:01:09.000 --> 00:01:16.679
+before the handheld calculator was made popular.
+
+00:01:16.680 --> 00:01:18.639
+And I also had a project that I did
+
+00:01:18.640 --> 00:01:21.119
+for a while to several months
+
+00:01:21.120 --> 00:01:33.119
+to build an electronic analog computer.
+
+00:01:33.120 --> 00:01:38.679
+A rudimentary attempt of mine, but it's functional,
+
+00:01:38.680 --> 00:01:43.399
+and it's basically a 1960s or 1970s style
+
+00:01:43.400 --> 00:01:48.839
+electronic analog computer built very much on a budget,
+
+00:01:48.840 --> 00:01:52.559
+but the box in the middle is the computer proper
+
+00:01:52.560 --> 00:01:55.719
+which has most of the components inside of it
+
+00:01:55.720 --> 00:02:00.199
+as well as the potentiometers for setting values,
+
+00:02:00.200 --> 00:02:02.039
+and an operation switch.
+
+00:02:02.040 --> 00:02:04.399
+There's a patch panel on the left
+
+00:02:04.400 --> 00:02:07.119
+for connecting the different integrators,
+
+00:02:07.120 --> 00:02:11.319
+amplifiers, multipliers, and so forth together.
+
+00:02:11.320 --> 00:02:16.919
+Then the output of the simulation is displayed
+
+00:02:16.920 --> 00:02:19.799
+on the oscilloscope on the right side,
+
+00:02:19.800 --> 00:02:25.479
+which is a digital oscilloscope.
+
+00:02:25.480 --> 00:02:28.439
+To be honest, I think that a talk about analog computing
+
+00:02:28.440 --> 00:02:30.199
+would be much more interesting
+
+00:02:30.200 --> 00:02:32.039
+than the talk that I'm about to give,
+
+00:02:32.040 --> 00:02:36.639
+but unfortunately that would be out of scope for EmacsConf.
+
+NOTE What is Calc?
+
+00:02:36.640 --> 00:02:39.919
+So instead I will talk about Emacs Calc,
+
+00:02:39.920 --> 00:02:43.359
+the digital calculator built into Emacs.
+
+00:02:43.360 --> 00:02:47.519
+Emacs Calc, while not being a replacement for software
+
+00:02:47.520 --> 00:02:51.479
+like GNU Octave, does have advanced calculator functionality
+
+00:02:51.480 --> 00:02:55.039
+that can be useful in engineering, electronics,
+
+00:02:55.040 --> 00:03:00.759
+or other technical applications. So I don't want to oversell it,
+
+00:03:00.760 --> 00:03:06.479
+but I think functionality-wise, Calc is somewhere in between
+
+00:03:06.480 --> 00:03:12.239
+what you'd expect of a decent scientific calculator
+
+00:03:12.240 --> 00:03:23.939
+and an advanced graphics calculator.
+
+00:03:23.940 --> 00:03:28.839
+So this talk I'll mention is not intended to be a tutorial
+
+00:03:28.840 --> 00:03:33.839
+but only a brief introduction to Calc.
+
+00:03:33.840 --> 00:03:37.439
+Please refer to the built-in Calc info manual
+
+00:03:37.440 --> 00:03:46.739
+for detailed instructions on how to complete operations.
+
+00:03:46.740 --> 00:04:01.479
+Turn off my volume here.
+
+00:04:01.480 --> 00:04:05.719
+The documentation for Emacs Calc is built-in,
+
+00:04:05.720 --> 00:04:10.439
+although on some distributions you may have to install
+
+00:04:10.440 --> 00:04:24.479
+the Emacs documentation separately for licensing reasons.
+
+00:04:24.480 --> 00:04:28.599
+Calc presents itself as a stack-based calculator
+
+00:04:28.600 --> 00:04:31.599
+where entries are dropped onto a stack
+
+00:04:31.600 --> 00:04:36.739
+and then an operation is performed on the stack entries.
+
+00:04:36.740 --> 00:04:42.899
+For example, I can drop 1.23 onto the stack,
+
+00:04:42.900 --> 00:04:54.279
+and then 8.56, and then multiply them together.
+
+NOTE calc-algebraic-entry
+
+00:04:54.280 --> 00:05:01.559
+It may present itself as a stack-based calculator,
+
+00:05:01.560 --> 00:05:05.399
+but indeed, Calc is also capable of accepting input
+
+00:05:05.400 --> 00:05:07.739
+in the more well-known algebraic format
+
+00:05:07.740 --> 00:05:10.759
+by using the calc-algebraic-entry command,
+
+00:05:10.760 --> 00:05:14.999
+which by default is bound to the apostrophe (') key.
+
+00:05:15.000 --> 00:05:19.759
+So you type the apostrophe key, enter the algebraic input,
+
+00:05:19.760 --> 00:05:22.759
+including parentheses as needed.
+
+00:05:22.760 --> 00:05:28.199
+For example, here's a calculation of the resonance frequency
+
+00:05:28.200 --> 00:05:35.039
+of a coil which has an inductance of 250 microhenries
+
+00:05:35.040 --> 00:05:41.059
+and 160 picofarads, taken from one of my electronics handbooks.
+
+00:05:41.060 --> 00:05:50.019
+The formula for that is 1 over 2 pi
+
+00:05:50.020 --> 00:05:57.439
+and then the square root of our inductance
+
+00:05:57.440 --> 00:06:06.279
+which is in this case 250 microfarads - excuse me, microhenries
+
+00:06:06.280 --> 00:06:19.399
+and then the capacitance is 160 picofarads.
+
+00:06:19.400 --> 00:06:24.399
+Small typo here.
+
+00:06:24.400 --> 00:06:26.639
+Now I need to evaluate that one more time,
+
+00:06:26.640 --> 00:06:30.919
+because pi is a symbol.
+
+00:06:30.920 --> 00:06:37.398
+I get about 800 kHz resonant frequency.
+
+NOTE calc-roll-down
+
+00:06:37.399 --> 00:06:41.679
+The command calc-roll-down,
+
+00:06:41.680 --> 00:06:44.199
+which by default is bound to the TAB key,
+
+00:06:44.200 --> 00:06:47.919
+will swap the top two stack entries,
+
+00:06:47.920 --> 00:06:51.559
+which is sometimes useful if you need to manipulate something
+
+00:06:51.560 --> 00:06:56.999
+that's further down the stack.
+
+00:06:57.000 --> 00:07:02.039
+So I can swap this around and say multiply by two
+
+00:07:02.040 --> 00:07:05.479
+and then put it back where it was.
+
+00:07:05.480 --> 00:07:14.039
+This command is also capable of rolling the entire stack.
+
+00:07:14.040 --> 00:07:18.899
+Say I want to shift them all around.
+
+00:07:18.900 --> 00:07:21.399
+This can be done by passing extra arguments
+
+00:07:21.400 --> 00:07:23.559
+to the calc-roll-down function.
+
+00:07:23.560 --> 00:07:28.279
+That's a little bit inconvenient to do manually,
+
+00:07:28.280 --> 00:07:40.079
+so in my init file, I defined here a key definition
+
+00:07:40.080 --> 00:07:45.759
+that passes in those arguments correctly.
+
+00:07:45.760 --> 00:07:49.179
+I attached this to shift-tab,
+
+00:07:49.180 --> 00:07:52.319
+so this way, I can roll the entire stack.
+
+00:07:52.320 --> 00:07:56.159
+Then I could change one entry here
+
+00:07:56.160 --> 00:08:03.459
+and then put it back where it was.
+
+00:08:03.460 --> 00:08:07.759
+So Calc does algebraic input.
+
+NOTE Advanced functions
+
+00:08:07.760 --> 00:08:10.159
+It also does advanced functions
+
+00:08:10.160 --> 00:08:15.599
+that you would expect any handheld scientific calculator,
+
+00:08:15.600 --> 00:08:19.159
+including trigonometric functions.
+
+00:08:19.160 --> 00:08:25.319
+For example, we can get the sine of a number.
+
+00:08:25.320 --> 00:08:30.719
+Now I'll mention here that Calc has multiple modes.
+
+00:08:30.720 --> 00:08:32.319
+Right now it's in degree mode.
+
+00:08:32.320 --> 00:08:38.159
+You can switch over to radian mode if you want.
+
+00:08:38.160 --> 00:08:42.799
+I'm going to put it back in degrees.
+
+00:08:42.800 --> 00:08:49.799
+Drop 12 degrees on the stack, and then get the sine of that.
+
+00:08:49.800 --> 00:08:58.179
+And then with the inverse sine function, I can put it back.
+
+NOTE Solving equations with calc-solve-for
+
+00:08:58.180 --> 00:09:07.519
+Calc also has the nifty ability to solve equations for you
+
+00:09:07.520 --> 00:09:13.919
+so long as the equation is not too complicated.
+
+00:09:13.920 --> 00:09:19.959
+This is using the calc-solve-for function.
+
+00:09:19.960 --> 00:09:31.699
+For example, we could enter in an equation algebraically,
+
+00:09:31.700 --> 00:09:36.679
+then run calc-solve-for, and we just have to tell it
+
+00:09:36.680 --> 00:09:40.999
+what variable we want to solve for. And there we go.
+
+00:09:41.000 --> 00:09:43.199
+We can do this manually as well
+
+00:09:43.200 --> 00:09:54.719
+just so you can see that we get the same result.
+
+NOTE Systems of equations
+
+00:09:54.720 --> 00:09:57.959
+Calc is also able to solve systems of equations.
+
+00:09:57.960 --> 00:10:03.439
+We can put more than one equation on the stack,
+
+00:10:03.440 --> 00:10:08.959
+and then solve for several variables.
+
+00:10:08.960 --> 00:10:13.319
+To give a technical example for this,
+
+00:10:13.320 --> 00:10:30.659
+I'll show you a resistor network scribble that I did recently.
+
+00:10:30.660 --> 00:10:32.819
+Hopefully you can see that. Basically,
+
+00:10:32.820 --> 00:10:38.719
+it's fairly simple, a pretty simple resistor network
+
+00:10:38.720 --> 00:10:42.159
+with 1 kilo ohm and 10 kilo ohm resistors,
+
+00:10:42.160 --> 00:10:48.959
+and using the loop methods, we are calculating the currents,
+
+00:10:48.960 --> 00:10:52.759
+the current in each loop, and then that current can be used
+
+00:10:52.760 --> 00:10:58.839
+to solve for the voltage of each individual resistor
+
+00:10:58.840 --> 00:11:06.199
+if we want to. So at the bottom there we have the equations
+
+00:11:06.200 --> 00:11:11.519
+that we come up with as we work through each loop.
+
+00:11:11.520 --> 00:11:19.579
+And I'm going to paste that into Calc.
+
+00:11:19.580 --> 00:11:22.719
+To save some time, I'm going to copy and paste that
+
+00:11:22.720 --> 00:11:34.259
+from my notes instead of typing it out.
+
+00:11:34.260 --> 00:11:38.259
+So we have two equations there on the stack
+
+00:11:38.260 --> 00:11:44.719
+in one stack entry. We run that calc-solve-for function again,
+
+00:11:44.720 --> 00:11:49.899
+and we tell it which variables we want to solve for.
+
+00:11:49.900 --> 00:11:51.959
+And voila! Those are our currents,
+
+00:11:51.960 --> 00:11:55.719
+which we can then use to get the voltages
+
+00:11:55.720 --> 00:12:00.079
+for the individual resistors.
+
+NOTE calc-find-root
+
+00:12:00.080 --> 00:12:01.999
+I'll just briefly mention
+
+00:12:02.000 --> 00:12:05.839
+that if Calc is not able to solve an equation
+
+00:12:05.840 --> 00:12:07.779
+with calc-solve-for,
+
+00:12:07.780 --> 00:12:10.279
+then you might be helped by another calc function
+
+00:12:10.280 --> 00:12:11.559
+called calc-find-root.
+
+00:12:11.560 --> 00:12:14.439
+This function basically does a manual search
+
+00:12:14.440 --> 00:12:30.199
+for a numerical solution to the equation.
+
+00:12:30.200 --> 00:12:39.959
+And there's the documentation page on that.
+
+NOTE Derivatives and integrals
+
+00:12:39.960 --> 00:12:44.039
+Calc can also solve or find derivatives of functions,
+
+00:12:44.040 --> 00:12:47.579
+at least the more straightforward functions.
+
+00:12:47.580 --> 00:12:49.839
+For a simple example,
+
+00:12:49.840 --> 00:13:00.559
+we can get the derivative of that
+
+00:13:00.560 --> 00:13:11.979
+with the derivative function.
+
+00:13:11.980 --> 00:13:17.159
+On the other hand, Calc is also capable of figuring out
+
+00:13:17.160 --> 00:13:22.099
+indefinite integrals.
+
+00:13:22.100 --> 00:13:26.859
+Say we put that function back on the stack,
+
+00:13:26.860 --> 00:13:32.559
+and this time, we call the integral function.
+
+00:13:32.560 --> 00:13:35.079
+There you go. Of course, you have to add
+
+00:13:35.080 --> 00:13:39.819
+your own constant of integration.
+
+00:13:39.820 --> 00:13:43.399
+For integrals that Calc cannot figure out symbolically,
+
+00:13:43.400 --> 00:13:46.079
+a numerical integration method is available
+
+00:13:46.080 --> 00:13:59.998
+through the calc-num-integral command, which is documented...
+
+00:13:59.999 --> 00:14:17.539
+The function documentation is available here, more or less.
+
+NOTE Programmable functions
+
+00:14:17.540 --> 00:14:20.399
+I definitely need to mention
+
+00:14:20.400 --> 00:14:24.759
+that Calc is capable of doing programmable functions.
+
+00:14:24.760 --> 00:14:29.619
+That is to say, you can program your own functions into Calc.
+
+00:14:29.620 --> 00:14:32.239
+There are three separate ways to do this.
+
+00:14:32.240 --> 00:14:36.279
+One is through a macro method
+
+00:14:36.280 --> 00:14:41.539
+similar to Emacs's usual keyboard macros.
+
+00:14:41.540 --> 00:14:46.519
+The second method is to transform an algebraic function
+
+00:14:46.520 --> 00:14:50.859
+into a stored function definition.
+
+00:14:50.860 --> 00:14:54.059
+And the third is to use Elisp directly.
+
+00:14:54.060 --> 00:14:56.599
+Personally, I find that the second method
+
+00:14:56.600 --> 00:15:01.799
+is the most practical, the most convenient and practical
+
+00:15:01.800 --> 00:15:08.059
+in my opinion. So I'll give a quick example of that.
+
+00:15:08.060 --> 00:15:14.159
+So I could... Let's say I wanted to have a function
+
+00:15:14.160 --> 00:15:20.699
+for calculating capacitive reactance.
+
+00:15:20.700 --> 00:15:28.899
+I'll define that in algebraic mode first.
+
+00:15:28.900 --> 00:15:33.639
+The function for that is 1 over 2 pi
+
+00:15:33.640 --> 00:15:41.599
+the frequency and the capacitance.
+
+00:15:41.600 --> 00:15:44.959
+Drop that on the stack. You see, it does automatically
+
+00:15:44.960 --> 00:15:52.079
+get simplified a little bit, but it's the same function.
+
+00:15:52.080 --> 00:15:58.839
+And then I press letters Z and F. Do that again.
+
+00:15:58.840 --> 00:16:06.239
+Z and F to start transforming that into a stored function.
+
+00:16:06.240 --> 00:16:11.039
+It asks me to select a user key, a single key press.
+
+00:16:11.040 --> 00:16:15.479
+I'll use the letter c.
+
+00:16:15.480 --> 00:16:19.079
+Then it's going to ask for a longer command name.
+
+00:16:19.080 --> 00:16:24.639
+I've actually defined this once before, so it prefilled in
+
+00:16:24.640 --> 00:16:38.339
+that command name.
+
+00:16:38.340 --> 00:16:42.999
+Then I need to enter which variables in the formula
+
+00:16:43.000 --> 00:16:46.559
+are actual arguments, rather than just symbols
+
+00:16:46.560 --> 00:16:52.559
+to be evaluated later. I prefer to put this in with frequency
+
+00:16:52.560 --> 00:16:54.279
+and the capacitance after that,
+
+00:16:54.280 --> 00:16:57.799
+but actually in this particular case,
+
+00:16:57.800 --> 00:17:07.339
+it doesn't matter at all to the mathematics.
+
+00:17:07.340 --> 00:17:11.399
+So, now all I have to do, that this is defined,
+
+00:17:11.400 --> 00:17:15.199
+is I can drop the frequency on the stack,
+
+00:17:15.200 --> 00:17:24.399
+which we'll say, for this example, will be 4.5 MHz,
+
+00:17:24.400 --> 00:17:32.279
+and then drop on the capacitance, which in this example
+
+00:17:32.280 --> 00:17:40.319
+will be 22 pF.
+
+00:17:40.320 --> 00:17:42.439
+Then I'll call the function that I just defined.
+
+00:17:42.440 --> 00:17:45.239
+I don't really like having to try to remember
+
+00:17:45.240 --> 00:17:48.679
+the short letters that I've come up with,
+
+00:17:48.680 --> 00:17:57.839
+so I'll just use the longer name.
+
+00:17:57.840 --> 00:17:59.799
+I need to evaluate one more time
+
+00:17:59.800 --> 00:18:05.619
+because the symbol pi is in there and not yet evaluated.
+
+00:18:05.620 --> 00:18:07.539
+And so if I've done that right,
+
+00:18:07.540 --> 00:18:12.159
+we have a capacitive reactance of about 1600 ohms.
+
+NOTE Plotting
+
+00:18:12.160 --> 00:18:16.839
+As the last feature that I'll mention here,
+
+00:18:16.840 --> 00:18:24.059
+Emacs Calc does have an interface with gnuplot,
+
+00:18:24.060 --> 00:18:30.799
+if you want to have Calc work as your graphing calculator.
+
+00:18:30.800 --> 00:18:33.159
+I do need to be honest and mention
+
+00:18:33.160 --> 00:18:35.579
+that I don't generally use it myself
+
+00:18:35.580 --> 00:18:39.719
+because there's another program in GNOME
+
+00:18:39.720 --> 00:18:43.499
+that I've found to be generally more convenient
+
+00:18:43.500 --> 00:18:47.399
+for the things that I want to graph quickly.
+
+00:18:47.400 --> 00:18:53.399
+But I think I can give you a simple example.
+
+00:18:53.400 --> 00:19:00.339
+So first, we need to drop a range on the stack.
+
+00:19:00.340 --> 00:19:06.619
+Let's say 0 to 10.
+
+00:19:06.620 --> 00:19:11.639
+And then we need to drop the function on the stack.
+
+00:19:11.640 --> 00:19:17.839
+And then I believe it's the letters g and f that graph this.
+
+00:19:17.840 --> 00:19:22.319
+Let's see. Yep, there we go.
+
+00:19:22.320 --> 00:19:25.059
+So there's our function and it looks nice.
+
+00:19:25.060 --> 00:19:26.659
+That was pretty easy.
+
+00:19:26.660 --> 00:19:29.019
+That's the fast way to do it.
+
+00:19:29.020 --> 00:19:32.839
+I will, as a disclaimer, mention that
+
+00:19:32.840 --> 00:19:34.159
+using this quick approach,
+
+00:19:34.160 --> 00:19:38.759
+that sometimes more complicated graphs
+
+00:19:38.760 --> 00:19:39.999
+will not turn out nicely,
+
+00:19:40.000 --> 00:19:44.339
+because by default, the resolution will be pretty low.
+
+00:19:44.340 --> 00:19:48.119
+That is to say it's... gnuplot is going to be
+
+00:19:48.120 --> 00:19:49.899
+skipping a lot of points
+
+00:19:49.900 --> 00:19:52.039
+and so you'll have to learn a bit more
+
+00:19:52.040 --> 00:19:55.319
+about how to use the interface,
+
+00:19:55.320 --> 00:19:59.519
+what parameters to pass if you want all your graphs
+
+00:19:59.520 --> 00:20:03.699
+to come out looking nice.
+
+00:20:03.700 --> 00:20:08.799
+So that covers all the features that I wanted to cover.
+
+NOTE Wish list
+
+00:20:08.800 --> 00:20:13.279
+I wanted to briefly mention a wish list of items
+
+00:20:13.280 --> 00:20:16.679
+that I'd like to see in Calc.
+
+00:20:16.680 --> 00:20:23.639
+One of them would be improper integrals.
+
+00:20:23.640 --> 00:20:25.159
+So that's like our definite integrals
+
+00:20:25.160 --> 00:20:32.859
+except for where a limit of integration is infinity.
+
+00:20:32.860 --> 00:20:38.559
+That's something that can be useful in a few applications.
+
+00:20:38.560 --> 00:20:41.079
+Something else that would be neat to have would be
+
+00:20:41.080 --> 00:20:45.679
+annotations for row entries. So for example
+
+00:20:45.680 --> 00:20:48.819
+if I was putting together a sum of numbers
+
+00:20:48.820 --> 00:20:53.279
+for, say, my monthly budget,
+
+00:20:53.280 --> 00:20:57.479
+let's say I was paying $2,000 for my rent
+
+00:20:57.480 --> 00:21:03.831
+and let's say $800 a month for my groceries,
+
+00:21:03.832 --> 00:21:07.931
+(a lot of kids to feed there)
+
+00:21:07.932 --> 00:21:14.565
+and then say another $60 for dining out, and so on,
+
+00:21:14.566 --> 00:21:18.259
+it would be nice if there was some way
+
+00:21:18.260 --> 00:21:21.319
+to put a little annotation next to each number
+
+00:21:21.320 --> 00:21:23.399
+so that you could remember
+
+00:21:23.400 --> 00:21:27.039
+what the meaning of that number was more easily.
+
+00:21:27.040 --> 00:21:31.199
+I actually looked into programming this into Calc myself,
+
+00:21:31.200 --> 00:21:35.919
+but discovered that it would require reprogramming
+
+00:21:35.920 --> 00:21:41.839
+quite a bit of Calc to make that work well
+
+00:21:41.840 --> 00:21:43.479
+across all calc functionality,
+
+00:21:43.480 --> 00:21:46.939
+and so, eventually, I gave up.
+
+00:21:46.940 --> 00:21:51.139
+But I'd still really like to have that feature.
+
+00:21:51.140 --> 00:21:52.039
+The final thing, though
+
+00:21:52.040 --> 00:21:54.579
+I think this would not necessarily belong in Calc,
+
+00:21:54.580 --> 00:21:57.919
+I think it would be cool if Emacs had some way
+
+00:21:57.920 --> 00:22:00.599
+to run numerical solutions
+
+00:22:00.600 --> 00:22:02.599
+for systems of differential equations,
+
+00:22:02.600 --> 00:22:06.019
+also known as a differential analyzer.
+
+00:22:06.020 --> 00:22:09.279
+So this would allow you to be able to set up simulation models
+
+00:22:09.280 --> 00:22:11.679
+involving systems of differential equations,
+
+00:22:11.680 --> 00:22:14.879
+for example, a spring mass system, or pressure temperature,
+
+00:22:14.880 --> 00:22:18.039
+or what have you, and then run the simulation
+
+00:22:18.040 --> 00:22:22.119
+using numerical approximation.
+
+00:22:22.120 --> 00:22:24.079
+Maybe it would be silly
+
+00:22:24.080 --> 00:22:25.999
+to actually put that in Calc itself,
+
+00:22:26.000 --> 00:22:30.339
+but a nice interface maybe to some other software,
+
+00:22:30.340 --> 00:22:33.299
+simple software that did that,
+
+00:22:33.300 --> 00:22:35.779
+an easy to use interface for that
+
+00:22:35.780 --> 00:22:38.599
+would be really great.
+
+NOTE Wrapping up
+
+00:22:38.600 --> 00:22:41.800
+So that's my entire talk.
+
+00:22:41.801 --> 00:22:44.534
+I'll just mention some information.
+
+00:22:44.535 --> 00:22:48.365
+If you want to learn more about me
+
+00:22:48.366 --> 00:22:50.119
+or things that I'm interested in,
+
+00:22:50.120 --> 00:22:57.779
+I do not any longer have a web presence.
+
+00:22:57.780 --> 00:22:59.659
+I don't have a website anymore,
+
+00:22:59.660 --> 00:23:03.359
+but I do have a Gemini capsule
+
+00:23:03.360 --> 00:23:07.139
+that I post to all the time.
+
+00:23:07.140 --> 00:23:13.879
+And if you can install, if you're willing to install the...
+
+00:23:13.880 --> 00:23:19.079
+Gemini browser known as Elpher
+
+00:23:19.080 --> 00:23:23.698
+into Emacs, which is available from ELPA,
+
+00:23:23.699 --> 00:23:27.359
+then you can browse directly to it
+
+00:23:27.360 --> 00:23:31.439
+and look around my Gemini capsule.
+
+00:23:31.440 --> 00:23:35.920
+Thank you very much.
diff --git a/2025/captions/emacsconf-2025-gnus--reading-and-writing-emails-in-gnu-emacs-with-gnus--amin-bandali--main--chapters.vtt b/2025/captions/emacsconf-2025-gnus--reading-and-writing-emails-in-gnu-emacs-with-gnus--amin-bandali--main--chapters.vtt
new file mode 100644
index 00000000..fc516878
--- /dev/null
+++ b/2025/captions/emacsconf-2025-gnus--reading-and-writing-emails-in-gnu-emacs-with-gnus--amin-bandali--main--chapters.vtt
@@ -0,0 +1,50 @@
+WEBVTT
+
+
+00:00:02.620 --> 00:01:25.239
+Introduction
+
+00:01:25.240 --> 00:02:49.959
+Demo
+
+00:02:49.960 --> 00:03:58.559
+Don't panic
+
+00:03:58.560 --> 00:05:46.239
+Configuring servers
+
+00:05:46.240 --> 00:06:26.599
+.authinfo
+
+00:06:26.600 --> 00:08:25.719
+Configuration
+
+00:08:25.720 --> 00:09:40.079
+Starting Gnus
+
+00:09:40.080 --> 00:10:19.899
+Always showing groups
+
+00:10:19.900 --> 00:11:30.119
+Reading messages
+
+00:11:30.120 --> 00:12:55.159
+Debugging IMAP
+
+00:12:55.160 --> 00:14:25.559
+Topics
+
+00:14:25.560 --> 00:15:24.319
+Customizing message display
+
+00:15:24.320 --> 00:17:26.659
+Sending emails
+
+00:17:26.660 --> 00:19:27.959
+Plans
+
+00:19:27.960 --> 00:20:12.759
+Wrapping up
+
+00:20:12.760 --> 00:21:37.760
+nnimap
diff --git a/2025/captions/emacsconf-2025-gnus--reading-and-writing-emails-in-gnu-emacs-with-gnus--amin-bandali--main.vtt b/2025/captions/emacsconf-2025-gnus--reading-and-writing-emails-in-gnu-emacs-with-gnus--amin-bandali--main.vtt
new file mode 100644
index 00000000..c4e86336
--- /dev/null
+++ b/2025/captions/emacsconf-2025-gnus--reading-and-writing-emails-in-gnu-emacs-with-gnus--amin-bandali--main.vtt
@@ -0,0 +1,1332 @@
+WEBVTT captioned by sachac
+
+NOTE Introduction
+
+00:00:02.620 --> 00:00:04.799
+Hello, my name is Amin Bandali,
+
+00:00:04.800 --> 00:00:06.359
+and today I'd like to talk about
+
+00:00:06.360 --> 00:00:08.799
+reading and writing emails in GNU Emacs
+
+00:00:08.800 --> 00:00:14.319
+using Gnus specifically.
+
+00:00:14.320 --> 00:00:16.879
+Gnus has had this sort of reputation
+
+00:00:16.880 --> 00:00:20.599
+of being difficult to approach and configure.
+
+00:00:20.600 --> 00:00:23.359
+That's understandable
+
+00:00:23.360 --> 00:00:26.319
+because it has many, many options
+
+00:00:26.320 --> 00:00:27.679
+and major and minor modes
+
+00:00:27.680 --> 00:00:30.679
+that interact in different ways with each other.
+
+00:00:30.680 --> 00:00:35.319
+And it also doesn't help that Gnus started originally
+
+00:00:35.320 --> 00:00:36.359
+as a newsreader
+
+00:00:36.360 --> 00:00:38.759
+rather than a mail client.
+
+00:00:38.760 --> 00:00:40.879
+So a lot of the terminology that it uses
+
+00:00:40.880 --> 00:00:42.519
+is also rooted in that,
+
+00:00:42.520 --> 00:00:45.559
+in reading and writing news.
+
+00:00:45.560 --> 00:00:48.119
+But nevertheless, with this video and talk,
+
+00:00:48.120 --> 00:00:52.159
+I hope to provide a sort
+
+00:00:52.160 --> 00:00:55.759
+of very quick introduction
+
+00:00:55.760 --> 00:00:57.539
+of starting to use Gnus
+
+00:00:57.540 --> 00:01:00.919
+to read and write email and send it.
+
+00:01:00.920 --> 00:01:02.679
+We will use Gnus' IMAP support,
+
+00:01:02.680 --> 00:01:06.119
+mainly because a lot of people
+
+00:01:06.120 --> 00:01:08.679
+these days have email accounts
+
+00:01:08.680 --> 00:01:10.759
+with mail service providers
+
+00:01:10.760 --> 00:01:12.039
+that support IMAP,
+
+00:01:12.040 --> 00:01:14.319
+which is an open standard.
+
+00:01:14.320 --> 00:01:17.479
+So it's widely available and supported
+
+00:01:17.480 --> 00:01:19.719
+across many different providers
+
+00:01:19.720 --> 00:01:25.239
+as well as mail clients or mail user agents as well.
+
+NOTE Demo
+
+00:01:25.240 --> 00:01:30.559
+Okay, so let's just jump straight right in.
+
+00:01:30.560 --> 00:01:34.279
+I will enter this demo directory that I created
+
+00:01:34.280 --> 00:01:36.919
+for the purposes of this demonstration
+
+00:01:36.920 --> 00:01:40.999
+and change my home directory to this one
+
+00:01:41.000 --> 00:01:49.839
+so that we can safely experiment with Gnus here.
+
+00:01:49.840 --> 00:01:53.979
+For this presentation, I've written up
+
+00:01:53.980 --> 00:01:56.839
+a quick initialization file or init file
+
+00:01:56.840 --> 00:01:59.719
+that I will share afterwards as well
+
+00:01:59.720 --> 00:02:01.639
+to get us going with Gnus.
+
+00:02:01.640 --> 00:02:04.519
+There's not much to it at the moment.
+
+00:02:04.520 --> 00:02:07.399
+Just set up the package archives and
+
+00:02:07.400 --> 00:02:09.479
+install the keycast package
+
+00:02:09.480 --> 00:02:14.079
+for showing the key presses in the mode line.
+
+00:02:14.080 --> 00:02:15.359
+Yeah, that's about it.
+
+00:02:15.360 --> 00:02:16.239
+And I'll also define
+
+00:02:16.240 --> 00:02:20.279
+a little like inline function +emacs.d
+
+00:02:20.280 --> 00:02:24.079
+that allows me to conveniently write
+
+00:02:24.080 --> 00:02:26.639
+and have it expanded
+
+00:02:26.640 --> 00:02:29.300
+or refer to files and directories, rather,
+
+00:02:29.301 --> 00:02:30.900
+paths that we could expand,
+
+00:02:30.901 --> 00:02:32.833
+inside my Emacs configuration directory.
+
+00:02:32.834 --> 00:02:37.500
+I also have this eval-last-sexp
+
+00:02:37.501 --> 00:02:41.119
+bound to a global key,
+
+00:02:41.120 --> 00:02:43.279
+so that I will be able to easily
+
+00:02:43.280 --> 00:02:47.519
+use it for this talk.
+
+00:02:47.520 --> 00:02:49.959
+Okay, let's jump right in.
+
+NOTE Don't panic
+
+00:02:49.960 --> 00:02:52.239
+First things first, don't panic.
+
+00:02:52.240 --> 00:02:55.267
+And that's actually also the name
+
+00:02:55.268 --> 00:02:58.359
+of the very first node
+
+00:02:58.360 --> 00:03:01.559
+in the Gnus manual when you open it.
+
+00:03:01.560 --> 00:03:02.839
+And it's actually nice.
+
+00:03:02.840 --> 00:03:04.479
+I definitely, definitely recommend
+
+00:03:04.480 --> 00:03:07.079
+that you look through
+
+00:03:07.080 --> 00:03:10.199
+at least the very first couple of chapters of this,
+
+00:03:10.200 --> 00:03:14.199
+skim through it, and later on refer to it
+
+00:03:14.200 --> 00:03:16.133
+whenever you find something confusing
+
+00:03:16.134 --> 00:03:19.499
+or don't understand it.
+
+00:03:19.500 --> 00:03:21.359
+But yeah, we'll start
+
+00:03:21.360 --> 00:03:22.399
+with these two paragraphs here.
+
+00:03:22.400 --> 00:03:23.639
+So again, a Gnus installation
+
+00:03:23.640 --> 00:03:28.119
+is basically just a list of one or more servers
+
+00:03:28.120 --> 00:03:30.119
+and the subscribed groups from those servers
+
+00:03:30.120 --> 00:03:32.319
+and articles in those groups.
+
+00:03:32.320 --> 00:03:34.279
+You can already kind of see
+
+00:03:34.280 --> 00:03:39.479
+where that influence of a newsreader comes in.
+
+00:03:39.480 --> 00:03:41.839
+But yeah, basically what it's saying is that,
+
+00:03:41.840 --> 00:03:43.839
+you know, we have one or more servers.
+
+00:03:43.840 --> 00:03:47.079
+We can think of them as email servers.
+
+00:03:47.080 --> 00:03:49.359
+Groups can be like, we can think
+
+00:03:49.360 --> 00:03:52.959
+of them as folders or directories.
+
+00:03:52.960 --> 00:03:55.239
+And yeah, articles,
+
+00:03:55.240 --> 00:03:58.559
+those would be like our email messages.
+
+NOTE Configuring servers
+
+00:03:58.560 --> 00:03:59.679
+With Gnus, we can add
+
+00:03:59.680 --> 00:04:06.119
+and configure servers mainly using two variables.
+
+00:04:06.120 --> 00:04:07.919
+One of them is the gnus-select-method
+
+00:04:07.920 --> 00:04:11.479
+and the other is gnus-secondary-select-methods.
+
+00:04:11.480 --> 00:04:15.759
+The first one predates the second one
+
+00:04:15.760 --> 00:04:17.559
+and I generally don't recommend using it, because
+
+00:04:17.560 --> 00:04:22.559
+first of all, it can only point
+
+00:04:22.560 --> 00:04:26.359
+to one server, and that server,
+
+00:04:26.360 --> 00:04:27.879
+because it's the primary,
+
+00:04:27.880 --> 00:04:32.559
+then Gnus won't add a prefix to its groups,
+
+00:04:32.560 --> 00:04:34.839
+so later on, as you get into
+
+00:04:34.840 --> 00:04:36.679
+more advanced features of Gnus
+
+00:04:36.680 --> 00:04:38.519
+and, for example, want to write rules
+
+00:04:38.520 --> 00:04:42.959
+to modify your message composition
+
+00:04:42.960 --> 00:04:47.039
+in a way for certain groups, or file mail,
+
+00:04:47.040 --> 00:04:48.799
+automatically classify mail,
+
+00:04:48.800 --> 00:04:51.879
+this distinction can become
+
+00:04:51.880 --> 00:04:53.959
+confusing and annoying.
+
+00:04:53.960 --> 00:04:57.199
+My recommendation is to always and only use
+
+00:04:57.200 --> 00:05:01.799
+the gnus-secondary-select-methods.
+
+00:05:01.800 --> 00:05:07.319
+Yeah, so let's do that here.
+
+00:05:07.320 --> 00:05:10.299
+I'm gonna uncomment this portion.
+
+00:05:10.300 --> 00:05:16.419
+So here, I set the primary select method to nil,
+
+00:05:16.420 --> 00:05:24.159
+and the second one, I define an nnimap server
+
+00:05:24.160 --> 00:05:30.039
+of the nnimap backend.
+
+00:05:30.040 --> 00:05:32.439
+I give it the name ec25gnus.
+
+00:05:32.440 --> 00:05:35.879
+What I want it to do is to
+
+00:05:35.880 --> 00:05:37.799
+connect to my mail server,
+
+00:05:37.800 --> 00:05:41.079
+which is at this address,
+
+00:05:41.080 --> 00:05:46.239
+and fetch emails from it over TLS with this username.
+
+NOTE .authinfo
+
+00:05:46.240 --> 00:05:50.719
+And then the passwords or the credentials,
+
+00:05:50.720 --> 00:05:56.839
+you can put them in the .authinfo file.
+
+00:05:56.840 --> 00:05:58.799
+Normally, you would want to, for example,
+
+00:05:58.800 --> 00:06:03.719
+encrypt this file with your GPG key.
+
+00:06:03.720 --> 00:06:06.719
+But for this demonstration, I haven't.
+
+00:06:06.720 --> 00:06:10.479
+So yeah, the format is the keyword "machine"
+
+00:06:10.480 --> 00:06:15.239
+followed by the name of your Gnus server or account,
+
+00:06:15.240 --> 00:06:17.199
+followed by the word "login",
+
+00:06:17.200 --> 00:06:19.199
+then your login username,
+
+00:06:19.200 --> 00:06:23.959
+and then the password, which here it's not shown.
+
+00:06:23.960 --> 00:06:26.599
+Yeah.
+
+NOTE Configuration
+
+00:06:26.600 --> 00:06:28.679
+But before we actually set this,
+
+00:06:28.680 --> 00:06:31.479
+I'll just show you that if we like start Gnus
+
+00:06:31.480 --> 00:06:33.719
+with M-x gnus,
+
+00:06:33.720 --> 00:06:36.439
+initially, it will just show
+
+00:06:36.440 --> 00:06:37.759
+an error like this.
+
+00:06:37.760 --> 00:06:40.399
+Even if we continue, it's empty.
+
+00:06:40.400 --> 00:06:43.399
+There's not much because Gnus doesn't know
+
+00:06:43.400 --> 00:06:47.039
+where to fetch these emails from.
+
+00:06:47.040 --> 00:06:52.159
+And that's what we will configure.
+
+00:06:52.160 --> 00:06:55.859
+Excuse me.
+
+00:06:55.860 --> 00:06:57.559
+Yeah, so just for convenience,
+
+00:06:57.560 --> 00:06:59.079
+we can bind Gnus to,
+
+00:06:59.080 --> 00:07:00.679
+for example, C-c g, as I've done here.
+
+00:07:00.680 --> 00:07:04.119
+You will want to set your name
+
+00:07:04.120 --> 00:07:05.799
+and email address, like so.
+
+00:07:05.800 --> 00:07:09.239
+Here we tell Emacs
+
+00:07:09.240 --> 00:07:11.439
+that we are going to be using Gnus for reading email,
+
+00:07:11.440 --> 00:07:12.839
+because Emacs comes
+
+00:07:12.840 --> 00:07:14.759
+with other email clients as well,
+
+00:07:14.760 --> 00:07:18.559
+such as Rmail, and in fact, defaults to Rmail,
+
+00:07:18.560 --> 00:07:24.839
+so this way, we tell it to use Gnus.
+
+00:07:24.840 --> 00:07:31.559
+By default, Gnus puts its newsrc file and other files,
+
+00:07:31.560 --> 00:07:34.319
+I believe it still scatters them
+
+00:07:34.320 --> 00:07:35.439
+in a few different directories
+
+00:07:35.440 --> 00:07:36.279
+in your home directory,
+
+00:07:36.280 --> 00:07:37.399
+so it's a little bit messy.
+
+00:07:37.400 --> 00:07:40.039
+So what I prefer to do is to just put it
+
+00:07:40.040 --> 00:07:42.439
+all under the Gnus directory
+
+00:07:42.440 --> 00:07:47.439
+inside of my Emacs configuration, as I do here.
+
+00:07:47.440 --> 00:07:50.639
+Yeah, and then here we just tell Gnus
+
+00:07:50.640 --> 00:07:53.319
+to, like, don't try to bother
+
+00:07:53.320 --> 00:07:55.759
+with a generic newsrc file
+
+00:07:55.760 --> 00:07:57.119
+that would be shared
+
+00:07:57.120 --> 00:07:58.399
+with other news readers.
+
+00:07:58.400 --> 00:07:59.679
+Just want to use it for email.
+
+00:07:59.680 --> 00:08:01.959
+And yeah, so we just tell Gnus
+
+00:08:01.960 --> 00:08:03.039
+to keep all of its data
+
+00:08:03.040 --> 00:08:08.079
+inside a dedicated .newsrc.eld
+
+00:08:08.080 --> 00:08:12.159
+(for Emacs Lisp data) file instead.
+
+00:08:12.160 --> 00:08:15.199
+And we can also have Gnus not prompt us
+
+00:08:15.200 --> 00:08:19.679
+when we want to exit with q.
+
+00:08:19.680 --> 00:08:23.399
+Anyway, so let's go ahead and evaluate this.
+
+00:08:23.400 --> 00:08:25.719
+So this has been set,
+
+NOTE Starting Gnus
+
+00:08:25.720 --> 00:08:32.267
+so if we type M-x gnus again, or hit C-c g,
+
+00:08:32.268 --> 00:08:35.699
+now we're faced with an empty buffer,
+
+00:08:35.700 --> 00:08:37.399
+and it says no news is good news,
+
+00:08:37.400 --> 00:08:38.399
+and that's actually
+
+00:08:38.400 --> 00:08:40.719
+one of the characteristics of Gnus
+
+00:08:40.720 --> 00:08:44.779
+is that by default it tries
+
+00:08:44.780 --> 00:08:47.619
+to like sort of declutter
+
+00:08:47.620 --> 00:08:49.199
+and show us a little less possible
+
+00:08:49.200 --> 00:08:50.819
+in the group buffer,
+
+00:08:50.820 --> 00:08:53.259
+meaning that if you don't have
+
+00:08:53.260 --> 00:08:55.639
+any groups with unread or marked
+
+00:08:55.640 --> 00:09:00.119
+or, like, starred messages, it will not show them.
+
+00:09:00.120 --> 00:09:03.959
+To actually see all of our groups or folders,
+
+00:09:03.960 --> 00:09:08.359
+we hit shift L or capital L,
+
+00:09:08.360 --> 00:09:12.419
+and we see that we have an inbox here,
+
+00:09:12.420 --> 00:09:14.879
+as expected. So we enter the inbox,
+
+00:09:14.880 --> 00:09:17.459
+and we see that there is an article there
+
+00:09:17.460 --> 00:09:20.779
+and it's already been marked as read.
+
+00:09:20.780 --> 00:09:22.679
+But if we mark it as unread
+
+00:09:22.680 --> 00:09:25.959
+and exit and enter Gnus again,
+
+00:09:25.960 --> 00:09:27.279
+this is what we would see.
+
+00:09:27.280 --> 00:09:28.839
+We would see that our group
+
+00:09:28.840 --> 00:09:34.099
+and then we enter it, we see our mail here.
+
+00:09:34.100 --> 00:09:36.159
+Yeah, and this is our very first email
+
+00:09:36.160 --> 00:09:40.079
+that we read in GNU Emacs here, inside Gnus.
+
+NOTE Always showing groups
+
+00:09:40.080 --> 00:09:43.839
+It might be useful to have Gnus always show
+
+00:09:43.840 --> 00:09:46.839
+certain groups or folders
+
+00:09:46.840 --> 00:09:48.319
+even if they don't have
+
+00:09:48.320 --> 00:09:52.339
+anything unread or marked inside of them.
+
+00:09:52.340 --> 00:09:56.039
+The way we can do that is
+
+00:09:56.040 --> 00:09:57.599
+by setting this variable
+
+00:09:57.600 --> 00:10:01.339
+gnus-permanently-visible-groups
+
+00:10:01.340 --> 00:10:03.039
+to a regular expression
+
+00:10:03.040 --> 00:10:09.119
+that describes the name of these groups.
+
+00:10:09.120 --> 00:10:11.539
+So if we launch Gnus again,
+
+00:10:11.540 --> 00:10:14.759
+this time, we see that that group is visible,
+
+00:10:14.760 --> 00:10:19.899
+even though there's no unread messages in it.
+
+NOTE Reading messages
+
+00:10:19.900 --> 00:10:24.399
+When we enter a group or folder,
+
+00:10:24.400 --> 00:10:26.719
+we will see a list of all of our messages.
+
+00:10:26.720 --> 00:10:27.799
+Here, we only have one.
+
+00:10:27.800 --> 00:10:31.939
+We can press M-u or Alt-u
+
+00:10:31.940 --> 00:10:34.679
+to mark something as unread.
+
+00:10:34.680 --> 00:10:38.539
+You can press d to mark it as read.
+
+00:10:38.540 --> 00:10:40.079
+If you press just u,
+
+00:10:40.080 --> 00:10:41.959
+it'll tick the article,
+
+00:10:41.960 --> 00:10:44.039
+which is kind of the equivalent
+
+00:10:44.040 --> 00:10:46.999
+of marking the message or email
+
+00:10:47.000 --> 00:10:50.539
+as starred in other email clients
+
+00:10:50.540 --> 00:10:55.719
+such as Thunderbird.
+
+00:10:55.720 --> 00:11:00.639
+We see that when there are groups
+
+00:11:00.640 --> 00:11:03.959
+that have starred or ticked messages
+
+00:11:03.960 --> 00:11:04.679
+inside of them,
+
+00:11:04.680 --> 00:11:05.599
+Gnus will mark them
+
+00:11:05.600 --> 00:11:16.019
+with this little star here, or asterisk.
+
+00:11:16.020 --> 00:11:17.639
+This talk is just barely
+
+00:11:17.640 --> 00:11:19.039
+scratching the surface.
+
+00:11:19.040 --> 00:11:21.080
+Let's see how far...
+
+00:11:21.081 --> 00:11:22.759
+How am I doing with the time?
+
+00:11:22.760 --> 00:11:30.119
+Okay, 11 minutes already.
+
+NOTE Debugging IMAP
+
+00:11:30.120 --> 00:11:32.079
+Just a couple of helpful things here,
+
+00:11:32.080 --> 00:11:36.919
+like this nnimap-record-commands variable.
+
+00:11:36.920 --> 00:11:38.519
+It's useful when you want to debug
+
+00:11:38.520 --> 00:11:40.119
+your IMAP setup with Gnus.
+
+00:11:40.120 --> 00:11:42.859
+If you set it to anything non-nil,
+
+00:11:42.860 --> 00:11:46.699
+it will log the commands that it runs
+
+00:11:46.700 --> 00:11:49.539
+to a special `*imap log*` buffer.
+
+00:11:49.540 --> 00:11:50.719
+And here I just set it
+
+00:11:50.720 --> 00:11:52.679
+to this init-file-debug variable,
+
+00:11:52.680 --> 00:11:55.159
+which is set to non-nil
+
+00:11:55.160 --> 00:11:56.439
+whenever you launch Emacs
+
+00:11:56.440 --> 00:11:59.279
+with the --debug-init switch,
+
+00:11:59.280 --> 00:12:02.239
+so that's pretty helpful.
+
+00:12:02.240 --> 00:12:05.119
+You want to also set your sent folder,
+
+00:12:05.120 --> 00:12:07.479
+basically, where Gnus will save
+
+00:12:07.480 --> 00:12:09.439
+a copy of the message that you just sent.
+
+00:12:09.440 --> 00:12:12.799
+Normally, I think the convention these days is,
+
+00:12:12.800 --> 00:12:16.599
+a lot of you know servers and clients
+
+00:12:16.600 --> 00:12:18.799
+use a dedicated sent folder,
+
+00:12:18.800 --> 00:12:24.339
+but with Gnus, I just prefer to use INBOX itself.
+
+00:12:24.340 --> 00:12:27.119
+Mainly because then I will have
+
+00:12:27.120 --> 00:12:28.759
+threading working for free,
+
+00:12:28.760 --> 00:12:31.939
+so I can read the entire thread
+
+00:12:31.940 --> 00:12:34.299
+of an email chain there in one place.
+
+00:12:34.300 --> 00:12:35.319
+Of course, we don't have to keep
+
+00:12:35.320 --> 00:12:38.899
+the messages in there forever.
+
+00:12:38.900 --> 00:12:42.079
+And in fact, Gnus has facilities,
+
+00:12:42.080 --> 00:12:43.479
+both manual and automated,
+
+00:12:43.480 --> 00:12:45.999
+for expiring emails into
+
+00:12:46.000 --> 00:12:52.679
+different locations or different folders.
+
+00:12:52.680 --> 00:12:55.159
+Yeah. So let's move on here.
+
+NOTE Topics
+
+00:12:55.160 --> 00:13:02.039
+Topics are another nice feature of Gnus.
+
+00:13:02.040 --> 00:13:03.279
+So this is useful
+
+00:13:03.280 --> 00:13:05.359
+for creating some topics
+
+00:13:05.360 --> 00:13:08.459
+and then classifying or grouping
+
+00:13:08.460 --> 00:13:10.599
+your directories there.
+
+00:13:10.600 --> 00:13:11.799
+So we will see the use
+
+00:13:11.800 --> 00:13:13.639
+of this in a moment,
+
+00:13:13.640 --> 00:13:17.019
+where, let's say, I want to add
+
+00:13:17.020 --> 00:13:19.999
+a second account to Gnus.
+
+00:13:20.000 --> 00:13:23.559
+This one I'm going to call ec25work.
+
+00:13:23.560 --> 00:13:24.679
+Let's pretend that
+
+00:13:24.680 --> 00:13:29.859
+this is my work email.
+
+00:13:29.860 --> 00:13:32.479
+So if we open Gnus now,
+
+00:13:32.480 --> 00:13:36.999
+we see that our work INBOX
+
+00:13:37.000 --> 00:13:37.959
+also shows up here.
+
+00:13:37.960 --> 00:13:41.299
+And because we enabled topic mode,
+
+00:13:41.300 --> 00:13:42.359
+we see that we have
+
+00:13:42.360 --> 00:13:43.439
+these sort of buttons
+
+00:13:43.440 --> 00:13:44.839
+like Gnus and misc here.
+
+00:13:44.840 --> 00:13:46.679
+And we can, I believe,
+
+00:13:46.680 --> 00:13:49.799
+create a topic with capital T n.
+
+00:13:49.800 --> 00:13:52.879
+We can call it personal, this one.
+
+00:13:52.880 --> 00:13:56.939
+Let's create another one, work.
+
+00:13:56.940 --> 00:13:59.579
+And then what we can do is go
+
+00:13:59.580 --> 00:14:02.799
+over the directory that we want,
+
+00:14:02.800 --> 00:14:04.759
+for example, this one,
+
+00:14:04.760 --> 00:14:08.219
+hit capital T m to move it
+
+00:14:08.220 --> 00:14:11.899
+to the personal topic,
+
+00:14:11.900 --> 00:14:13.079
+and this work one,
+
+00:14:13.080 --> 00:14:15.199
+move it to the work topic.
+
+00:14:15.200 --> 00:14:17.439
+So we can nicely classify
+
+00:14:17.440 --> 00:14:23.119
+and group our groups folders here,
+
+00:14:23.120 --> 00:14:24.719
+which is especially useful
+
+00:14:24.720 --> 00:14:25.559
+when you have hundreds of them.
+
+NOTE Customizing message display
+
+00:14:25.560 --> 00:14:29.759
+Anyhow, we can customize
+
+00:14:29.760 --> 00:14:35.039
+different aspects of message display.
+
+00:14:35.040 --> 00:14:35.839
+Like for example,
+
+00:14:35.840 --> 00:14:38.199
+we can this way customize
+
+00:14:38.200 --> 00:14:39.199
+and change the order of
+
+00:14:39.200 --> 00:14:41.599
+which headers we want to see and where.
+
+00:14:41.600 --> 00:14:45.199
+So if I launch Gnus
+
+00:14:45.200 --> 00:14:48.459
+and go back to this email here,
+
+00:14:48.460 --> 00:14:52.139
+these are the headers that we see at the top.
+
+00:14:52.140 --> 00:14:52.639
+Excuse me.
+
+00:14:52.640 --> 00:14:55.159
+And with Gnus we can always
+
+00:14:55.160 --> 00:14:57.799
+We can have it show all the headers
+
+00:14:57.800 --> 00:15:01.999
+by pressing t to toggle the headers.
+
+00:15:02.000 --> 00:15:04.579
+Here we can see all the nitty-gritty
+
+00:15:04.580 --> 00:15:06.359
+and all of the headers in the message
+
+00:15:06.360 --> 00:15:12.219
+and we can toggle it back with t again.
+
+00:15:12.220 --> 00:15:16.479
+We can modify and customize the sorting
+
+00:15:16.480 --> 00:15:20.019
+with dedicated sorting functions.
+
+00:15:20.020 --> 00:15:20.999
+It comes with a number of them
+
+00:15:21.000 --> 00:15:21.599
+out of the box
+
+00:15:21.600 --> 00:15:24.319
+but we can define them as well.
+
+NOTE Sending emails
+
+00:15:24.320 --> 00:15:29.759
+Now to send emails. Let's see.
+
+00:15:29.760 --> 00:15:30.999
+We will be using message,
+
+00:15:31.000 --> 00:15:34.939
+and that's what Gnus itself uses.
+
+00:15:34.940 --> 00:15:38.579
+So I will set things up here.
+
+00:15:38.580 --> 00:15:42.639
+Let's see.
+
+00:15:42.640 --> 00:15:44.519
+Okay, so first of all,
+
+00:15:44.520 --> 00:15:46.439
+we want to have Gnus mark
+
+00:15:46.440 --> 00:15:48.519
+the messages that we write to others
+
+00:15:48.520 --> 00:15:49.759
+as read automatically,
+
+00:15:49.760 --> 00:15:51.359
+so this option does that.
+
+00:15:51.360 --> 00:15:58.039
+And then we define posting styles this way
+
+00:15:58.040 --> 00:16:01.619
+using the prefix, the name
+
+00:16:01.620 --> 00:16:04.359
+of the IMAP server.
+
+00:16:04.360 --> 00:16:06.519
+And this is how we can tell it to use
+
+00:16:06.520 --> 00:16:09.199
+what email address for the From [header]
+
+00:16:09.200 --> 00:16:14.599
+and which SMTP server to send it with.
+
+00:16:14.600 --> 00:16:17.879
+Yeah, and then gcc is where Gnus will save
+
+00:16:17.880 --> 00:16:20.199
+the copy of the messages that we write.
+
+00:16:20.200 --> 00:16:24.139
+So if we go ahead and launch Gnus again.
+
+00:16:24.140 --> 00:16:26.279
+We can go into our personal email here,
+
+00:16:26.280 --> 00:16:28.919
+hit m to compose a new message.
+
+00:16:28.920 --> 00:16:33.559
+We can prepare an email to,
+
+00:16:33.560 --> 00:16:35.119
+let's say, our work address.
+
+00:16:35.120 --> 00:16:42.419
+Hello from EmacsConf 2025 Gnus talk.
+
+00:16:42.420 --> 00:16:47.639
+Hello, this is just a test. :)
+
+00:16:47.640 --> 00:16:55.739
+Yeah, and we hit send.
+
+00:16:55.740 --> 00:16:56.919
+The sending will be done
+
+00:16:56.920 --> 00:17:03.479
+using Emacs's built-in SMTP libraries.
+
+00:17:03.480 --> 00:17:05.119
+Sometimes it can take a moment.
+
+00:17:05.120 --> 00:17:07.599
+Okay, that's it. It's done.
+
+00:17:07.600 --> 00:17:09.259
+So if we go back out
+
+00:17:09.260 --> 00:17:11.559
+and if we hit g to get new news,
+
+00:17:11.560 --> 00:17:15.679
+we should be able to see our new email there
+
+00:17:15.680 --> 00:17:17.639
+in the other account that we just sent it to.
+
+00:17:17.640 --> 00:17:22.360
+So we can come here, open it,
+
+00:17:22.361 --> 00:17:26.659
+and there we go.
+
+NOTE Plans
+
+00:17:26.660 --> 00:17:29.239
+There is a lot to configure in Gnus,
+
+00:17:29.240 --> 00:17:31.439
+and we're just barely scratching the surface,
+
+00:17:31.440 --> 00:17:34.079
+and unfortunately I don't have the time
+
+00:17:34.080 --> 00:17:34.999
+to explain all of these
+
+00:17:35.000 --> 00:17:36.519
+but I do plan on doing
+
+00:17:36.520 --> 00:17:38.839
+a much longer running series,
+
+00:17:38.840 --> 00:17:41.499
+whether it's text or videos,
+
+00:17:41.500 --> 00:17:42.879
+showing how to configure
+
+00:17:42.880 --> 00:17:45.319
+and use a lot of these different aspects of Gnus.
+
+00:17:45.320 --> 00:17:49.519
+But yeah, here, near the end, just a couple of...
+
+00:17:49.520 --> 00:17:54.919
+quick things. I find it's nice to have message
+
+00:17:54.920 --> 00:17:56.519
+prompt us for [confirmation]
+
+00:17:56.520 --> 00:17:59.199
+that we do want to send a message.
+
+00:17:59.200 --> 00:18:01.359
+Actually, when it does that, I take
+
+00:18:01.360 --> 00:18:02.599
+another look over my email
+
+00:18:02.600 --> 00:18:07.059
+to make sure I don't have any typos.
+
+00:18:07.060 --> 00:18:09.519
+It's generally a good idea to wrap your messages
+
+00:18:09.520 --> 00:18:14.119
+around 70 or 72 characters.
+
+00:18:14.120 --> 00:18:16.619
+We do that here.
+
+00:18:16.620 --> 00:18:19.159
+We can tell Gnus to forward messages
+
+00:18:19.160 --> 00:18:22.599
+as a proper MIME part,
+
+00:18:22.600 --> 00:18:27.059
+instead of some half-broken way.
+
+00:18:27.060 --> 00:18:30.119
+This customization, the sendmail function,
+
+00:18:30.120 --> 00:18:34.239
+is how we tell Gnus with message
+
+00:18:34.240 --> 00:18:38.239
+to use the SMTP library to sending the email,
+
+00:18:38.240 --> 00:18:42.479
+and these two variables are useful for
+
+00:18:42.480 --> 00:18:45.959
+omitting our own email address
+
+00:18:45.960 --> 00:18:47.439
+when we want to send someone,
+
+00:18:47.440 --> 00:18:50.179
+like when we hit r, to reply to someone.
+
+00:18:50.180 --> 00:18:51.959
+if we configure these variables,
+
+00:18:51.960 --> 00:18:52.959
+then Gnus won't add
+
+00:18:52.960 --> 00:18:56.059
+our own address to the To or Cc,
+
+00:18:56.060 --> 00:18:58.479
+which is pretty useful.
+
+00:18:58.480 --> 00:18:59.919
+I also find it helpful
+
+00:18:59.920 --> 00:19:03.359
+to unbind C-c C-s.
+
+00:19:03.360 --> 00:19:04.974
+That's another key
+
+00:19:04.975 --> 00:19:06.319
+for sending the message [in addition to C-c C-c].
+
+00:19:06.320 --> 00:19:09.719
+And because C-c C-d,
+
+00:19:09.720 --> 00:19:13.359
+which is very close to it on the QWERTY layout,
+
+00:19:13.360 --> 00:19:15.719
+is useful for saving a draft
+
+00:19:15.720 --> 00:19:16.839
+and then coming back to it,
+
+00:19:16.840 --> 00:19:20.079
+I don't want to accidentally hit C-c C-s,
+
+00:19:20.080 --> 00:19:22.039
+and send the message prematurely.
+
+00:19:22.040 --> 00:19:25.979
+So I unbind it.
+
+00:19:25.980 --> 00:19:27.959
+Yeah, anyway, that's about it.
+
+NOTE Wrapping up
+
+00:19:27.960 --> 00:19:31.039
+That's a kind of very quick tour
+
+00:19:31.040 --> 00:19:37.119
+and introduction of setting up Gnus.
+
+00:19:37.120 --> 00:19:40.719
+Here, we just configured a remote IMAP server,
+
+00:19:40.720 --> 00:19:43.519
+but we can also, of course,
+
+00:19:43.520 --> 00:19:46.359
+set up a local IMAP server such as Dovecot
+
+00:19:46.360 --> 00:19:48.399
+and point Gnus to there,
+
+00:19:48.400 --> 00:19:52.799
+and use programs like OfflineIMAP, I believe,
+
+00:19:52.800 --> 00:19:57.479
+or the mbsync program from isync package
+
+00:19:57.480 --> 00:20:02.939
+or isync project to synchronize our messages
+
+00:20:02.940 --> 00:20:04.479
+to local mail directories
+
+00:20:04.480 --> 00:20:06.279
+and then point Gnus to it.
+
+00:20:06.280 --> 00:20:08.359
+The reason we might want to use that
+
+00:20:08.360 --> 00:20:11.719
+is to always have a copy of our messages at hand
+
+00:20:11.720 --> 00:20:12.759
+so we can use offline.
+
+NOTE nnimap
+
+00:20:12.760 --> 00:20:17.439
+And why use nnimap specifically?
+
+00:20:17.440 --> 00:20:27.399
+As of now, the Maildir backend included with Gnus
+
+00:20:27.400 --> 00:20:29.679
+is very inefficient,
+
+00:20:29.680 --> 00:20:31.399
+especially when dealing with
+
+00:20:31.400 --> 00:20:33.839
+tens or hundreds of thousands of messages
+
+00:20:33.840 --> 00:20:36.659
+like some of us are.
+
+00:20:36.660 --> 00:20:38.759
+It just takes an eternity to try
+
+00:20:38.760 --> 00:20:43.259
+and index them and get going.
+
+00:20:43.260 --> 00:20:44.639
+In that case, what I recommend doing
+
+00:20:44.640 --> 00:20:47.799
+is instead of interfacing directly with Maildir,
+
+00:20:47.800 --> 00:20:52.359
+for Gnus, just install and run
+
+00:20:52.360 --> 00:20:54.359
+Dovecot, a local IMAP server,
+
+00:20:54.360 --> 00:20:59.819
+and point Gnus to that.
+
+00:20:59.820 --> 00:21:02.959
+I plan on writing tutorials or doing videos
+
+00:21:02.960 --> 00:21:06.639
+about these other aspects
+
+00:21:06.640 --> 00:21:10.519
+of configuring Gnus after the conference.
+
+00:21:10.520 --> 00:21:11.439
+That's about it for me,
+
+00:21:11.440 --> 00:21:14.119
+so I hope you find this helpful.
+
+00:21:14.120 --> 00:21:16.679
+If you have any questions,
+
+00:21:16.680 --> 00:21:18.239
+please feel free to email me
+
+00:21:18.240 --> 00:21:23.759
+at bandali@gnu.org or @kelar.org.
+
+00:21:23.760 --> 00:21:25.879
+You can take a look at my personal website
+
+00:21:25.880 --> 00:21:26.839
+where I plan on posting
+
+00:21:26.840 --> 00:21:31.059
+other Emacs and Gnus materials.
+
+00:21:31.060 --> 00:21:33.039
+And yeah, thank you for watching
+
+00:21:33.040 --> 00:21:35.159
+and I hope you enjoy the rest of the conference.
+
+00:21:35.160 --> 00:21:37.760
+Take care.
diff --git a/2025/captions/emacsconf-2025-llm--emacs-editors-and-llm-driven-workflows--andrew-hyatt--main.vtt b/2025/captions/emacsconf-2025-llm--emacs-editors-and-llm-driven-workflows--andrew-hyatt--main.vtt
new file mode 100644
index 00000000..ea969e1e
--- /dev/null
+++ b/2025/captions/emacsconf-2025-llm--emacs-editors-and-llm-driven-workflows--andrew-hyatt--main.vtt
@@ -0,0 +1,1069 @@
+WEBVTT captioned by amitav
+
+NOTE Introduction
+
+00:00:01.040 --> 00:00:03.079
+Hi, I'm Andrew Hyatt.
+
+00:00:03.080 --> 00:00:09.399
+I'm going to talk to you today about Emacs and AI,
+
+00:00:09.400 --> 00:00:10.879
+and where things are right now
+
+00:00:10.880 --> 00:00:12.119
+in the world of Emacs and AI,
+
+00:00:12.120 --> 00:00:14.159
+via large language models,
+
+00:00:14.160 --> 00:00:16.999
+and where things might be going,
+
+00:00:17.000 --> 00:00:22.699
+and what it means for the future of Emacs.
+
+00:00:22.700 --> 00:00:27.279
+I think what we're seeing with Emacs is interesting.
+
+00:00:27.280 --> 00:00:29.399
+We've seen a lot of different things
+
+00:00:29.400 --> 00:00:31.559
+come around in the past year,
+
+00:00:31.560 --> 00:00:33.119
+in the past several years.
+
+00:00:33.120 --> 00:00:35.079
+There's lots of different solutions.
+
+00:00:35.080 --> 00:00:36.759
+But in the past year, things have been very interesting.
+
+00:00:36.760 --> 00:00:39.679
+I think there's new and interesting questions
+
+00:00:39.680 --> 00:00:43.279
+about what does it mean to use Emacs?
+
+00:00:43.280 --> 00:00:45.479
+What does it mean to use any editor?
+
+00:00:45.480 --> 00:00:47.279
+I'm going to be talking about Emacs,
+
+00:00:47.280 --> 00:00:50.359
+and I'm going to show you various Emacs packages
+
+00:00:50.360 --> 00:00:53.079
+as demonstrations of these ideas.
+
+00:00:53.080 --> 00:00:59.839
+But there's the general question of
+
+00:00:59.840 --> 00:01:03.719
+what does it mean to use any editor, not just Emacs?
+
+00:01:03.720 --> 00:01:06.239
+What does it mean to do work?
+
+00:01:06.240 --> 00:01:10.719
+And I think the industry in general is facing these challenges
+
+00:01:10.720 --> 00:01:13.279
+of we don't really know where things are going to end up,
+
+00:01:13.280 --> 00:01:16.919
+but we do know the direction they're going.
+
+00:01:16.920 --> 00:01:20.039
+Emacs is a reflection of that.
+
+00:01:20.040 --> 00:01:23.239
+I think the answer for Emacs might be
+
+00:01:23.240 --> 00:01:25.719
+a little bit different than everything else,
+
+00:01:25.720 --> 00:01:28.599
+but I do want to show you what's out there
+
+00:01:28.600 --> 00:01:33.319
+so we can explore what are the possibilities
+
+00:01:33.320 --> 00:01:41.119
+of Emacs, AI, and generally how we get things done.
+
+00:01:41.120 --> 00:01:44.719
+Thanks. Let's dive right into it.
+
+NOTE Copilot
+
+00:01:44.720 --> 00:01:48.079
+We're going to start by showing you
+
+00:01:48.080 --> 00:01:51.039
+some things that are pretty well integrated,
+
+00:01:51.040 --> 00:01:55.279
+that look a lot like what you see in Emacs
+
+00:01:55.280 --> 00:01:58.679
+and fit in with the kinds of editing
+
+00:01:58.680 --> 00:02:02.639
+that you normally do in Emacs.
+
+00:02:02.640 --> 00:02:06.579
+So this is just kind of like, it's well integrated.
+
+00:02:06.580 --> 00:02:08.779
+So we're going to talk about Copilot and Semext.
+
+00:02:08.780 --> 00:02:12.679
+Copilot is by Microsoft via GitHub,
+
+00:02:12.680 --> 00:02:14.759
+and Semext is just my personal demo,
+
+00:02:14.760 --> 00:02:18.039
+but they're both showing you, you know,
+
+00:02:18.040 --> 00:02:24.399
+this kind of thing. Let's start with Copilot.
+
+00:02:24.400 --> 00:02:31.919
+Let's try out Copilot on just a standard bit of Elisp.
+
+00:02:31.920 --> 00:02:38.439
+We're going to write a Fibonacci function.
+
+00:02:38.440 --> 00:02:43.079
+Let's try out Emacs on a standard bit of Elisp.
+
+00:02:43.080 --> 00:02:49.279
+We're going to write a Fibonacci function.
+
+00:02:49.280 --> 00:02:53.159
+And you can see like as soon as we even start typing it,
+
+00:02:53.160 --> 00:02:56.339
+we get everything as a completion.
+
+00:02:56.340 --> 00:02:59.879
+So you can just press Tab here,
+
+00:02:59.880 --> 00:03:02.159
+and you've just completed
+
+00:03:02.160 --> 00:03:06.799
+a significant bunch of Emacs Lisp code.
+
+00:03:06.800 --> 00:03:09.919
+It will do this no matter where you are.
+
+00:03:09.920 --> 00:03:14.799
+So, pretty useful. It will just keep suggesting things.
+
+00:03:14.800 --> 00:03:16.439
+Do you want to do this?
+
+00:03:16.440 --> 00:03:17.479
+I'm not sure.
+
+00:03:17.480 --> 00:03:22.839
+But it usually is offering pretty reasonable things.
+
+00:03:22.840 --> 00:03:29.299
+So you could do this with code,
+
+00:03:29.300 --> 00:03:32.119
+of course, any code.
+
+00:03:32.120 --> 00:03:33.919
+You don't really even have to have a mode for it, right?
+
+00:03:33.920 --> 00:03:36.679
+That's kind of the beauty of AI is that
+
+00:03:36.680 --> 00:03:38.519
+you don't need any Emacs functionality for this,
+
+00:03:38.520 --> 00:03:39.519
+except for Copilot.
+
+00:03:39.520 --> 00:03:41.679
+It doesn't need to know the structure of your code.
+
+00:03:41.680 --> 00:03:45.279
+It doesn't need anything except for the text itself
+
+00:03:45.280 --> 00:03:51.239
+and whatever AI integration that this is.
+
+00:03:51.240 --> 00:03:53.739
+We can look at, you can do the same thing with Org-mode.
+
+00:03:53.740 --> 00:03:57.999
+So we could say create, no,
+
+00:03:58.000 --> 00:04:02.919
+how about let's, let's do, you know, spring cleaning.
+
+00:04:02.920 --> 00:04:10.839
+It's actually the fall, but still we'll say spring cleaning.
+
+00:04:10.840 --> 00:04:12.767
+And it'll start suggesting things that, you know,
+
+00:04:12.768 --> 00:04:15.439
+maybe at first, it doesn't really know what to do to
+
+00:04:15.440 --> 00:04:16.433
+clean up all code.
+
+00:04:16.434 --> 00:04:18.400
+It thinks I need to clean up code, but no,
+
+00:04:18.401 --> 00:04:21.839
+this is going to be actual, you know,
+
+00:04:21.840 --> 00:04:31.567
+clean hood over range. Clean out pantry.
+
+00:04:31.568 --> 00:04:33.879
+These are all really reasonable suggestions.
+
+00:04:33.880 --> 00:04:38.319
+You just keep going here.
+
+NOTE Semext
+
+00:04:38.320 --> 00:04:40.559
+I'm going to demonstrate Semext,
+
+00:04:40.560 --> 00:04:43.879
+which is a package I have on GNU Elpa,
+
+00:04:43.880 --> 00:04:48.719
+that is designed to integrate AI in a very Emacs-like way.
+
+00:04:48.720 --> 00:04:50.999
+And so what you could do is you could do a
+
+00:04:51.000 --> 00:04:54.799
+semext-search-forward.
+
+00:04:54.800 --> 00:04:58.719
+The UI looks just like other Emacs commands,
+
+00:04:58.720 --> 00:05:02.379
+but you can search for anything.
+
+00:05:02.380 --> 00:05:06.279
+There's really no way to express what I'm about to,
+
+00:05:06.280 --> 00:05:08.679
+what I'm trying to demonstrate
+
+00:05:08.680 --> 00:05:12.359
+in Emacs's normal search commands.
+
+00:05:12.360 --> 00:05:15.399
+You could really ask for anything.
+
+00:05:15.400 --> 00:05:18.759
+And it takes a little while, which is not Emacs-like,
+
+00:05:18.760 --> 00:05:20.033
+but everything else is sort of like
+
+00:05:20.034 --> 00:05:21.719
+it's designed to be like Emacs,
+
+00:05:21.720 --> 00:05:23.519
+except way more powerful.
+
+00:05:23.520 --> 00:05:27.119
+You don't need any mode to be active for this.
+
+00:05:27.120 --> 00:05:32.039
+You just need the library
+
+00:05:32.040 --> 00:05:34.759
+and an AI provider of some sort, either locally
+
+00:05:34.760 --> 00:05:41.199
+or, you know, your favorite cloud provider.
+
+NOTE Integrated AI experiences: gptel, ellama, chatgpt-shell, etc.
+
+00:05:41.200 --> 00:05:43.679
+Now we're going to move on to a different way
+
+00:05:43.680 --> 00:05:46.399
+of interacting with AI and Emacs.
+
+00:05:46.400 --> 00:05:52.319
+This way is less like the normal editing experience.
+
+00:05:52.320 --> 00:05:56.999
+So you lose some familiarity. However, in exchange,
+
+00:05:57.000 --> 00:05:58.079
+it is a lot more powerful.
+
+00:05:58.080 --> 00:06:00.119
+And there's a whole suite of these tools.
+
+00:06:00.120 --> 00:06:02.479
+I'm going to demonstrate gptel,
+
+00:06:02.480 --> 00:06:05.779
+which is the most popular one.
+
+00:06:05.780 --> 00:06:06.399
+But there are many.
+
+00:06:06.400 --> 00:06:08.479
+And I think different people have
+
+00:06:08.480 --> 00:06:11.759
+their own preferences of what they like to use.
+
+00:06:11.760 --> 00:06:12.999
+We're going to try now something
+
+00:06:13.000 --> 00:06:15.079
+that is a step away from just editing.
+
+00:06:15.080 --> 00:06:19.839
+And we're going to, I'm actually using gptel.
+
+00:06:19.840 --> 00:06:22.799
+There are several packages that are going to be
+
+00:06:22.800 --> 00:06:25.959
+doing the same sort of thing as I'm going to show you.
+
+00:06:25.960 --> 00:06:29.999
+gptel has sort of become the most popular one.
+
+00:06:30.000 --> 00:06:32.199
+So that's why I'm showing that to you.
+
+00:06:32.200 --> 00:06:39.319
+But let's just highlight everything and say gptel rewrite.
+
+00:06:39.320 --> 00:06:42.399
+And gptel basically just has a few things.
+
+00:06:42.400 --> 00:06:45.119
+There's different ways of thinking about this.
+
+00:06:45.120 --> 00:06:49.999
+With just a few very configurable menus,
+
+00:06:50.000 --> 00:06:53.959
+you can do a large variety of things.
+
+00:06:53.960 --> 00:06:59.819
+So let's give rewrite instructions.
+
+00:06:59.820 --> 00:07:06.600
+"Turn this into an iterative program
+
+00:07:06.601 --> 00:07:12.199
+instead of a recursive program."
+
+00:07:12.200 --> 00:07:17.799
+In Elisp, you really should not be using recursion.
+
+00:07:17.800 --> 00:07:20.359
+So we could say "return to be ready".
+
+00:07:20.360 --> 00:07:21.119
+Do we accept it?
+
+00:07:21.120 --> 00:07:24.519
+Yes, we accept it. Or we could iterate and say, no, no,
+
+00:07:24.520 --> 00:07:26.799
+that's not what we meant. We meant something else.
+
+00:07:26.800 --> 00:07:29.159
+Or you did something a little something wrong.
+
+00:07:29.160 --> 00:07:29.879
+Please fix it.
+
+00:07:29.880 --> 00:07:31.879
+So this is all very powerful.
+
+00:07:31.880 --> 00:07:33.799
+Is this editing?
+
+00:07:33.800 --> 00:07:40.279
+Well, it's in the editor.
+
+00:07:40.280 --> 00:07:42.759
+You could do this while editing, while deleting,
+
+00:07:42.760 --> 00:07:44.959
+you could be doing some sort of traditional editing.
+
+00:07:44.960 --> 00:07:47.679
+And then this, which is editing
+
+00:07:47.680 --> 00:07:48.919
+in the sense that it's in your editor,
+
+00:07:48.920 --> 00:07:51.039
+you might have to highlight
+
+00:07:51.040 --> 00:07:52.799
+some parts of the file and do things,
+
+00:07:52.800 --> 00:07:54.719
+but generally you don't even need to,
+
+00:07:54.720 --> 00:07:59.879
+or you go to a spot and you say, put code at this spot.
+
+00:07:59.880 --> 00:08:01.959
+It's kind of like editing.
+
+00:08:01.960 --> 00:08:05.839
+I would say it's not exactly editing,
+
+00:08:05.840 --> 00:08:10.159
+but it's at least something that must happen in an editor
+
+00:08:10.160 --> 00:08:12.359
+and it's well integrated into Emacs.
+
+00:08:12.360 --> 00:08:14.759
+As you can tell, it used very sort of
+
+00:08:14.760 --> 00:08:18.239
+modern standard Emacs UI paradigms
+
+00:08:18.240 --> 00:08:20.759
+and it's all written in Elisp.
+
+00:08:20.760 --> 00:08:23.779
+Everything is happening in Elisp here.
+
+00:08:23.780 --> 00:08:25.959
+So this is just very much an Emacs experience.
+
+00:08:25.960 --> 00:08:27.679
+It's just not exactly editing
+
+00:08:27.680 --> 00:08:29.879
+because the thing doing the editing
+
+00:08:29.880 --> 00:08:32.519
+is the AI and not you.
+
+00:08:32.520 --> 00:08:36.039
+You're just kind of telling it what to do.
+
+NOTE Outside the editor
+
+00:08:36.040 --> 00:08:41.119
+Now we're going to go and look at a way of interaction
+
+00:08:41.120 --> 00:08:43.239
+that's even more powerful
+
+00:08:43.240 --> 00:08:46.279
+and even more disconnected from the normal editing experience.
+
+00:08:46.280 --> 00:08:47.919
+In fact, it's so disconnected
+
+00:08:47.920 --> 00:08:52.399
+that most people are using this without an editor.
+
+00:08:52.400 --> 00:08:57.879
+These are things like Claude Code
+
+00:08:57.880 --> 00:09:01.079
+or the sort of open source equivalent, Aider.
+
+00:09:01.080 --> 00:09:05.039
+There's a few other things that follow this pattern as well.
+
+00:09:05.040 --> 00:09:07.479
+But it's very interesting in the sense
+
+00:09:07.480 --> 00:09:09.839
+that while you can integrate these with the editors,
+
+00:09:09.840 --> 00:09:12.039
+and I'm going to show you an Emacs integration,
+
+00:09:12.040 --> 00:09:13.519
+you don't need to.
+
+00:09:13.520 --> 00:09:16.939
+And that's not the way most people are using them.
+
+00:09:16.940 --> 00:09:19.759
+And I find it very interesting that sort of
+
+00:09:19.760 --> 00:09:23.719
+we're going back kind of full circle where, you know,
+
+00:09:23.720 --> 00:09:31.959
+in the 1960s or 70s, we were using Ed from the terminal
+
+00:09:31.960 --> 00:09:35.639
+to edit files, but then we created editors,
+
+00:09:35.640 --> 00:09:37.959
+and that was a really good idea.
+
+00:09:37.960 --> 00:09:40.167
+It is a lot easier to edit files
+
+00:09:40.168 --> 00:09:42.499
+when you have an actual UI.
+
+00:09:42.500 --> 00:09:46.879
+But now it's 2025, and we're back in the terminal,
+
+00:09:46.880 --> 00:09:50.799
+and we're editing files through the terminal,
+
+00:09:50.800 --> 00:09:53.599
+and you know what, it's great,
+
+00:09:53.600 --> 00:09:56.899
+but I think it's even better with Emacs.
+
+00:09:56.900 --> 00:10:00.279
+On the other hand, it comes with some trade-offs,
+
+00:10:00.280 --> 00:10:04.733
+as you can see, as we will see.
+
+NOTE Outside Experiences: claude-code.el, aidermacs, eca
+
+00:10:04.734 --> 00:10:07.467
+Okay, we're going to look at
+
+00:10:07.468 --> 00:10:20.320
+[audio glitch] Claude Code IDE, aidermacs, ECA.
+
+00:10:20.321 --> 00:10:22.639
+Last time, I didn't show you all the variants.
+
+00:10:22.640 --> 00:10:26.839
+I do want to show you eca, which points to,
+
+00:10:26.840 --> 00:10:29.799
+it is a very similar tool in what it does,
+
+00:10:29.800 --> 00:10:32.739
+but does have a different
+
+00:10:32.740 --> 00:10:37.239
+and I think better type of Emacs integration.
+
+00:10:37.240 --> 00:10:42.599
+All right, we're going to demonstrate Claude Code IDE,
+
+00:10:42.600 --> 00:10:46.839
+which is one of three Claude Code packages.
+
+00:10:46.840 --> 00:10:47.719
+It's a bit confusing.
+
+00:10:47.720 --> 00:10:52.039
+One of them will be demoed by another presenter
+
+00:10:52.040 --> 00:10:54.639
+at the Emacs conference, so stay tuned for that.
+
+00:10:54.640 --> 00:10:56.439
+Here I'm just going to give you a little taste
+
+00:10:56.440 --> 00:10:58.759
+of what these packages look like.
+
+00:10:58.760 --> 00:11:03.339
+So if we say Claude Code IDE,
+
+00:11:03.340 --> 00:11:06.839
+it presents us with basically
+
+00:11:06.840 --> 00:11:09.039
+almost exactly what you would get
+
+00:11:09.040 --> 00:11:11.519
+when you're running this in the terminal.
+
+00:11:11.520 --> 00:11:13.933
+And essentially there's a terminal interface.
+
+00:11:13.934 --> 00:11:16.659
+You can see that there's a vterm.
+
+00:11:16.660 --> 00:11:20.699
+But here we're going to say, "In scratch.el"...
+
+00:11:20.700 --> 00:11:23.400
+let's say what we want to happen.
+
+00:11:23.401 --> 00:11:32.133
+[In scratch.el, there is a fibonacci function.
+
+00:11:32.134 --> 00:11:39.567
+Can you add all normal elisp headers
+
+00:11:39.568 --> 00:11:43.859
+and footers to this file?]
+
+00:11:43.860 --> 00:11:45.840
+So, we just say what's going to happen,
+
+00:11:45.841 --> 00:11:48.399
+and this is going to do things in the background.
+
+00:11:48.400 --> 00:11:50.979
+It's not going to do things through Emacs.
+
+00:11:50.980 --> 00:11:54.079
+That said, there is an integration with Emacs,
+
+00:11:54.080 --> 00:12:00.659
+so that it can do things like show you these nice ediffs.
+
+00:12:00.660 --> 00:12:03.199
+My screen is not really wide enough
+
+00:12:03.200 --> 00:12:04.699
+to show you a really great ediff here,
+
+00:12:04.700 --> 00:12:06.239
+but you can kind of see what it's doing,
+
+00:12:06.240 --> 00:12:09.079
+and you can see, yeah, that looks good,
+
+00:12:09.080 --> 00:12:14.120
+so you could say yes, yes, accept the changes,
+
+00:12:14.121 --> 00:12:25.299
+and if we... Just need to revert the buffer.
+
+00:12:25.300 --> 00:12:28.459
+We can quit the printout of this.
+
+00:12:28.460 --> 00:12:33.019
+We see that it just did everything I asked it to.
+
+00:12:33.020 --> 00:12:36.139
+Is everything exactly right?
+
+00:12:36.140 --> 00:12:39.159
+Probably not. It's reasonable for a start though.
+
+00:12:39.160 --> 00:12:40.959
+But you could ask it to do anything.
+
+00:12:40.960 --> 00:12:45.339
+You could say, write unit tests for this, and it will.
+
+00:12:45.340 --> 00:12:49.019
+You could say, write me a suite of functions
+
+00:12:49.020 --> 00:12:52.579
+like Fibonacci, and it'll probably do something reasonable.
+
+00:12:52.580 --> 00:12:54.900
+But you can see this is not editing.
+
+00:12:54.901 --> 00:12:58.659
+There's nothing editing-like about this.
+
+00:12:58.660 --> 00:13:07.159
+That said, there is something that is editing.
+
+00:13:07.160 --> 00:13:08.599
+You need to give it instructions.
+
+00:13:08.600 --> 00:13:10.959
+You need to tell it what to do.
+
+NOTE Org files
+
+00:13:10.960 --> 00:13:19.619
+And what you could do is... You could have a project.org,
+
+00:13:19.620 --> 00:13:23.899
+and what you could do is you could have functions.
+
+00:13:23.900 --> 00:13:26.659
+The way I've done things often is ....
+
+00:13:26.660 --> 00:13:28.439
+You could say something like,
+
+00:13:28.440 --> 00:13:36.199
+unit tests for Fibonacci. How do you spell Fibonacci?
+
+00:13:36.200 --> 00:13:40.479
+I don't remember. But then you could say that this is,
+
+00:13:40.480 --> 00:13:47.159
+you could clock it, basically. org-clock.
+
+00:13:47.160 --> 00:13:48.879
+What I've done is...
+
+00:13:48.880 --> 00:13:50.399
+You could add custom commands to Claude Code,
+
+00:13:50.400 --> 00:13:53.119
+and you could just say, look, here's my Org file,
+
+00:13:53.120 --> 00:13:57.879
+read it and do the thing that I'm clocked in as.
+
+00:13:57.880 --> 00:14:01.159
+And then you can write a bunch of instructions here, like,
+
+00:14:01.160 --> 00:14:07.039
+I like to use ert for tests. Tests should, like, whatever.
+
+00:14:07.040 --> 00:14:08.639
+You should just say... everything
+
+00:14:08.640 --> 00:14:10.999
+you need to kind of specify.
+
+00:14:11.000 --> 00:14:13.199
+As you get to more complicated tasks,
+
+00:14:13.200 --> 00:14:16.679
+it's harder and harder to give it all the context
+
+00:14:16.680 --> 00:14:17.799
+it needs for a task,
+
+00:14:17.800 --> 00:14:22.299
+and Org Mode is actually a pretty good way to do this.
+
+00:14:22.300 --> 00:14:24.079
+I find that this works pretty well,
+
+00:14:24.080 --> 00:14:26.699
+and you can even have it instruct Claude
+
+00:14:26.700 --> 00:14:29.333
+to just mark things done in your Org file
+
+00:14:29.334 --> 00:14:30.679
+when they're done.
+
+00:14:30.680 --> 00:14:32.867
+And it knows how to do this, of course.
+
+00:14:32.868 --> 00:14:37.959
+So, let's just clock out.
+
+00:14:37.960 --> 00:14:45.239
+That's one way to do things.
+
+NOTE ECA
+
+00:14:45.240 --> 00:14:49.499
+So one other thing I'd like to show you is eca,
+
+00:14:49.500 --> 00:14:52.879
+which, compared to Claude Code, ECA is open source.
+
+00:14:52.880 --> 00:14:54.239
+It's very nice in that respect.
+
+00:14:54.240 --> 00:14:57.839
+It doesn't have to use Anthropic's models.
+
+00:14:57.840 --> 00:15:00.279
+You can use local models,
+
+00:15:00.280 --> 00:15:07.619
+but it has the advantage of integrating very well with Emacs.
+
+00:15:07.620 --> 00:15:08.559
+I'm not going to demonstrate it,
+
+00:15:08.560 --> 00:15:11.159
+because it works essentially the same thing you could do
+
+00:15:11.160 --> 00:15:14.119
+approximately the same kinds of things
+
+00:15:14.120 --> 00:15:15.479
+you could do with Claude Code.
+
+00:15:15.480 --> 00:15:17.439
+You just write what you want to happen
+
+00:15:17.440 --> 00:15:18.639
+and it will make it happen.
+
+00:15:18.640 --> 00:15:21.879
+It again does not do this through Emacs,
+
+00:15:21.880 --> 00:15:23.039
+but what it does do is
+
+00:15:23.040 --> 00:15:25.119
+it gives you a much better Emacs interface
+
+00:15:25.120 --> 00:15:26.919
+that's not terminal-based,
+
+00:15:26.920 --> 00:15:29.639
+because you're not using it through the terminal,
+
+00:15:29.640 --> 00:15:31.239
+or not even through comint,
+
+00:15:31.240 --> 00:15:35.599
+you are using it through a backend
+
+00:15:35.600 --> 00:15:37.499
+that is exchanging structured information
+
+00:15:37.500 --> 00:15:40.999
+with this process that is doing all the work.
+
+00:15:41.000 --> 00:15:41.900
+But other than that,
+
+00:15:41.901 --> 00:15:44.519
+it's the same model as Claude Code
+
+00:15:44.520 --> 00:15:52.059
+and projects of that nature.
+
+NOTE Editing
+
+00:15:52.060 --> 00:15:56.159
+We've seen in the demos that I gave
+
+00:15:56.160 --> 00:15:58.639
+that there are AI experiences
+
+00:15:58.640 --> 00:16:01.279
+that are very natural in the world of editing.
+
+00:16:01.280 --> 00:16:05.339
+because they, like Copilot, just offers completion,
+
+00:16:05.340 --> 00:16:09.479
+it fits very well with what we all do in Emacs.
+
+00:16:09.480 --> 00:16:14.279
+And it's truly, yes, it's kind of a cheat in a sense
+
+00:16:14.280 --> 00:16:15.639
+for editing experiences,
+
+00:16:15.640 --> 00:16:20.159
+because it can do so much, but it's just editing.
+
+00:16:20.160 --> 00:16:25.259
+Whereas things like gptel and those kinds of tools,
+
+00:16:25.260 --> 00:16:29.799
+they are clearly in an editor and using editor,
+
+00:16:29.800 --> 00:16:35.319
+they're using Emacs, but they represent sort of like, well,
+
+00:16:35.320 --> 00:16:37.759
+you can edit for a while, then you could use these tools
+
+00:16:37.760 --> 00:16:39.479
+to do something that is not editing,
+
+00:16:39.480 --> 00:16:45.899
+this AI just changing the buffer for you. And that's fine.
+
+00:16:45.900 --> 00:16:48.399
+It's still... It may not be editing,
+
+00:16:48.400 --> 00:16:52.033
+but it's still clearly something that
+
+00:16:52.034 --> 00:16:55.567
+is useful to do in Emacs
+
+00:16:55.568 --> 00:16:57.039
+and belongs in Emacs.
+
+00:16:57.040 --> 00:17:01.859
+But the new tools like Claude Code and things like that
+
+00:17:01.860 --> 00:17:02.639
+are kind of different.
+
+00:17:02.640 --> 00:17:06.639
+Yes, they will get better integrated with Emacs,
+
+00:17:06.640 --> 00:17:11.639
+but it's not clear that they really need to.
+
+00:17:11.640 --> 00:17:15.479
+They can do a lot of things without editing.
+
+00:17:15.480 --> 00:17:19.239
+In a sense, editing is obsolete in some sense.
+
+00:17:19.240 --> 00:17:23.459
+For as many tasks, you don't need to edit anymore.
+
+00:17:23.460 --> 00:17:26.439
+And that's a nice thing.
+
+00:17:26.440 --> 00:17:30.579
+No one really knows when all this will end,
+
+00:17:30.580 --> 00:17:36.879
+how far things will go. It could be that in a decade or so,
+
+00:17:36.880 --> 00:17:41.039
+no one's really editing for work anymore.
+
+00:17:41.040 --> 00:17:43.159
+Maybe you're just writing instructions.
+
+00:17:43.160 --> 00:17:44.319
+You could do that with anything.
+
+00:17:44.320 --> 00:17:47.439
+You don't need Emacs or any special editor.
+
+00:17:47.440 --> 00:17:50.439
+We could all be using Notepad. That would be bad.
+
+00:17:50.440 --> 00:17:58.039
+But... I think it could go that far,
+
+00:17:58.040 --> 00:18:01.839
+but it could be that, well, for many specialized things,
+
+00:18:01.840 --> 00:18:04.359
+people are still using editing for certain tasks,
+
+00:18:04.360 --> 00:18:07.000
+but most tasks are getting fed to just...
+
+00:18:07.001 --> 00:18:08.839
+AI is just doing those things.
+
+00:18:08.840 --> 00:18:15.759
+In any case, I think it's clear that editing is diminishing,
+
+00:18:15.760 --> 00:18:17.959
+the need for editing itself is diminishing.
+
+00:18:17.960 --> 00:18:21.879
+And in such a world, It's interesting to think
+
+00:18:21.880 --> 00:18:24.799
+where Emacs is headed, especially in relation to
+
+00:18:24.800 --> 00:18:26.359
+all the other editors.
+
+00:18:26.360 --> 00:18:28.599
+I think people will use Emacs less.
+
+00:18:28.600 --> 00:18:31.639
+But I think other editors, like VS Code,
+
+00:18:31.640 --> 00:18:37.999
+may simply disappear or be a relatively fringe tool.
+
+00:18:38.000 --> 00:18:42.719
+And Emacs is going to follow its own path.
+
+00:18:42.720 --> 00:18:44.679
+It's very extensible. It could do anything.
+
+00:18:44.680 --> 00:18:47.919
+If there's one thing Emacs can do, it's adapt.
+
+00:18:47.920 --> 00:18:51.679
+Emacs has been around for a long time.
+
+00:18:51.680 --> 00:18:54.799
+It's pretty clear that Emacs will be around for a long time.
+
+00:18:54.800 --> 00:18:58.879
+It might be that in the future,
+
+00:18:58.880 --> 00:19:04.339
+editing is some sort of like an artisanal activity that we do.
+
+00:19:04.340 --> 00:19:05.599
+It's kind of weird to think about it.
+
+00:19:05.600 --> 00:19:07.679
+It's not like baking bread.
+
+00:19:07.680 --> 00:19:10.079
+But it is the sense that AI might be
+
+00:19:10.080 --> 00:19:12.399
+churning out code in the way, you know,
+
+00:19:12.400 --> 00:19:14.199
+the factories are turning out bread,
+
+00:19:14.200 --> 00:19:17.139
+but if you really want the good stuff,
+
+00:19:17.140 --> 00:19:20.999
+you'll have to do it yourself.
+
+00:19:21.000 --> 00:19:23.959
+I don't know if it'll be exactly like that,
+
+00:19:23.960 --> 00:19:29.519
+but it could be that Emacs survives and thrives
+
+00:19:29.520 --> 00:19:33.559
+in a very kind of specialized ecosystem of people
+
+00:19:33.560 --> 00:19:35.599
+who contribute and use it in the way
+
+00:19:35.600 --> 00:19:39.539
+it has survived and thrive right now.
+
+00:19:39.540 --> 00:19:46.139
+And I think that's a really nice way for all this to end up.
+
+00:19:46.140 --> 00:19:48.719
+There's the whole sense of how society will end up
+
+00:19:48.720 --> 00:19:50.759
+if all this happens. I don't know,
+
+00:19:50.760 --> 00:19:54.639
+but Emacs will be there for us when whatever happens.
+
+00:19:54.640 --> 00:20:00.079
+So thank you, and let's help make Emacs the best it can be
+
+00:20:00.080 --> 00:20:04.880
+to survive and thrive in the next decade.
diff --git a/2025/captions/emacsconf-2025-python--interactive-python-programming-in-emacs--david-vujic--main.vtt b/2025/captions/emacsconf-2025-python--interactive-python-programming-in-emacs--david-vujic--main.vtt
new file mode 100644
index 00000000..d63a36c8
--- /dev/null
+++ b/2025/captions/emacsconf-2025-python--interactive-python-programming-in-emacs--david-vujic--main.vtt
@@ -0,0 +1,731 @@
+WEBVTT captioned by sachac
+
+00:00:00.000 --> 00:00:04.439
+Okay, so welcome to this session about interactive Python
+
+00:00:04.440 --> 00:00:09.679
+programming. My name is David Vujic and I live and work in
+
+00:00:09.680 --> 00:00:15.319
+Stockholm, Sweden. a developer and today I focus
+
+00:00:15.320 --> 00:00:20.439
+mainly on Python software development. So I do this at work
+
+00:00:20.440 --> 00:00:25.999
+and I also do this on my spare time in my open source projects.
+
+00:00:26.000 --> 00:00:30.479
+Before that, I've been part of the Lisp community. I've
+
+00:00:30.480 --> 00:00:33.700
+been a Clojure developer, and also, like, way back,
+
+00:00:33.701 --> 00:00:40.279
+I was in the Microsoft world and developed C# and .NET stuff.
+
+00:00:40.280 --> 00:00:45.999
+What I've been doing lately is to try to improve the
+
+00:00:46.000 --> 00:00:52.399
+developer experience when you write Python code. So what I
+
+00:00:52.400 --> 00:00:56.159
+want to talk about is this, but also I want to begin with
+
+00:00:56.160 --> 00:01:00.839
+feedback loops because I think it's very related to this
+
+00:01:00.840 --> 00:01:05.359
+interactive programming style, like having this nice
+
+00:01:05.360 --> 00:01:07.067
+feedback when you write code.
+
+00:01:07.068 --> 00:01:10.533
+So I'm going to begin with that.
+
+NOTE Feedback loops
+
+00:01:10.534 --> 00:01:14.199
+So this image, you know, this circle is supposed to be a
+
+00:01:14.200 --> 00:01:19.879
+visualization of a feedback loop. Let's say we write our
+
+00:01:19.880 --> 00:01:25.239
+code and then we deploy it to production. Then when it's
+
+00:01:25.240 --> 00:01:29.639
+running there, we can check if things work, or if maybe someone
+
+00:01:29.640 --> 00:01:35.319
+else will let us know. Maybe our customers will let us know.
+
+00:01:35.320 --> 00:01:39.639
+That's a pretty slow feedback loop with potential risks of
+
+00:01:39.640 --> 00:01:41.867
+damaging your business or whatever.
+
+00:01:41.868 --> 00:01:44.167
+This is obvious, of course.
+
+00:01:44.168 --> 00:01:50.000
+So a faster feedback loop probably is to have
+
+00:01:50.001 --> 00:01:54.066
+some kind of automation when you do commits
+
+00:01:54.067 --> 00:01:59.733
+or maybe you have this pull request things and even reviews.
+
+00:01:59.734 --> 00:02:02.933
+So maybe not always as fast as deploy,
+
+00:02:02.934 --> 00:02:05.839
+don't deploy directly to production, but
+
+00:02:05.840 --> 00:02:10.539
+it's probably safer and often you get this automated
+
+00:02:10.540 --> 00:02:16.199
+feedback faster anyway. But it's still kind of slow. You
+
+00:02:16.200 --> 00:02:20.239
+have to wait. You have to push things to GitHub maybe and
+
+00:02:20.240 --> 00:02:24.279
+wait. So there's faster ways for sure to get feedback.
+
+00:02:24.280 --> 00:02:27.967
+So a much faster way is to write code,
+
+00:02:27.968 --> 00:02:31.367
+and write some unit tests, and run those unit tests.
+
+00:02:31.368 --> 00:02:33.467
+So then you do everything on your local machine
+
+00:02:33.468 --> 00:02:39.039
+and you will fairly quickly learn if your code does
+
+00:02:39.040 --> 00:02:47.159
+what you think it does or if it doesn't. I want to zoom in to
+
+00:02:47.160 --> 00:02:55.999
+this test write code and test flow a bit. Let's do that.
+
+NOTE Test-driven development
+
+00:02:56.000 --> 00:02:59.759
+As a developer, I have used a thing called test-driven
+
+00:02:59.760 --> 00:03:05.999
+development for quite some time. I find that this way of
+
+00:03:06.000 --> 00:03:11.259
+working is very fast when it comes to getting feedback on
+
+00:03:11.260 --> 00:03:14.519
+what your code does and how you should continue the
+
+00:03:14.520 --> 00:03:19.980
+development. So, test-driven development,
+
+00:03:19.981 --> 00:03:24.220
+basically that you start writing a test for
+
+00:03:24.221 --> 00:03:27.020
+something that you want to develop, and then you continue
+
+00:03:27.021 --> 00:03:31.019
+developing that, and then you go back to the test, and modify
+
+00:03:31.020 --> 00:03:35.079
+and modify the code, and you go back and forth between the
+
+00:03:35.080 --> 00:03:36.959
+tests and the code.
+
+00:03:36.960 --> 00:03:44.419
+It's sort of like a ping-pong game. I find this very
+
+00:03:44.420 --> 00:03:50.519
+effective when you want to get feedback and to know how to
+
+00:03:50.520 --> 00:03:57.233
+continue the development. The most important thing
+
+00:03:57.234 --> 00:04:01.700
+that I feel is that you know what the code does.
+
+00:04:01.701 --> 00:04:05.559
+You learn very quickly.
+
+NOTE REPL-driven development
+
+00:04:05.560 --> 00:04:12.199
+Let's zoom into this TDD flow a little bit. The last couple of
+
+00:04:12.200 --> 00:04:17.379
+years, I've been doing a slightly different thing which is
+
+00:04:17.380 --> 00:04:21.979
+called REPL-driven development. REPL-driven
+
+00:04:21.980 --> 00:04:25.719
+development is very similar to test-driven development,
+
+00:04:25.720 --> 00:04:31.159
+but I find it even quicker. You get feedback even quicker
+
+00:04:31.160 --> 00:04:34.979
+than with a regular TDD setup. So REPL-driven development
+
+00:04:34.980 --> 00:04:41.199
+is about writing and evaluating code in a REPL basically.
+
+00:04:41.200 --> 00:04:46.839
+And you can do experiments and you can refactor and
+
+00:04:46.840 --> 00:04:51.699
+re-evaluate and you get instant feedback on what the code
+
+00:04:51.700 --> 00:04:54.799
+does and what you need to change. So I think that's even
+
+00:04:54.800 --> 00:04:59.519
+faster than test-driven development.
+
+00:04:59.520 --> 00:05:02.899
+Okay, REPL driven development. Let's go back. What's the
+
+00:05:02.900 --> 00:05:10.759
+REPL? Most of developers know what a REPL is. The most common
+
+00:05:10.760 --> 00:05:16.399
+setup is you open this shell and you use the REPL for your
+
+00:05:16.400 --> 00:05:19.359
+programming language. In this case I'm using the Python
+
+00:05:19.360 --> 00:05:25.619
+REPL or the IPython REPL which is an enhanced REPL for Python
+
+00:05:25.620 --> 00:05:30.679
+development. So what happens here is that we start a REPL
+
+00:05:30.680 --> 00:05:34.919
+session in isolation. So this session knows about the
+
+00:05:34.920 --> 00:05:38.119
+Python environment. So it knows about the Python language
+
+00:05:38.120 --> 00:05:42.359
+basically. So as soon as we start writing things, adding
+
+00:05:42.360 --> 00:05:47.359
+variables or creating writing functions or even doing
+
+00:05:47.360 --> 00:05:51.679
+imports. Then the session will be more and more aware of the
+
+00:05:51.680 --> 00:05:55.819
+code so we will add things to the to the session and then that
+
+00:05:55.820 --> 00:06:00.519
+means that we can run functions we can print out these
+
+00:06:00.520 --> 00:06:05.859
+variables and things like that. But with REPL driven
+
+00:06:05.860 --> 00:06:09.839
+development it's not really that well at least not what I
+
+00:06:09.840 --> 00:06:14.039
+mean with REPL driven development. So what I'm thinking of
+
+00:06:14.040 --> 00:06:19.639
+is that you are in your code editor where you have your
+
+00:06:19.640 --> 00:06:22.799
+autocomplete, and you have your syntax highlighting and
+
+00:06:22.800 --> 00:06:30.459
+your favorite theme, color theme, and all of those things. But
+
+00:06:30.460 --> 00:06:34.979
+instead, you have this running REPL in the background or in a
+
+00:06:34.980 --> 00:06:41.139
+smaller window or buffer. So that means that you write code
+
+00:06:41.140 --> 00:06:45.319
+and you can send that code to the running REPL, to the REPL
+
+00:06:45.320 --> 00:06:50.399
+session. You write and do everything as you would do when
+
+00:06:50.400 --> 00:06:55.219
+writing your code basically. In this case, in this
+
+00:06:55.220 --> 00:07:00.599
+example, I have evaluated these two functions. I've sent
+
+00:07:00.600 --> 00:07:05.819
+them to the REPL session so it's aware of these functions.
+
+00:07:05.820 --> 00:07:10.399
+Then I switched to a separate different module and
+
+00:07:10.400 --> 00:07:14.039
+evaluated that one. So the REPL session now knows about
+
+00:07:14.040 --> 00:07:19.039
+these two functions and also these two variables. That
+
+00:07:19.040 --> 00:07:23.999
+means that I can evaluate the state of those variables and
+
+00:07:24.000 --> 00:07:28.999
+change code and re-evaluate and things like that. So in this
+
+00:07:29.000 --> 00:07:33.639
+example if you look in the smaller area there you see that I
+
+00:07:33.640 --> 00:07:39.639
+have evaluated this res variable on line 6 and the output was
+
+00:07:39.640 --> 00:07:42.399
+that it's a dictionary with two keys and two values
+
+00:07:42.400 --> 00:07:51.219
+basically. So this setup works in basically any of your
+
+00:07:51.220 --> 00:07:54.079
+favorite code editors. So you can do this in Visual Studio
+
+00:07:54.080 --> 00:08:01.239
+Code, you can do this in PyCharm or Vim. But what I have done is
+
+00:08:01.240 --> 00:08:07.119
+that... More like what I have missed is that when I write code
+
+00:08:07.120 --> 00:08:10.239
+and do this evaluation, this is really cool, but then I need
+
+00:08:10.240 --> 00:08:15.459
+to switch context if I want to see the result. I have to switch
+
+00:08:15.460 --> 00:08:21.979
+context to this other window. I
+
+00:08:21.980 --> 00:08:25.759
+have my focus on the code and then I have to look in a different
+
+00:08:25.760 --> 00:08:31.799
+place to know the results. And if it's a larger output, then
+
+00:08:31.800 --> 00:08:37.479
+maybe I need to scroll. So I wanted to find out if it was
+
+00:08:37.480 --> 00:08:43.479
+possible to make this even smoother and faster, this
+
+00:08:43.480 --> 00:08:45.479
+feedback loop even faster, so I don't have to switch
+
+00:08:45.480 --> 00:08:52.119
+context. What I've done here is that... I can select a row or a
+
+00:08:52.120 --> 00:08:58.079
+region and I can evaluate and then an overlay, a small pop-up
+
+00:08:58.080 --> 00:09:03.119
+shows up with the evaluated result right next to it. So I can
+
+00:09:03.120 --> 00:09:07.519
+change code and re-evaluate and quickly see the result of it
+
+00:09:07.520 --> 00:09:12.640
+without doing this context switching. So the way I've done
+
+00:09:12.641 --> 00:09:20.679
+it is that I wanted to reuse the existing tooling that I
+
+00:09:20.680 --> 00:09:27.739
+already had. I know that my in-editor REPL, the IPython
+
+00:09:27.740 --> 00:09:31.559
+REPL, already does this evaluation. So I figured maybe I can
+
+00:09:31.560 --> 00:09:35.359
+extract the data and do this visualization as a separate
+
+00:09:35.360 --> 00:09:40.839
+thing. That's how I've done it. What I've done is that
+
+00:09:40.840 --> 00:09:47.199
+I've created this overlay and placed it where my cursor
+
+00:09:47.200 --> 00:09:50.859
+currently is, right next to the code. Then I've
+
+00:09:50.860 --> 00:09:55.719
+extracted the evaluated result and put it in this overlay.
+
+00:09:55.720 --> 00:10:01.039
+I also want this overlay to have this nice looking syntax,
+
+00:10:01.040 --> 00:10:04.759
+so I've set it to this Python mode, so we get this syntax
+
+00:10:04.760 --> 00:10:10.559
+highlighting. Make it look very readable. And as a nice
+
+00:10:10.560 --> 00:10:16.879
+developer experience thing,
+
+00:10:16.880 --> 00:10:20.379
+when you move the cursor, of course you don't want the
+
+00:10:20.380 --> 00:10:25.679
+overlay to be there. You want it to disappear. So those kinds
+
+00:10:25.680 --> 00:10:28.999
+of things I've added. So putting the overlay at the right
+
+00:10:29.000 --> 00:10:33.279
+place and feed it with the evaluated data and then make it
+
+00:10:33.280 --> 00:10:39.839
+disappear when it's not interesting to look at anymore.
+
+00:10:39.840 --> 00:10:44.639
+What I've described so far is something that I use on a
+
+00:10:44.640 --> 00:10:50.639
+daily basis, and it covers most of my needs while doing Python
+
+00:10:50.640 --> 00:10:56.119
+development. But one thing I still miss, and I miss it from my
+
+00:10:56.120 --> 00:11:03.479
+days as a Clojure developer, because over there we could
+
+00:11:03.480 --> 00:11:07.919
+have a running app on our local machine and we can have our
+
+00:11:07.920 --> 00:11:12.719
+editor, and the app and the editor were connected. So when I
+
+00:11:12.720 --> 00:11:17.199
+did some changes in the code, the app would change without
+
+00:11:17.200 --> 00:11:20.559
+any restarts or anything like that. And the same if I would
+
+00:11:20.560 --> 00:11:24.679
+change the state of the app, I can inspect the state from the
+
+00:11:24.680 --> 00:11:28.919
+code. So they were connected. They are connected. So I was
+
+00:11:28.920 --> 00:11:32.839
+thinking, hey, this would be really cool if we could have
+
+00:11:32.840 --> 00:11:39.199
+something like this in Python. And that reminded me of
+
+00:11:39.200 --> 00:11:43.839
+Jupyter and Jupyter notebooks because I think notebooks,
+
+00:11:43.840 --> 00:11:49.659
+the way you do things there, is very similar to what I was
+
+00:11:49.660 --> 00:11:56.879
+trying to achieve. So I was reading up a little bit on how this
+
+00:11:56.880 --> 00:12:00.919
+notebook thing works. It turns out that a notebook is a
+
+00:12:00.920 --> 00:12:05.279
+client that talks to a server, that communicates with a
+
+00:12:05.280 --> 00:12:08.799
+server. It's on the server that all this Python
+
+00:12:08.800 --> 00:12:14.159
+evaluation and all this thing happens. Then what I've
+
+00:12:14.160 --> 00:12:19.659
+done is that instead of starting up IPython in my editor, I
+
+00:12:19.660 --> 00:12:23.519
+start the Jupyter console instead. And then I can give it
+
+00:12:23.520 --> 00:12:27.159
+that unique ID and it will be connected to that running
+
+00:12:27.160 --> 00:12:30.919
+kernel.
+
+NOTE FastAPI CRUD
+
+00:12:30.920 --> 00:12:37.199
+In this example, I've created this FastAPI CRUD app that
+
+00:12:37.200 --> 00:12:41.919
+has this create, read, update, and delete endpoints. It
+
+00:12:41.920 --> 00:12:46.399
+has this, it's locally running, it has this database where
+
+00:12:46.400 --> 00:12:51.639
+you can do all these things. I'm running this FastAPI app
+
+00:12:51.640 --> 00:12:58.059
+in the kernel and then I've connected to, I've connected to
+
+00:12:58.060 --> 00:13:03.239
+the kernel in my editor too. Both of them are connected to
+
+00:13:03.240 --> 00:13:09.719
+the kernel. What I do now is that I want to initially create
+
+00:13:09.720 --> 00:13:15.239
+some data. I'm going to add this, creating this message.
+
+00:13:15.240 --> 00:13:19.899
+What I get back is a message ID. I want to experiment in
+
+00:13:19.900 --> 00:13:24.359
+my browser. What do I get with that message ID? I'm
+
+00:13:24.360 --> 00:13:30.239
+evaluating the read function. I instantly get this
+
+00:13:30.240 --> 00:13:34.779
+evaluated result, which was this hello world text. So what
+
+00:13:34.780 --> 00:13:39.919
+happens if I do some changes in this app? I'm going to grab
+
+00:13:39.920 --> 00:13:49.659
+this message ID and write something else.
+
+00:13:49.660 --> 00:13:53.759
+Now I can evaluate the same thing again, and you can see that
+
+00:13:53.760 --> 00:14:02.399
+the content has changed to this new value. My editor isn't
+
+00:14:02.400 --> 00:14:07.719
+in any debug mode or something like that. It doesn't know
+
+00:14:07.720 --> 00:14:11.239
+what database it is. It doesn't have any environment
+
+00:14:11.240 --> 00:14:14.479
+variables set up or something like that. It is only
+
+00:14:14.480 --> 00:14:17.599
+connected to the kernel, and the kernel is aware of that. It's
+
+00:14:17.600 --> 00:14:20.479
+running the app. It has the connection strings and
+
+00:14:20.480 --> 00:14:28.799
+everything that is needed. So that's how this thing works.
+
+00:14:28.800 --> 00:14:34.199
+Now I want to do some inline hacking because I want to store
+
+00:14:34.200 --> 00:14:37.799
+this input that is sent from this app because I want to work
+
+00:14:37.800 --> 00:14:42.039
+with it afterwards. I can add this dictionary that stores
+
+00:14:42.040 --> 00:14:48.759
+this message. I'm updating the source code of this app, and
+
+00:14:48.760 --> 00:15:03.079
+when I run any of these endpoints again, you will see that
+
+00:15:03.080 --> 00:15:08.759
+the state changes, and the new inputs, I can grab and I can use
+
+00:15:08.760 --> 00:15:14.399
+them for quick evaluation or testing. This example is
+
+00:15:14.400 --> 00:15:18.519
+really simple. It was just an integer. For example, if you
+
+00:15:18.520 --> 00:15:23.519
+are sending a more complex object, maybe a pydantic schema
+
+00:15:23.520 --> 00:15:28.199
+or something, and you want to inspect what's coming in, and if
+
+00:15:28.200 --> 00:15:34.199
+you have some sort of validation that you want to test out.
+
+00:15:34.200 --> 00:15:38.399
+The configuration or the code that I wrote to make this work
+
+00:15:38.400 --> 00:15:44.159
+is a little bit different than just adding an overlay. I'm
+
+00:15:44.160 --> 00:15:50.999
+using this overlay just like with the IPython example, but in
+
+00:15:51.000 --> 00:15:57.839
+this case, when I change code, I have to think about where that
+
+00:15:57.840 --> 00:16:02.159
+code lives, because it's the app that runs the code. So it's
+
+00:16:02.160 --> 00:16:07.039
+in the app context I need to manipulate with the data. If you
+
+00:16:07.040 --> 00:16:11.919
+have started the app from maybe a main function and that
+
+00:16:11.920 --> 00:16:17.879
+module imports namespaces, then you need to, if you want to
+
+00:16:17.880 --> 00:16:22.359
+update a function or something like that, you need to update
+
+00:16:22.360 --> 00:16:26.679
+it in the correct namespace. What I did before in IPython
+
+00:16:26.680 --> 00:16:29.919
+by adding and changing things, everything ends up in the
+
+00:16:29.920 --> 00:16:34.439
+global namespace. But here, if you want the app to actually
+
+00:16:34.440 --> 00:16:38.479
+react to the changes, you need to put it in the right
+
+00:16:38.480 --> 00:16:43.479
+namespace. So that's what I do here. I do some lookups, where
+
+00:16:43.480 --> 00:16:49.139
+is this function, and then I do this reload of this function or
+
+00:16:49.140 --> 00:16:54.799
+module. And when I was developing this, I was thinking, hey,
+
+00:16:54.800 --> 00:16:59.319
+this is really ugly. I'm in this REPL and do some
+
+00:16:59.320 --> 00:17:03.559
+manipulation of the imports and things like that. That
+
+00:17:03.560 --> 00:17:09.759
+didn't feel good. Then I was reminded of the IPython. And
+
+00:17:09.760 --> 00:17:15.519
+IPython has this feature to reload any updated
+
+00:17:15.520 --> 00:17:19.119
+submodules. I was curious how do they do it. I looked in the
+
+00:17:19.120 --> 00:17:24.079
+IPython source code and saw that they also use importlib and
+
+00:17:24.080 --> 00:17:28.359
+reloading of this module. Once I've learned that, then I
+
+00:17:28.360 --> 00:17:32.599
+stopped thinking that my code was hacky. I thought it was
+
+00:17:32.600 --> 00:17:37.159
+good enough at least.
+
+NOTE Testing with an LLM
+
+00:17:37.160 --> 00:17:45.059
+But one thing that has bothered me for a long time is I quite
+
+00:17:45.060 --> 00:17:50.199
+often want to test out and evaluate individual rows that
+
+00:17:50.200 --> 00:17:58.559
+lives in a function. Quite often, this code uses the input
+
+00:17:58.560 --> 00:18:02.639
+to that function like the input parameters. To be able to
+
+00:18:02.640 --> 00:18:07.719
+do that, I need to manually type some fake data and set it to
+
+00:18:07.720 --> 00:18:12.279
+this variable, and then I can evaluate the code. But I think
+
+00:18:12.280 --> 00:18:17.779
+that takes... That slows me down. I was thinking, maybe I can
+
+00:18:17.780 --> 00:18:23.439
+do this in a quicker way, so I have this quicker feedback, so I
+
+00:18:23.440 --> 00:18:27.933
+can run this or evaluate this code much quicker.
+
+00:18:27.934 --> 00:18:29.439
+So my idea was maybe I
+
+00:18:29.440 --> 00:18:35.239
+can use an LLM for this. If I give it the parameters, maybe it
+
+00:18:35.240 --> 00:18:41.119
+can return some random data so I don't have to write it
+
+00:18:41.120 --> 00:18:44.119
+myself. I ended up doing that. I have this source code.
+
+00:18:44.120 --> 00:18:50.399
+I'm loading the REPL with the code. Then I select this
+
+00:18:50.400 --> 00:18:56.719
+function name and the parameters with its data type. I
+
+00:18:56.720 --> 00:19:02.839
+have this prompt that instructs the LLM to come up with fake
+
+00:19:02.840 --> 00:19:06.239
+data based on the tag name and on the data type. And then I can
+
+00:19:06.240 --> 00:19:10.099
+send that to the REPL. I do that with a key command. Then
+
+00:19:10.100 --> 00:19:16.019
+I can proceed by running the code within the function that
+
+00:19:16.020 --> 00:19:21.719
+uses these inputs. This works for all the data types. If
+
+00:19:21.720 --> 00:19:26.279
+there's a custom data type, you need to give the LLM extra
+
+00:19:26.280 --> 00:19:30.399
+context. So that's something to think about. Once it knows
+
+00:19:30.400 --> 00:19:35.679
+the context, it can generate this fake data that very often is
+
+00:19:35.680 --> 00:19:39.839
+good enough just to test out, you know, like I've done here, like
+
+00:19:39.840 --> 00:19:45.399
+string... sorry, list destructuring and parsing and things
+
+00:19:45.400 --> 00:19:51.879
+like that. I think that was all I had, and thank you for
+
+00:19:51.880 --> 00:19:52.920
+listening!
diff --git a/2025/captions/emacsconf-2025-swanky--swanky-python-interactive-development-for-python--scott-zimmermann--main.vtt b/2025/captions/emacsconf-2025-swanky--swanky-python-interactive-development-for-python--scott-zimmermann--main.vtt
new file mode 100644
index 00000000..35eb7ce7
--- /dev/null
+++ b/2025/captions/emacsconf-2025-swanky--swanky-python-interactive-development-for-python--scott-zimmermann--main.vtt
@@ -0,0 +1,1108 @@
+WEBVTT captioned by sachac
+
+00:00:00.880 --> 00:00:02.439
+Hello everyone, I'm Scott
+
+00:00:02.440 --> 00:00:04.239
+and I'll be talking about Swanky Python,
+
+00:00:04.240 --> 00:00:06.199
+which is a development environment for Python
+
+00:00:06.200 --> 00:00:08.319
+based on Emacs' Slime package.
+
+00:00:08.320 --> 00:00:11.679
+So what is that and why might you find it interesting?
+
+00:00:11.680 --> 00:00:15.279
+SLIME is the Superior Lisp Interaction Mode for Emacs.
+
+00:00:15.280 --> 00:00:17.999
+It's an Emacs package for developing Common Lisp,
+
+00:00:18.000 --> 00:00:20.679
+and it's a bit different from the way we develop most languages
+
+00:00:20.680 --> 00:00:22.599
+in that you're always connected
+
+00:00:22.600 --> 00:00:25.399
+to a running instance of your application,
+
+00:00:25.400 --> 00:00:27.959
+and you kind of build up your application, piece by piece,
+
+00:00:27.960 --> 00:00:30.399
+modifying one expression at a time
+
+00:00:30.400 --> 00:00:34.559
+without ever having to restart your application.
+
+00:00:34.560 --> 00:00:36.679
+So why might you want to develop this way?
+
+00:00:36.680 --> 00:00:40.039
+One advantage is that you can get a faster feedback loop.
+
+00:00:40.040 --> 00:00:42.599
+For some kinds of software, it doesn't make a big difference.
+
+00:00:42.600 --> 00:00:43.919
+Like, if you're developing a web backend
+
+00:00:43.920 --> 00:00:48.039
+where all state is stored externally in a database,
+
+00:00:48.040 --> 00:00:50.279
+then you can have a file watcher
+
+00:00:50.280 --> 00:00:52.799
+that just restarts the whole Python process
+
+00:00:52.800 --> 00:00:54.639
+whenever you make any edit,
+
+00:00:54.640 --> 00:00:56.159
+and you're not really losing anything,
+
+00:00:56.160 --> 00:00:59.679
+because all the state is stored outside the Python process
+
+00:00:59.680 --> 00:01:01.719
+in a database. So it works great.
+
+00:01:01.720 --> 00:01:03.559
+But for other kinds of software, like
+
+00:01:03.560 --> 00:01:05.559
+let's say you're developing an Emacs package
+
+00:01:05.560 --> 00:01:07.279
+or a video game,
+
+00:01:07.280 --> 00:01:10.319
+then it can be a real pain to restart the application
+
+00:01:10.320 --> 00:01:12.679
+and recreate the state it was in before
+
+00:01:12.680 --> 00:01:17.279
+just to test the effect of each edit you want to make.
+
+00:01:17.280 --> 00:01:21.359
+Another advantage is the runtime introspection you have available.
+
+00:01:21.360 --> 00:01:22.679
+So since you're always connected
+
+00:01:22.680 --> 00:01:24.999
+to a running instance of your application,
+
+00:01:25.000 --> 00:01:27.799
+you can inspect the values of variables,
+
+00:01:27.800 --> 00:01:30.959
+you can trace functions, and all sorts of other information
+
+00:01:30.960 --> 00:01:36.279
+to help you understand your application better.
+
+00:01:36.280 --> 00:01:39.919
+And lastly, it's just a lot of fun to develop this way,
+
+00:01:39.920 --> 00:01:43.519
+or at least I find it fun developing with SLIME,
+
+00:01:43.520 --> 00:01:45.759
+so I wrote a SLIME backend for Python
+
+00:01:45.760 --> 00:01:48.799
+so I could have more fun when I'm coding in Python.
+
+00:01:48.800 --> 00:01:52.599
+As for the name swanky-python, within SLIME,
+
+00:01:52.600 --> 00:01:56.279
+swank is the name of the Common Lisp backend
+
+00:01:56.280 --> 00:01:59.199
+that runs within your Common Lisp application
+
+00:01:59.200 --> 00:02:02.919
+and connects to Emacs. So I'm not too creative.
+
+00:02:02.920 --> 00:02:07.999
+swanky-python is just a swank implementation in Python.
+
+NOTE Demo
+
+00:02:08.000 --> 00:02:15.279
+So let's see it in action. So we started up with M-x slime.
+
+00:02:15.280 --> 00:02:19.639
+And what that does is it starts a Python process,
+
+00:02:19.640 --> 00:02:25.039
+starts swanky-python within it, and connects to it from Emacs.
+
+00:02:25.040 --> 00:02:29.039
+And you can configure how exactly it runs Python.
+
+00:02:29.040 --> 00:02:32.479
+Or you can start swanky python manually
+
+00:02:32.480 --> 00:02:35.119
+within a Python application running on a remote server
+
+00:02:35.120 --> 00:02:36.313
+and forward the port locally
+
+00:02:36.614 --> 00:02:40.919
+and connect to it in Emacs, from Emacs remotely.
+
+00:02:40.920 --> 00:02:43.239
+Within the README, there's more documentation
+
+00:02:43.240 --> 00:02:45.519
+on other ways to start it.
+
+00:02:45.520 --> 00:02:52.159
+But just M-x slime is the basic way that works most of the time.
+
+00:02:52.160 --> 00:02:55.759
+So within the REPL, the first thing you'll notice is that
+
+00:02:55.760 --> 00:02:58.839
+REPL outputs are clickable buttons,
+
+00:02:58.840 --> 00:03:02.119
+what SLIME calls presentations.
+
+00:03:02.120 --> 00:03:04.759
+So you can do things like inspect them.
+
+00:03:04.760 --> 00:03:09.759
+And for each presentation, in the Python backend,
+
+00:03:09.760 --> 00:03:12.479
+it holds on to the reference to the object.
+
+00:03:12.480 --> 00:03:14.559
+So for an int, it's not too interesting,
+
+00:03:14.560 --> 00:03:20.239
+but let's do a more complex object like a file.
+
+00:03:20.240 --> 00:03:22.519
+Then we can inspect the file.
+
+00:03:22.520 --> 00:03:26.599
+We can describe it, which will bring up documentation
+
+00:03:26.600 --> 00:03:33.759
+on that class. We can use it in further expressions
+
+00:03:33.760 --> 00:03:39.431
+like if we copy it, it will use the actual Python object
+
+00:03:39.432 --> 00:03:43.399
+in this expression.
+
+00:03:43.400 --> 00:03:48.319
+We can assign it to a variable.
+
+00:03:48.320 --> 00:03:50.999
+SLIME uses presentations everywhere
+
+00:03:51.000 --> 00:03:53.239
+that a Python object would be displayed.
+
+00:03:53.240 --> 00:03:56.559
+So instead of just their string representation,
+
+00:03:56.560 --> 00:04:00.239
+when you have a backtrace on an exception,
+
+00:04:00.240 --> 00:04:03.965
+or you... within the inspector or anywhere else really,
+
+00:04:03.966 --> 00:04:06.019
+anywhere that the string representation
+
+00:04:06.020 --> 00:04:07.940
+of an object would be displayed,
+
+00:04:07.941 --> 00:04:10.740
+it displays a presentation that you can go on to
+
+00:04:10.741 --> 00:04:14.960
+inspect, reuse, or send to the REPL and so on.
+
+00:04:14.961 --> 00:04:23.039
+One useful utility function is pp for print presentation.
+
+00:04:23.040 --> 00:04:25.119
+We haven't imported it yet.
+
+00:04:25.120 --> 00:04:29.159
+So when we get a name error exception
+
+00:04:29.160 --> 00:04:33.879
+and SLIME sees that that name is available for import somewhere,
+
+00:04:33.880 --> 00:04:38.279
+it'll give us the option of importing it.
+
+00:04:38.280 --> 00:04:40.599
+Since it's available for import from multiple modules,
+
+00:04:40.600 --> 00:04:43.919
+it'll prompt us for which one we want to import it from.
+
+00:04:43.920 --> 00:04:45.519
+We want to import it from swanky-python,
+
+00:04:45.520 --> 00:04:48.479
+not from the standard library.
+
+00:04:48.480 --> 00:04:52.599
+Then it will print a presentation of that object.
+
+00:04:52.600 --> 00:04:55.559
+Within the REPL, this is not really useful
+
+00:04:55.560 --> 00:04:58.919
+because all REPL outputs are already presentations.
+
+00:04:58.920 --> 00:05:02.799
+But I use this now whenever I would use print debugging,
+
+00:05:02.800 --> 00:05:05.639
+just whenever I would use insert print statements in my program
+
+00:05:05.640 --> 00:05:08.399
+to see what's going on, I have it print a presentation
+
+00:05:08.400 --> 00:05:11.199
+because that way I can go back and inspect it later,
+
+00:05:11.200 --> 00:05:16.599
+copy it to the REPL and further manipulate it and so on.
+
+NOTE Inspector
+
+00:05:16.600 --> 00:05:20.119
+Next up, let's look at the inspector more.
+
+00:05:20.120 --> 00:05:25.579
+If we go back and inspect the file object,
+
+00:05:25.580 --> 00:05:27.239
+you can write custom inspector views
+
+00:05:27.240 --> 00:05:28.839
+for different kinds of objects.
+
+00:05:28.840 --> 00:05:32.519
+So far, I just have a couple. One for sequences,
+
+00:05:32.520 --> 00:05:36.919
+one for mappings, and one for every other kind of object.
+
+00:05:36.920 --> 00:05:45.979
+Like if we inspect a mapping, there's a shortcut
+
+00:05:45.980 --> 00:05:48.639
+inspect last result, which is what I normally use
+
+00:05:48.640 --> 00:05:52.379
+to open the inspector. Then we see the values,
+
+00:05:52.380 --> 00:05:56.319
+and each value in the inspector is a presentation
+
+00:05:56.320 --> 00:05:58.419
+that we can go on to inspect, and so on.
+
+00:05:58.420 --> 00:06:03.979
+Let's go back to inspecting the file object.
+
+00:06:03.980 --> 00:06:06.039
+Again, we can inspect each of the values,
+
+00:06:06.040 --> 00:06:10.239
+we can copy them back to the REPL and so on.
+
+00:06:10.240 --> 00:06:13.839
+It just displays all the attributes for the class
+
+00:06:13.840 --> 00:06:15.399
+and their values.
+
+00:06:15.400 --> 00:06:18.119
+We can configure what attributes we want to show.
+
+00:06:18.120 --> 00:06:21.119
+There's a transient menu where we can toggle
+
+00:06:21.120 --> 00:06:23.359
+if we want to show private attributes, dunder attributes,
+
+00:06:23.360 --> 00:06:26.439
+doc strings, so on, or everything,
+
+00:06:26.440 --> 00:06:28.519
+which is a bit much to show by default.
+
+00:06:28.520 --> 00:06:33.719
+So we'll reset it to the default.
+
+00:06:33.720 --> 00:06:37.839
+In the future, I want to add graphical inspector views
+
+00:06:37.840 --> 00:06:40.679
+for different kinds of objects, and also support
+
+00:06:40.680 --> 00:06:42.999
+showing plots in both the inspector and the REPL,
+
+00:06:43.000 --> 00:06:47.719
+but that's future work I haven't started on yet.
+
+NOTE Evaluating Python
+
+00:06:47.720 --> 00:06:51.999
+Let's look at the different options for evaluating Python.
+
+00:06:52.000 --> 00:06:59.099
+So we can evaluate a whole file.
+
+00:06:59.100 --> 00:07:00.639
+We can evaluate just a class.
+
+00:07:00.640 --> 00:07:03.479
+We can evaluate just the method we're working on.
+
+00:07:03.480 --> 00:07:06.359
+We can evaluate a Python statement,
+
+00:07:06.360 --> 00:07:11.839
+and it will show the result in an overlay next to the cursor.
+
+00:07:11.840 --> 00:07:17.919
+We can select some code and just evaluate the highlighted region.
+
+00:07:17.920 --> 00:07:24.799
+We can sync the REPL to the active file.
+
+00:07:24.800 --> 00:07:27.319
+So now everything we evaluate in the REPL will be in the
+
+00:07:27.320 --> 00:07:29.639
+context of the eval_demo module.
+
+00:07:29.640 --> 00:07:35.399
+We can also set the module that the REPL is in.
+
+00:07:35.400 --> 00:07:38.279
+We can go back to main.
+
+00:07:38.280 --> 00:07:43.679
+But let's go back to the eval_demo module for now.
+
+NOTE Updating
+
+00:07:43.680 --> 00:07:49.799
+One useful thing is when you update a class or a function,
+
+00:07:49.800 --> 00:07:54.539
+it updates old instances of that class or function.
+
+00:07:54.540 --> 00:07:58.479
+So right now, f.bar is foobar.
+
+00:07:58.480 --> 00:08:03.719
+But if we edit that class, it will actually edit the code
+
+00:08:03.720 --> 00:08:05.239
+for the old instance of that class.
+
+00:08:05.240 --> 00:08:07.599
+And that's provided by code I copied
+
+00:08:07.600 --> 00:08:12.079
+from IPython's autoreload extension.
+
+00:08:12.080 --> 00:08:14.639
+It helps when you're trying to develop in Python
+
+00:08:14.640 --> 00:08:16.498
+without having to restart the Python process
+
+00:08:16.499 --> 00:08:20.039
+whenever you make a change.
+
+00:08:20.040 --> 00:08:22.599
+Auto reload in Python is a big topic
+
+00:08:22.600 --> 00:08:26.519
+that I don't really have time to go into here,
+
+00:08:26.520 --> 00:08:29.479
+but right now it is more limited
+
+00:08:29.480 --> 00:08:32.559
+than what is done in Common Lisp.
+
+00:08:32.560 --> 00:08:35.759
+Like for example, if you have a data class in Python
+
+00:08:35.760 --> 00:08:37.619
+and you add a new field to the data class,
+
+00:08:37.620 --> 00:08:41.039
+it won't automatically update old instances
+
+00:08:41.040 --> 00:08:43.399
+of the data class with a new field.
+
+00:08:43.400 --> 00:08:46.599
+So there's more that needs to be done with that,
+
+00:08:46.600 --> 00:08:50.359
+but I am perhaps naively optimistic
+
+00:08:50.360 --> 00:08:54.279
+that Python's runtime is quite dynamic and flexible,
+
+00:08:54.280 --> 00:08:59.799
+and that I can fully implement autoreload in Python,
+
+00:08:59.800 --> 00:09:02.119
+but there's still work to be done,
+
+00:09:02.120 --> 00:09:05.419
+and it's a big topic to go into.
+
+00:09:05.420 --> 00:09:08.959
+Next up, let's look at the backtrace buffer.
+
+00:09:08.960 --> 00:09:12.839
+But as it is right now, autoreload is actually useful.
+
+00:09:12.840 --> 00:09:16.959
+I mostly develop in Python without having to restart the process
+
+00:09:16.960 --> 00:09:19.599
+and without running into issues from old state
+
+00:09:19.600 --> 00:09:22.899
+that hasn't been updated properly.
+
+NOTE Backtraces
+
+00:09:22.900 --> 00:09:25.999
+So if we go on to look at the backtrace buffer,
+
+00:09:26.000 --> 00:09:32.819
+whenever we get an exception in Python...
+
+00:09:32.820 --> 00:09:37.079
+Let's go back to it.
+
+00:09:37.080 --> 00:09:41.419
+Whenever we get an exception, it will...
+
+00:09:41.420 --> 00:09:43.698
+let's change the code so that it actually
+
+00:09:43.699 --> 00:09:49.965
+gets an exception...
+
+00:09:49.966 --> 00:09:52.519
+we will get an interactive backtrace buffer
+
+00:09:52.520 --> 00:09:57.599
+where we can browse the source code for the different stack frames
+
+00:09:57.600 --> 00:10:00.199
+and the local variables within the stack frames,
+
+00:10:00.200 --> 00:10:03.439
+which are all presentations that we can inspect and so on.
+
+00:10:04.340 --> 00:10:10.619
+We can also open a REPL in the context of any stack frame.
+
+00:10:10.620 --> 00:10:16.439
+Or we can, when we go to the source for a given stack frame,
+
+00:10:16.440 --> 00:10:20.359
+we can select some Python code and evaluate it
+
+00:10:20.360 --> 00:10:25.959
+within the context of that stack frame.
+
+00:10:25.960 --> 00:10:30.699
+One major limitation compared to SLIME for Common Lisp
+
+00:10:30.700 --> 00:10:33.759
+is that in Common Lisp, you have the option to
+
+00:10:33.760 --> 00:10:38.159
+restart or resume execution from a given stack frame
+
+00:10:38.160 --> 00:10:42.439
+after an exception happens, where in Python,
+
+00:10:42.440 --> 00:10:45.799
+what we have right now is pretty much equivalent to
+
+00:10:45.800 --> 00:10:47.159
+the postmortem debugger.
+
+00:10:47.160 --> 00:10:50.839
+You can view the state that the call stack was in
+
+00:10:50.840 --> 00:10:51.959
+at the time of the exception,
+
+00:10:51.960 --> 00:10:55.659
+but you can't actually resume execution,
+
+00:10:55.660 --> 00:10:57.559
+which you often might want to do,
+
+00:10:57.560 --> 00:10:59.919
+because when you're coding in a dynamic language,
+
+00:10:59.920 --> 00:11:01.479
+you're going to get runtime errors.
+
+00:11:01.480 --> 00:11:04.119
+So if you're writing a script that does like some sort of
+
+00:11:04.120 --> 00:11:07.999
+long-running computation or processes a ton of files
+
+00:11:08.000 --> 00:11:11.939
+and gets an exception parsing one file halfway through,
+
+00:11:11.940 --> 00:11:16.919
+normally you'd have to fix the script, and then rerun it
+
+00:11:16.920 --> 00:11:19.759
+and have it process all the same files all over again,
+
+00:11:19.760 --> 00:11:23.839
+and lose a bunch of time for every bug you run into
+
+00:11:23.840 --> 00:11:24.879
+and fix you have to make.
+
+00:11:24.880 --> 00:11:28.679
+So right now we've got a kind of mediocre workaround
+
+00:11:28.680 --> 00:11:34.019
+which is you can add the restart decorator to a function
+
+00:11:34.020 --> 00:11:37.239
+and then... where in the case of a script
+
+00:11:37.240 --> 00:11:38.879
+processing a bunch of files,
+
+00:11:38.880 --> 00:11:41.799
+you would add the restart decorator to the function
+
+00:11:41.800 --> 00:11:43.599
+that processes a single file.
+
+00:11:43.600 --> 00:11:45.439
+You'd add it to the function
+
+00:11:45.440 --> 00:11:47.879
+that represents kind of the smallest unit of work
+
+00:11:47.880 --> 00:11:50.219
+that might fail with an exception,
+
+00:11:50.220 --> 00:11:54.359
+Then, when you get an exception,
+
+00:11:54.360 --> 00:11:57.479
+you can actually edit the function.
+
+00:11:57.480 --> 00:12:01.019
+Like, if we edit it so it doesn't throw an error,
+
+00:12:01.020 --> 00:12:07.199
+and then we can resume execution,
+
+00:12:07.200 --> 00:12:12.799
+then it will return from foo using the
+
+00:12:12.800 --> 00:12:15.040
+the new version of baz,
+
+00:12:15.041 --> 00:12:18.559
+without having to run the script from the beginning again.
+
+00:12:18.560 --> 00:12:22.379
+So in the example of a script that processes a bunch of files,
+
+00:12:22.380 --> 00:12:24.299
+that would let you,
+
+00:12:24.300 --> 00:12:27.619
+as you run into files that cause an exception,
+
+00:12:27.620 --> 00:12:29.079
+fix your code to deal with it
+
+00:12:29.080 --> 00:12:31.880
+and resume execution without having to restart the script
+
+00:12:31.881 --> 00:12:33.080
+from the beginning.
+
+00:12:33.081 --> 00:12:36.120
+But this is obviously a pretty terrible hack,
+
+00:12:36.121 --> 00:12:38.840
+having to add the restart decorator to the function.
+
+00:12:38.841 --> 00:12:46.739
+I would like it to be able to restart from any function.
+
+00:12:46.740 --> 00:12:49.631
+without needing the decorator, as you can in Common Lisp,
+
+00:12:49.632 --> 00:12:54.031
+but I think that will require patching CPython
+
+00:12:54.032 --> 00:12:56.579
+and I really have no idea how to do that.
+
+00:12:56.580 --> 00:13:00.531
+So if you do know anything about CPython internals
+
+00:13:00.532 --> 00:13:03.720
+and are interested in helping, please reach out.
+
+NOTE pydumpling
+
+00:13:03.721 --> 00:13:07.119
+Another feature we have with the backtrace buffer is
+
+00:13:07.120 --> 00:13:09.079
+there's this library called PyDumpling
+
+00:13:09.080 --> 00:13:14.659
+which can serialize a traceback and store it to a file.
+
+00:13:14.660 --> 00:13:17.859
+So you can use PyDumpling with your applications running in
+
+00:13:17.860 --> 00:13:21.239
+production to serialize a traceback
+
+00:13:21.240 --> 00:13:24.899
+whenever they have an exception and save it to a file.
+
+00:13:24.900 --> 00:13:28.599
+Then you can transfer the file locally
+
+00:13:28.600 --> 00:13:38.859
+and load it into your local Emacs with slime-py-load-pydumpling.
+
+00:13:38.860 --> 00:13:41.839
+This will load the same backtrace buffer,
+
+00:13:41.840 --> 00:13:44.559
+and you see all the same local variables
+
+00:13:44.560 --> 00:13:45.759
+at the time of the exception.
+
+00:13:45.760 --> 00:13:48.199
+You can inspect them and get a REPL
+
+00:13:48.200 --> 00:13:50.999
+in the context of the stack frame.
+
+00:13:51.000 --> 00:13:54.199
+Well, this will only work for variables
+
+00:13:54.200 --> 00:13:57.619
+that can be serialized with pickle.
+
+00:13:57.620 --> 00:13:59.519
+Or actually, the library uses dill,
+
+00:13:59.520 --> 00:14:03.039
+which can serialize a bit more than pickle can.
+
+00:14:03.040 --> 00:14:10.200
+But yeah so this can help you inspect and debug errors
+
+00:14:10.201 --> 00:14:12.880
+for applications running in production remotely
+
+00:14:12.881 --> 00:14:20.059
+that you don't want to have SLIME connected to 24-7.
+
+NOTE Documentation browser
+
+00:14:20.060 --> 00:14:24.859
+Next up, let's look at the documentation browser.
+
+00:14:24.860 --> 00:14:29.919
+We can bring up documentation for any module,
+
+00:14:29.920 --> 00:14:33.079
+and all this information is generated
+
+00:14:33.080 --> 00:14:34.999
+from runtime introspection,
+
+00:14:35.000 --> 00:14:37.079
+from the doc strings for the module
+
+00:14:37.080 --> 00:14:39.159
+and the classes and so on.
+
+00:14:39.160 --> 00:14:41.879
+So you won't see documentation for libraries
+
+00:14:41.880 --> 00:14:43.159
+that you don't have actually loaded
+
+00:14:43.160 --> 00:14:45.939
+into your running Python process.
+
+00:14:45.940 --> 00:14:50.119
+Then you can go browse to classes.
+
+00:14:50.120 --> 00:14:54.719
+It'll show all the attributes, their methods, and so on.
+
+00:14:54.720 --> 00:14:57.239
+By each method to the right, it will show
+
+00:14:57.240 --> 00:15:02.599
+the base class where the method was originally inherited from.
+
+00:15:02.600 --> 00:15:09.079
+You can also bring up a screen with all the Python packages
+
+00:15:09.080 --> 00:15:14.439
+that are installed, and browse that with imenu,
+
+00:15:14.440 --> 00:15:20.359
+and bring up information on any package and so on.
+
+NOTE Thread view
+
+00:15:20.360 --> 00:15:28.499
+Next up, let's take a look at the thread view.
+
+00:15:28.500 --> 00:15:31.839
+So let's run this and then bring up the thread view
+
+00:15:31.840 --> 00:15:35.559
+and this will show information on all running threads.
+
+00:15:35.560 --> 00:15:38.799
+You can configure it to refresh after a given interval,
+
+00:15:38.800 --> 00:15:41.959
+like every second, but I don't have that set up right now,
+
+00:15:41.960 --> 00:15:45.659
+so I have to manually refresh it.
+
+00:15:45.660 --> 00:15:47.639
+Probably the most useful thing is that
+
+00:15:47.640 --> 00:15:49.739
+you can bring up a backtrace for any thread
+
+00:15:49.740 --> 00:15:51.759
+which won't pause the thread or anything,
+
+00:15:51.760 --> 00:15:53.879
+but will just give you the call stack
+
+00:15:53.880 --> 00:15:55.879
+at the time you requested the backtrace.
+
+00:15:55.880 --> 00:15:59.199
+You can again view the stack frames, local variables,
+
+00:15:59.200 --> 00:16:04.139
+open a REPL in the context of the thread, and so on.
+
+00:16:04.140 --> 00:16:07.839
+There's also a viewer for async tasks,
+
+00:16:07.840 --> 00:16:09.999
+but I'm not going to demo that right now,
+
+00:16:10.000 --> 00:16:14.159
+because for that to work, you have to start swanky-python
+
+00:16:14.160 --> 00:16:16.599
+after the async event loop has started,
+
+00:16:16.600 --> 00:16:18.519
+from within the same thread.
+
+00:16:18.520 --> 00:16:20.279
+If you go to the project readme,
+
+00:16:20.280 --> 00:16:23.919
+there's a demo of how to use the async task viewer
+
+00:16:23.920 --> 00:16:27.439
+with a fastapi project.
+
+NOTE Tracing functions
+
+00:16:27.440 --> 00:16:33.879
+Next up, let's look at tracing functions.
+
+00:16:33.880 --> 00:16:36.279
+So here we got some random error,
+
+00:16:36.280 --> 00:16:39.879
+because this is still very much a work in progress.
+
+00:16:39.880 --> 00:16:42.359
+But it looks like it executed
+
+00:16:42.360 --> 00:16:43.199
+correctly this time.
+
+00:16:43.200 --> 00:16:47.565
+So now let's mark the fibonacci function
+
+00:16:47.566 --> 00:16:50.239
+for tracing and execute it.
+
+00:16:50.240 --> 00:16:56.079
+We can see, every time the function is called,
+
+00:16:56.080 --> 00:16:58.239
+all its arguments and return values.
+
+00:16:58.240 --> 00:17:02.899
+Again, there are presentations that we can inspect and so on.
+
+00:17:02.900 --> 00:17:06.079
+But let's inspect a more complex object, like a file object.
+
+00:17:06.080 --> 00:17:11.339
+If we trace the count_lines function and run that code,
+
+00:17:11.340 --> 00:17:15.319
+then we can inspect the file it was passed, or the file object.
+
+00:17:15.320 --> 00:17:21.039
+One pitfall is that in Python, objects are mutable.
+
+00:17:21.040 --> 00:17:25.559
+So in the trace buffer, the string representation
+
+00:17:25.560 --> 00:17:27.879
+that's printed is the string representation
+
+00:17:27.880 --> 00:17:31.219
+at the time it was passed to the function.
+
+00:17:31.220 --> 00:17:32.639
+But when we go to inspect it,
+
+00:17:32.640 --> 00:17:34.919
+we're inspecting the object as it is right now,
+
+00:17:34.920 --> 00:17:37.639
+which can be different than it was at the time
+
+00:17:37.640 --> 00:17:41.559
+the function saw it. So for this file object, for example,
+
+00:17:41.560 --> 00:17:44.279
+it's closed now, when it was open at the time
+
+00:17:44.280 --> 00:17:47.799
+the function used it.
+
+NOTE AI integrations
+
+00:17:47.800 --> 00:17:50.479
+Next up, let's look at AI integrations.
+
+00:17:50.480 --> 00:17:54.519
+So if you're used to SLIME with Common Lisp,
+
+00:17:54.520 --> 00:18:09.479
+Emacs actually has a built-in AI that can help with the transition.
+
+00:18:09.480 --> 00:18:14.559
+So it's just a joke, I actually really like Python.
+
+00:18:14.560 --> 00:18:18.119
+And for more serious AI integrations,
+
+00:18:18.120 --> 00:18:19.959
+I have some ideas for the future
+
+00:18:19.960 --> 00:18:21.919
+but I haven't implemented anything yet.
+
+00:18:21.920 --> 00:18:27.319
+I think right now, people are mostly passing source code to LLMs
+
+00:18:27.320 --> 00:18:32.679
+but since we're embedded in the Python process at runtime,
+
+00:18:32.680 --> 00:18:35.639
+we have a lot of more information available,
+
+00:18:35.640 --> 00:18:39.439
+like maybe we can trace all calls to functions,
+
+00:18:39.440 --> 00:18:41.799
+and when we have a bug,
+
+00:18:41.800 --> 00:18:46.479
+we can feed the trace to the LLM,
+
+00:18:46.480 --> 00:18:48.719
+and the LLM can point out maybe
+
+00:18:48.720 --> 00:18:51.959
+when this function was called with these arguments,
+
+00:18:51.960 --> 00:18:53.879
+its return value doesn't make sense,
+
+00:18:53.880 --> 00:18:55.679
+so maybe that's the root cause of your bug.
+
+00:18:55.680 --> 00:19:02.359
+If you have any ideas of potential LLM or AI integrations,
+
+00:19:02.360 --> 00:19:05.999
+let me know. I'm happy to discuss.
+
+NOTE LSP-type features
+
+00:19:06.000 --> 00:19:09.919
+Next up, let's look at standard LSP-type features.
+
+00:19:09.920 --> 00:19:14.439
+So we've got completions. It's fuzzy completions right now,
+
+00:19:14.440 --> 00:19:16.319
+so it's showing everything with a PR in the name.
+
+00:19:16.320 --> 00:19:21.779
+We can bring up documentation for each one.
+
+00:19:21.780 --> 00:19:26.759
+When we start calling a method in the minibuffer at the bottom
+
+00:19:26.760 --> 00:19:28.859
+it'll show the signature.
+
+00:19:28.860 --> 00:19:33.719
+There's some refactoring available.
+
+00:19:33.720 --> 00:19:37.399
+We can extract a function or variable,
+
+00:19:37.400 --> 00:19:39.499
+or rename something,
+
+00:19:39.500 --> 00:19:42.919
+like, let's rename fib to fib2,
+
+00:19:42.920 --> 00:19:47.479
+and it will rename all the uses of it.
+
+00:19:47.480 --> 00:19:49.759
+All these features are based on Jedi,
+
+00:19:49.760 --> 00:19:55.399
+which is the Python library used by IPython.
+
+00:19:55.400 --> 00:19:56.999
+But as it is right now,
+
+00:19:57.000 --> 00:20:02.039
+if you want the most complete Python development experience
+
+00:20:02.040 --> 00:20:05.579
+in Emacs, I'd probably recommend using LSP
+
+00:20:05.580 --> 00:20:10.439
+for everything LSP can do, and then just using swanky-python
+
+00:20:10.440 --> 00:20:13.679
+for the object inspector and backtrace buffer,
+
+00:20:13.680 --> 00:20:15.359
+and the interactive features it has
+
+00:20:15.360 --> 00:20:18.031
+that an LSP can't provide.
+
+NOTE Wrapping up
+
+00:20:18.032 --> 00:20:23.339
+And that's it really.
+
+00:20:23.340 --> 00:20:25.865
+Shortly we'll have questions and answers
+
+00:20:25.866 --> 00:20:28.799
+as part of EmacsConf, and later on,
+
+00:20:28.800 --> 00:20:31.199
+if you have any questions, ideas, or issues
+
+00:20:31.200 --> 00:20:34.639
+feel free to reach out over email
+
+00:20:34.640 --> 00:20:37.999
+or create an issue on the repository.
+
+00:20:38.000 --> 00:20:39.331
+I should probably warn you,
+
+00:20:39.332 --> 00:20:41.119
+if you want to try out the project:
+
+00:20:41.120 --> 00:20:45.279
+so far I'm probably the only user of it
+
+00:20:45.280 --> 00:20:48.279
+and I've only tested it on my own Emacs setup,
+
+00:20:48.280 --> 00:20:50.839
+so it's quite likely you'll run into issues
+
+00:20:50.840 --> 00:20:53.479
+trying to get it installed and working.
+
+00:20:53.480 --> 00:20:56.119
+But if you do run into problems, please reach out,
+
+00:20:56.120 --> 00:20:59.279
+let me know. I'm happy to help and try and fix them.
+
+00:20:59.280 --> 00:21:03.640
+So that's it. Thanks for listening.
diff --git a/2025/info/blee-lcnt-after.md b/2025/info/blee-lcnt-after.md
index 34b771d7..8983bcf5 100644
--- a/2025/info/blee-lcnt-after.md
+++ b/2025/info/blee-lcnt-after.md
@@ -1,6 +1,707 @@
<!-- Automatically generated by emacsconf-publish-after-page -->
+<div class="transcript transcript-mainVideo"><a name="blee-lcnt-mainVideo-transcript"></a><h1>Transcript</h1>
+
+
+<div class="transcript-heading">[[!template new="1" text="""Introduction""" start="00:00:05.760" video="mainVideo-blee-lcnt" id="subtitle"]]</div>[[!template text="""Greetings. Salaam.""" start="00:00:05.760" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""This is Mohsen Banan.""" start="00:00:08.160" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""I am a software and internet engineer.""" start="00:00:10.160" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""The title of this presentation""" start="00:00:12.840" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""is &quot;Blee-LCNT: An Emacs Centered""" start="00:00:14.680" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""Content Production and Self-Publication Framework&quot;.""" start="00:00:18.840" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""Blee stands for""" start="00:00:23.660" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""ByStar Libre-Halaal Emacs Environment.""" start="00:00:25.560" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""In last year's EmacsConf,""" start="00:00:29.280" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""I introduced Blee, BISOS and ByStar""" start="00:00:31.800" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""as concepts and as foundations.""" start="00:00:36.080" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""This year I want to focus""" start="00:00:39.440" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""on one concrete capability.""" start="00:00:41.080" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""Content Production and Self-Publication""" start="00:00:43.880" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""is a foundational Blee and BISOS Capability Bundle.""" start="00:00:47.960" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""Both this presentation""" start="00:00:54.120" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""and the Nature of Polyexistentials book""" start="00:00:55.760" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""were developed with Blee-LCNT.""" start="00:00:59.080" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""In this presentation I want to look at Emacs""" start="00:01:02.880" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""as a central ingredient""" start="00:01:06.760" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""for a usage environment""" start="00:01:08.520" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""that we can use to orchestrate production of""" start="00:01:10.960" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""quite fancy multi-media presentations.""" start="00:01:14.920" video="mainVideo-blee-lcnt" id="subtitle"]]
+
+<div class="transcript-heading">[[!template new="1" text="""Scope: A complete multi-media content processing framework""" start="00:01:20.080" video="mainVideo-blee-lcnt" id="subtitle"]]</div>[[!template text="""Let's consider two different scopes.""" start="00:01:20.080" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""First, the scope of Blee-LCNT Capabilities Bundle,""" start="00:01:23.080" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""which is that of a complete""" start="00:01:27.920" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""multi-media content authorship,""" start="00:01:29.920" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""generation, publication""" start="00:01:32.600" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""and distribution framework.""" start="00:01:34.800" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""That complete scope is presented in this slide""" start="00:01:37.640" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""and it spans both black ink""" start="00:01:41.000" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""and violet ink.""" start="00:01:44.240" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""Second, the scope of this presentation,""" start="00:01:46.640" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""which is more limited.""" start="00:01:49.800" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""In this presentation I confine myself""" start="00:01:52.120" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""to the bullets is violet ink.""" start="00:01:54.920" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""Here, I focus on presentation""" start="00:01:58.520" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""and video as content types""" start="00:02:01.160" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""and their authorship and generation""" start="00:02:03.600" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""and their federated re-publication.""" start="00:02:06.000" video="mainVideo-blee-lcnt" id="subtitle"]]
+
+<div class="transcript-heading">[[!template new="1" text="""Prior art and similar art""" start="00:02:10.320" video="mainVideo-blee-lcnt" id="subtitle"]]</div>[[!template text="""This is a common topic.""" start="00:02:10.320" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""It makes good sense for us to start with""" start="00:02:12.560" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""a review of prior art and similar art.""" start="00:02:14.840" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""I went through the past EmacsConf talks""" start="00:02:19.080" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""and found a good number of them""" start="00:02:21.960" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""that also deal with the topic""" start="00:02:23.920" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""of content generation.""" start="00:02:26.000" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""A few of these are included""" start="00:02:28.840" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""in black ink in this slide.""" start="00:02:30.320" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""Many of these have chosen the Babel,""" start="00:02:33.360" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""in other words Org-Mode+LaTeX as primary input.""" start="00:02:35.600" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""I prefer the inverse of that.""" start="00:02:40.720" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""I also looked for past talks""" start="00:02:43.600" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""which have used Reveal.js and LaTeX-Beamer.""" start="00:02:45.840" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""For example, Sacha's use of Reveal.js""" start="00:02:50.000" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""is shown in violet inK.""" start="00:02:53.400" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""And Ihor's use of Beamer is in teal ink.""" start="00:02:56.960" video="mainVideo-blee-lcnt" id="subtitle"]]
+
+<div class="transcript-heading">[[!template new="1" text="""LaTeX-Beamer + Reveal.js with Blee and BISOS""" start="00:03:02.420" video="mainVideo-blee-lcnt" id="subtitle"]]</div>[[!template text="""This presentation is about a combination""" start="00:03:02.420" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""of Reveal.js and LaTeX-Beamer.""" start="00:03:05.400" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""For those who may not be familiar""" start="00:03:08.640" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""with Beamer and Reveal,""" start="00:03:10.600" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""here is a quick intro.""" start="00:03:12.620" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""Among academics, LaTeX-Beamer is the go-to tool""" start="00:03:14.800" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""for producing presentations.""" start="00:03:19.040" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""Reveal.js is recognized""" start="00:03:22.160" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""as the best of breed""" start="00:03:24.240" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""for dispensing HTML slide decks.""" start="00:03:25.920" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""For many, Reveal and Beamer""" start="00:03:29.920" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""live in different universes.""" start="00:03:32.440" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""Beamer is pdf oriented""" start="00:03:35.960" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""and Reveal is html oriented.""" start="00:03:38.680" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""Combining two powerful tools""" start="00:03:42.020" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""makes for an even more powerful tool.""" start="00:03:44.520" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""This Blee-LCNT Presentations combines""" start="00:03:48.360" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""the best of LaTeX-Beamer with Reveal.js.""" start="00:03:51.880" video="mainVideo-blee-lcnt" id="subtitle"]]
+
+<div class="transcript-heading">[[!template new="1" text="""Blee-LCNT novel concepts""" start="00:03:57.160" video="mainVideo-blee-lcnt" id="subtitle"]]</div>[[!template text="""Beamer primarily functions as producer""" start="00:03:57.160" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""and Reveal functions as dispenser""" start="00:04:00.680" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""and multi-media enhancer.""" start="00:04:03.100" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""Here is how the combination works.""" start="00:04:05.580" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""LaTeX Beamer pdf result""" start="00:04:08.300" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""is dissected into named frame images""" start="00:04:10.440" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""which can then be inserted in Reveal.js.""" start="00:04:13.840" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""LaTeX Beamer frames can also be""" start="00:04:18.800" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""translated into html with HeVeA""" start="00:04:21.240" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""which can also be inserted in Reveal.js.""" start="00:04:24.800" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""Voice-overs for Beamer frames""" start="00:04:29.000" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""can be correlated to frame names""" start="00:04:31.120" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""and applied to image or html frames.""" start="00:04:34.040" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""Screen captures and image narrations as videos""" start="00:04:37.120" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""can be directly dispensed""" start="00:04:42.080" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""through Reveal.""" start="00:04:44.360" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""There are various additional novel concepts""" start="00:04:46.380" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""with regard to the way""" start="00:04:49.440" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""that we have integrated all of this together.""" start="00:04:50.600" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""Instead of Org-Mode+LaTeX,""" start="00:04:54.560" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""we do LaTeX+Org-Mode.""" start="00:04:57.600" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""Instead of Babel, we do COMEEGA,""" start="00:05:01.000" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""instead of the Literate model""" start="00:05:04.000" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""we introduce the Surrounded model.""" start="00:05:06.000" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""You shall see various examples""" start="00:05:08.840" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""of these shortly.""" start="00:05:10.840" video="mainVideo-blee-lcnt" id="subtitle"]]
+
+<div class="transcript-heading">[[!template new="1" text="""Part of a bigger picture - part of a series""" start="00:05:12.520" video="mainVideo-blee-lcnt" id="subtitle"]]</div>[[!template text="""All of this is part of a bigger picture.""" start="00:05:12.520" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""A much bigger picture.""" start="00:05:15.640" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""My talks at EmacsConf 2021, 2022""" start="00:05:17.620" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""and 2024 are related.""" start="00:05:23.600" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""This 2025 talk builds on those.""" start="00:05:26.520" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""Last year's talk &quot;About Blee:""" start="00:05:31.400" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""enveloping our own autonomy""" start="00:05:34.720" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""directed digital ecosystem""" start="00:05:36.840" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""with Emacs&quot; in particular,""" start="00:05:39.000" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""lays the foundations for this talk.""" start="00:05:42.200" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""If you have not seen that,""" start="00:05:44.980" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""it would make good sense to review it.""" start="00:05:47.120" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""In my previous talks I have been criticized""" start="00:05:51.160" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""of having a &quot;prophetic&quot; style.""" start="00:05:54.280" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""The scope of ByStar is lofty and immense.""" start="00:05:58.360" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""In many ways it is unbelievable.""" start="00:06:02.060" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""And EmacsConf talks are meant to be short.""" start="00:06:04.880" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""So, as a result, sometimes""" start="00:06:09.140" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""I end up being cryptic.""" start="00:06:11.840" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""Having accepted the &quot;prophetic&quot; criticism""" start="00:06:13.960" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""as legitimate,""" start="00:06:17.500" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""I now need to put a book on the table.""" start="00:06:19.400" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""With that book in place, moving forward,""" start="00:06:23.600" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""when needing to be cryptic,""" start="00:06:26.840" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""I shall cite Chapter and Verse.""" start="00:06:29.340" video="mainVideo-blee-lcnt" id="subtitle"]]
+
+<div class="transcript-heading">[[!template new="1" text="""Nature of polyexistentials""" start="00:06:32.560" video="mainVideo-blee-lcnt" id="subtitle"]]</div>[[!template text="""I am delighted to announce""" start="00:06:32.560" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""the availability of my recent book,""" start="00:06:34.880" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""&quot;Nature of Polyexistentials&quot;.""" start="00:06:37.560" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""The full title of my book is:""" start="00:06:40.200" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""Nature Of Polyexistentials---""" start="00:06:42.960" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""Basis For Abolishment Of The Western""" start="00:06:45.040" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""Intellectual Property Rights Regime---""" start="00:06:48.240" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""And Introduction Of The Libre-Halaal""" start="00:06:51.220" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""ByStar Digital Ecosystem.""" start="00:06:53.900" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""Knowledge, know-how, uses of know-how,""" start="00:06:57.000" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""ideas, formulas, software and information""" start="00:06:59.200" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""are inherently non-scarce.""" start="00:07:02.880" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""They are \*polyexistentials\*.""" start="00:07:05.520" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""Unlike monoexistentials""" start="00:07:08.440" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""which exist in singular,""" start="00:07:10.240" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""polyexistentials naturally exist in multiples.""" start="00:07:12.260" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""What is abundant in nature""" start="00:07:17.540" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""is being made artificially scarce""" start="00:07:19.560" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""through man-made ownership rules""" start="00:07:22.600" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""called copyright and patents.""" start="00:07:25.400" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""These mistaken ownership rules,""" start="00:07:28.600" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""the so called Western IPR regime,""" start="00:07:31.240" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""has immense ramifications""" start="00:07:34.960" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""on the shape and the direction""" start="00:07:37.320" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""of the American Digital Ecosystem.""" start="00:07:38.840" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""It would be an understatement to say""" start="00:07:42.620" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""that the American Digital Ecosystem""" start="00:07:45.120" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""has put humanity in danger.""" start="00:07:47.780" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""Two parts of the book, in particular""" start="00:07:50.600" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""are of immediate relevance.""" start="00:07:53.100" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""Part III, the ethics layer,""" start="00:07:55.680" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""focuses on contours of cures.""" start="00:07:58.220" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""Having dismissed the Western""" start="00:08:01.120" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""intellectual property rights (IPR) regime""" start="00:08:02.840" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""as an erroneous governance model for polyexistentials,""" start="00:08:06.120" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""I propose the Libre-Halaal model""" start="00:08:11.740" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""of governance of polyexistentials""" start="00:08:14.320" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""towards facilitating conviviality of tools.""" start="00:08:17.200" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""Part IV, the engineering layer,""" start="00:08:22.780" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""introduces the Libre-Halaal ByStar Digital Ecosystem.""" start="00:08:25.360" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""as an ethical alternative""" start="00:08:29.600" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""to the prevailing proprietary""" start="00:08:32.400" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""American digital ecosystem.""" start="00:08:34.240" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""The book also provides additional details""" start="00:08:37.500" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""about the content generation""" start="00:08:40.480" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""and publication facilities""" start="00:08:42.920" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""that I am presenting here.""" start="00:08:44.920" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""And the book itself, as content,""" start="00:08:46.840" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""was generated and published""" start="00:08:50.080" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""using the facilities""" start="00:08:53.440" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""that I am presenting here.""" start="00:08:55.320" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""You can think of this book""" start="00:08:57.240" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""as being in two volumes.""" start="00:08:59.200" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""Our focus are Blee and BISOS in Volume II.""" start="00:09:01.160" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""Volume I deals with the general concept""" start="00:09:05.920" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""of polyexistence and invalidity""" start="00:09:10.240" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""of IPR and our terminoloy of Libre-Halaal---""" start="00:09:13.880" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""instead of the common but ill directed vocabulary""" start="00:09:18.680" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""of Free Software and Open-Source and FOSS.""" start="00:09:23.520" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""In Chapter 11, I introduce""" start="00:09:28.240" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""the very sensitive and potent vocabulary""" start="00:09:31.240" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""of Halaal and Libre-Halaal.""" start="00:09:34.760" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""The contents of this book""" start="00:09:37.720" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""belong to all of humanity""" start="00:09:39.080" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""and verbatim copying of it is unrestricted.""" start="00:09:41.660" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""If you want to read it, this book is yours.""" start="00:09:45.520" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""The &quot;Nature of Polyexistentials&quot; book""" start="00:09:49.480" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""is available both online and in print.""" start="00:09:51.840" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""This book is available as two editions.""" start="00:09:56.660" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""The US Edition and the International edition.""" start="00:09:59.440" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""The US Edition is written""" start="00:10:03.820" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""with a slightly milder Western unfriendly tone,""" start="00:10:05.960" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""while the International Edition""" start="00:10:10.080" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""includes additional original content in Farsi.""" start="00:10:12.400" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""I consider the International Edition""" start="00:10:17.620" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""to be the authoritative version.""" start="00:10:20.400" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""However, many readers in""" start="00:10:22.980" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""the US and Western countries""" start="00:10:25.320" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""may prefer the US Edition.""" start="00:10:27.320" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""I maintain separate Git repositories""" start="00:10:31.200" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""for each edition on GitHub:""" start="00:10:34.000" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""US Edition is at bxplpc/120033""" start="00:10:36.040" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""and International Edition: bxplpc/120074""" start="00:10:42.840" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""Cloning these repositories""" start="00:10:51.420" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""will give you access to the book""" start="00:10:53.680" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""in PDF format (suitable for both""" start="00:10:56.400" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""A4 and US Letter printing)""" start="00:11:00.040" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""and in EPUB format.""" start="00:11:04.040" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""Alternatively, the content""" start="00:11:06.380" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""can be downloaded directly from your browser""" start="00:11:08.560" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""without needing to clone the repositories.""" start="00:11:12.040" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""To ensure broader online""" start="00:11:17.260" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""availability and stability,""" start="00:11:19.080" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""I have also published the book on Zenodo,""" start="00:11:21.900" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""complete with a DOI (Digital Object Identifier).""" start="00:11:26.160" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""You can download both the A4""" start="00:11:31.780" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""and 8.5 x 11 PDFs from there as well.""" start="00:11:34.440" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""The book is also available in print on Amazon""" start="00:11:39.640" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""and at most major bookstores""" start="00:11:44.120" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""in the US and Western regions.""" start="00:11:46.240" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""The ISBNs for both editions""" start="00:11:49.380" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""are included in this slide.""" start="00:11:51.520" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""Additionally, I have published""" start="00:11:54.140" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""this book in Iran through Jangal Publishers.""" start="00:11:56.320" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""I did not write this book for profit.""" start="00:12:00.720" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""My aim is to share my thoughts""" start="00:12:03.080" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""and encourage readers to engage with my views and ideas.""" start="00:12:05.360" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""Your feedback is welcome,""" start="00:12:10.600" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""and I am genuinely interested""" start="00:12:12.500" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""in hearing your perspectives.""" start="00:12:14.120" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""In Western markets, I have priced the print edition""" start="00:12:17.200" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""somewhat above production costs.""" start="00:12:20.880" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""If you find value in the book""" start="00:12:24.340" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""and the ByStar project,""" start="00:12:26.640" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""purchasing a copy will help support my work.""" start="00:12:28.600" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""Thanks in advance for your support.""" start="00:12:32.760" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""And here are the same links""" start="00:12:37.460" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""as a native Reveal slide.""" start="00:12:39.480" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""If instead of a video,""" start="00:12:42.180" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""you are viewing this presentation as a Reveal web page,""" start="00:12:43.840" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""you can just click on the pointers and URLs.""" start="00:12:47.760" video="mainVideo-blee-lcnt" id="subtitle"]]
+
+<div class="transcript-heading">[[!template new="1" text="""Content processing - a ByStar/BISOS/Blee Capability Bundle (BCB)""" start="00:12:52.640" video="mainVideo-blee-lcnt" id="subtitle"]]</div>[[!template text="""Instead of the traditional model""" start="00:12:52.640" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""of giving you recipes in a DIY context""" start="00:12:55.080" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""towards the goal of creating""" start="00:12:59.560" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""content processing capabilities""" start="00:13:01.480" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""on top of what you may already have,""" start="00:13:04.560" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""I am doing the opposite.""" start="00:13:07.660" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""I am saying: take this whole BISOS and Blee thing,""" start="00:13:09.960" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""and in there you will also have""" start="00:13:15.160" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""the content processing capabilities""" start="00:13:17.560" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""that I am speaking of here.""" start="00:13:20.240" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""So, at the top level we have""" start="00:13:22.580" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""our own autonomy and privacy""" start="00:13:24.920" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""directed digital ecosystem,""" start="00:13:27.520" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""which in contrast to the center oriented""" start="00:13:30.200" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""American digital ecosystem,""" start="00:13:32.840" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""is edge oriented.""" start="00:13:35.660" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""We call it: &quot;The Libre-Halaal""" start="00:13:38.480" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""ByStar Digital Ecosystem&quot;.""" start="00:13:40.920" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""All the systems in ByStar,""" start="00:13:43.920" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""run BISOS (By\* Internet Services OS),""" start="00:13:45.800" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""which is a layer on top of Debian.""" start="00:13:50.700" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""The usage environment of ByStar and BISOS is Blee""" start="00:13:53.760" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""which is a layer on top of Emacs.""" start="00:13:58.200" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""With those in place, we then create""" start="00:14:01.580" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""a capability bundle called Blee-LCNT.""" start="00:14:04.920" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""So, when you buy into Blee and BISOS,""" start="00:14:10.140" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""you will naturally also get""" start="00:14:13.040" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""these content processing capabilities---""" start="00:14:15.200" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""without a need for any recipies or DIY effort.""" start="00:14:18.720" video="mainVideo-blee-lcnt" id="subtitle"]]
+
+<div class="transcript-heading">[[!template new="1" text="""ByStar containment hierarchy and ByStar capability bundles""" start="00:14:23.120" video="mainVideo-blee-lcnt" id="subtitle"]]</div>[[!template text="""If you were to look at the model""" start="00:14:23.120" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""that I introduced as containment hierarchies,""" start="00:14:24.880" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""it would look like this.""" start="00:14:29.120" video="mainVideo-blee-lcnt" id="subtitle"]]
+
+<div class="transcript-heading">[[!template new="1" text="""Aggregated conviviality of ByStar capabilities""" start="00:14:31.280" video="mainVideo-blee-lcnt" id="subtitle"]]</div>[[!template text="""We love Emacs and we love Unix""" start="00:14:31.280" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""because their design is convivial.""" start="00:14:33.780" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""By convivial, I am referring""" start="00:14:36.760" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""to Ivan Illich's concept""" start="00:14:39.200" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""and terminology of &quot;Tools for Conviviality&quot;.""" start="00:14:40.760" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""It was first published in 1973.""" start="00:14:45.320" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""It's a must read.""" start="00:14:48.680" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""A goal of the design""" start="00:14:50.960" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""of the ByStar Digital Ecosystem""" start="00:14:52.640" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""is to enlarge the aggregated""" start="00:14:54.800" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""conviviality of its capabilities.""" start="00:14:57.480" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""What distinguishes Blee-LCNT""" start="00:15:01.720" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""from other content processing tools and frameworks,""" start="00:15:04.720" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""is our emphasis on enhancing""" start="00:15:08.960" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""the aggregated conviviality.""" start="00:15:12.440" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""These tools let you express yourself.""" start="00:15:15.660" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""They let you be in charge.""" start="00:15:19.260" video="mainVideo-blee-lcnt" id="subtitle"]]
+
+<div class="transcript-heading">[[!template new="1" text="""Parts list: integrated components""" start="00:15:22.000" video="mainVideo-blee-lcnt" id="subtitle"]]</div>[[!template text="""Here is our parts list.""" start="00:15:22.000" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""These are the components""" start="00:15:24.500" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""that we have chosen to bring together""" start="00:15:25.840" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""towards our goal of creating convivial tools.""" start="00:15:27.960" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""In this slide, we are using black ink""" start="00:15:32.780" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""to denote exisiting tools""" start="00:15:36.040" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""and we use violet ink""" start="00:15:38.520" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""to denote pieces that we have developed""" start="00:15:41.340" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""towards cohesive integration.""" start="00:15:44.420" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""[This] video,""" start="00:15:46.560" video="mainVideo-blee-lcnt" id="subtitle"]]
+
+<div class="transcript-heading">[[!template new="1" text="""Resulting contents - output forms and formats""" start="00:15:47.868" video="mainVideo-blee-lcnt" id="subtitle"]]</div>[[!template text="""the video is just one of the outputs.""" start="00:15:47.868" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""There are other outputs as well.""" start="00:15:51.480" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""In this figure, the outputs""" start="00:15:54.500" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""are shown in the top layer.""" start="00:15:56.360" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""Using this video as an example,""" start="00:15:58.860" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""this presentation's output also include""" start="00:16:02.280" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""the &quot;Presentation Form&quot;""" start="00:16:05.600" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""and the &quot;Article-Presentation Form&quot;.""" start="00:16:07.600" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""Let's look at these more closely.""" start="00:16:11.000" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""For Presentations, there are 3 different forms.""" start="00:16:13.720" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""The Video Form, the Presentation From""" start="00:16:17.260" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""and the Article-Presentation Form.""" start="00:16:19.560" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""The Presentation Form produces both a pdf output""" start="00:16:22.820" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""and Reveal output.""" start="00:16:27.440" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""Next we will walkthrough some of the benefits""" start="00:16:29.080" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""that availability of these forms""" start="00:16:32.880" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""and formats provide.""" start="00:16:35.520" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""The video presentation that you are watching""" start="00:16:38.100" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""is just one of the outputs""" start="00:16:41.960" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""of the Blee-LCNT machinery.""" start="00:16:44.600" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""There are two PDF format outputs""" start="00:16:48.480" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""and two HTML outputs""" start="00:16:52.680" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""that are also quite useful.""" start="00:16:56.440" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""The primary output of Beamer""" start="00:16:58.860" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""is a set of slides""" start="00:17:02.120" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""that people use to give their talks with.""" start="00:17:04.240" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""Typically that's done live.""" start="00:17:10.440" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""In my case I dissect the images of each frame""" start="00:17:12.480" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""and do a voiceover on it""" start="00:17:19.180" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""and then dispense it through reveal.""" start="00:17:21.640" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""In a second, you will see that as well.""" start="00:17:28.840" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""This PDF output is very useful.""" start="00:17:33.380" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""You get the table of contents, of course,""" start="00:17:36.960" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""and in addition to that,""" start="00:17:39.280" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""Beamer generates navigations for you""" start="00:17:42.208" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""where on any part you get""" start="00:17:46.320" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""a small table of content as well.""" start="00:17:49.600" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""This is heavily used amongst academics,""" start="00:17:51.840" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""and it's a good output on its own,""" start="00:17:57.120" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""and I'm augmenting it""" start="00:18:00.960" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""in a variety of ways.""" start="00:18:03.320" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""In addition to the presentation PDF format,""" start="00:18:05.400" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""there is also an article-presentation PDF format""" start="00:18:09.720" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""which gives you the same content,""" start="00:18:15.360" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""but it gives it to you in a textual form""" start="00:18:18.800" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""with the table of content and the rest.""" start="00:18:25.160" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""This is a good form to use""" start="00:18:30.940" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""when you are giving, for example, class lectures,""" start="00:18:34.760" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""and the students often prefer this format.""" start="00:18:39.920" video="mainVideo-blee-lcnt" id="subtitle"]]
+
+<div class="transcript-heading">[[!template new="1" text="""reveal.js""" start="00:18:45.720" video="mainVideo-blee-lcnt" id="subtitle"]]</div>[[!template text="""Now for the HTML format output, the most relevant,""" start="00:18:45.720" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""of course, is the reveal itself.""" start="00:18:51.840" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""If you have not used reveal before,""" start="00:18:55.600" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""in my view, it's a HTML slide dispenser.""" start="00:19:05.680" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""I don't look at it as a presentation framework.""" start="00:19:10.560" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""I use, as you are seeing, we use Beamer to feed into it""" start="00:19:15.480" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""and we use it to dispense the information.""" start="00:19:22.600" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""It has all the typical navigation""" start="00:19:25.760" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""capabilities that you would expect,""" start="00:19:33.440" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""and most of what I have as slides are images,""" start="00:19:39.960" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""but occasionally, particularly when there is a need""" start="00:19:44.320" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""to provide pointers, HTML pointers,""" start="00:19:48.240" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""I then also include a textual output.""" start="00:19:53.000" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""This is also produced""" start="00:20:01.440" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""from the Beamer LaTeX source,""" start="00:20:05.560" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""but it's HTML through textual HTML,""" start="00:20:09.840" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""through HeVeA, not the image.""" start="00:20:14.960" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""You can... you get a table of contents.""" start="00:20:19.020" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""You can navigate""" start="00:20:22.500" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""and there are a whole lot of other features""" start="00:20:24.575" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""that reveal also provides.""" start="00:20:28.080" video="mainVideo-blee-lcnt" id="subtitle"]]
+
+<div class="transcript-heading">[[!template new="1" text="""Generating the video""" start="00:20:31.980" video="mainVideo-blee-lcnt" id="subtitle"]]</div>[[!template text="""So to generate the video,""" start="00:20:31.980" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""what I do is I come to""" start="00:20:35.880" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""the very beginning of the presentation.""" start="00:20:40.981" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""I turn on the screen capture recorder,""" start="00:20:49.460" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""and then I start playing""" start="00:20:51.520" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""the voiceover for each slide""" start="00:20:54.160" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""and at the very end, you get a video,""" start="00:20:58.240" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""but what you just did is you dispensed every frame,""" start="00:21:02.520" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""one at a time, through reveal.""" start="00:21:08.760" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""In addition to this HTML form,""" start="00:21:11.280" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""you also get an article presentation form of it,""" start="00:21:15.320" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""with a full table of contents""" start="00:21:22.240" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""and the videos are there, and the notes are there,""" start="00:21:24.160" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""and this is also quite useful.""" start="00:21:27.760" video="mainVideo-blee-lcnt" id="subtitle"]]
+
+<div class="transcript-heading">[[!template new="1" text="""A unified single input -- a sequencef of frames""" start="00:21:33.480" video="mainVideo-blee-lcnt" id="subtitle"]]</div>[[!template text="""Now, let's look at the one single input file""" start="00:21:33.480" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""that produced all of the outputs""" start="00:21:36.520" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""that we just saw.""" start="00:21:38.880" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""I have put both the input file""" start="00:21:39.880" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""and some of the output files""" start="00:21:43.080" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""for this presentation on Github.""" start="00:21:45.120" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""Here are some links""" start="00:21:48.300" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""to these repos and files.""" start="00:21:49.840" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""And here are the same links""" start="00:21:51.680" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""as a native Reveal slide.""" start="00:21:54.680" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""This figure gives us an overview""" start="00:21:57.120" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""of how one set of inputs""" start="00:21:59.880" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""encapsulted in a single file""" start="00:22:02.760" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""can produce all of the outputs that we saw.""" start="00:22:04.960" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""The main TeX file shown at the bottom""" start="00:22:08.760" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""is processed by both XeLaTeX and by HeVeA.""" start="00:22:11.440" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""That main TeX file, in addition""" start="00:22:15.660" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""to LaTeX syntax,""" start="00:22:18.280" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""also include org-mode constructs""" start="00:22:19.680" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""that facilitate addition of audio and video files.""" start="00:22:23.000" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""Later, I'll walkthrough the bodyPresArtEnFa.tex file""" start="00:22:27.040" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""that generated this very presentation with you.""" start="00:22:34.880" video="mainVideo-blee-lcnt" id="subtitle"]]
+
+<div class="transcript-heading">[[!template new="1" text="""Abstractions to keep in mind""" start="00:22:39.180" video="mainVideo-blee-lcnt" id="subtitle"]]</div>[[!template text="""When you construct that primary TeX file,""" start="00:22:39.180" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""there are several abstractions""" start="00:22:42.680" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""that you need to keep in mind.""" start="00:22:44.680" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""Is my presentation going to go""" start="00:22:46.900" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""from Left-To-Right or from Right-To-Left?""" start="00:22:49.120" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""Perso-Arabic presentations go from Right-To-Left.""" start="00:22:52.740" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""Another consideration is the types""" start="00:22:57.040" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""of forms of results that you want.""" start="00:22:59.680" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""Just the presentation""" start="00:23:03.120" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""or Article-Presentation as well?""" start="00:23:05.020" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""With those choices in place""" start="00:23:09.000" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""you can produce condition based text""" start="00:23:10.880" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""for each of your desired outputs.""" start="00:23:13.400" video="mainVideo-blee-lcnt" id="subtitle"]]
+
+<div class="transcript-heading">[[!template new="1" text="""Frame control types""" start="00:23:16.200" video="mainVideo-blee-lcnt" id="subtitle"]]</div>[[!template text="""Think of this video presentation""" start="00:23:16.200" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""as a sequence of frames.""" start="00:23:18.920" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""Each frame is controlled by an org-mode dynamic block.""" start="00:23:20.880" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""This table lists available dblocks""" start="00:23:26.120" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""from which you can choose.""" start="00:23:29.040" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""For example, this particular frame""" start="00:23:31.560" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""that we are watching""" start="00:23:34.040" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""is controlled by b:lcnt:pres:frame/derivedImage.""" start="00:23:34.840" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""Beamer creates a pdf file""" start="00:23:41.980" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""that includes the image of this slide.""" start="00:23:44.640" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""That image is then injected into Reveal.""" start="00:23:47.880" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""And in the end, a video of that image is produced""" start="00:23:51.460" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""with the narrations""" start="00:23:55.360" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""that I am uttering right now.""" start="00:23:57.240" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""All of this has similarly been applied""" start="00:23:59.260" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""to each and every frame""" start="00:24:02.200" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""that you have been watching.""" start="00:24:03.600" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""Similar to Frame Controls,""" start="00:24:05.920" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""there are org-mode dynamic blocks""" start="00:24:08.400" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""for &quot;Frame Body Types&quot;.""" start="00:24:10.720" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""You can easily insert an image""" start="00:24:13.520" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""which is typically created by OpenOffice Draw""" start="00:24:15.840" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""into a frame.""" start="00:24:19.640" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""Same with say a screen capture video.""" start="00:24:21.620" video="mainVideo-blee-lcnt" id="subtitle"]]
+
+<div class="transcript-heading">[[!template new="1" text="""How outputs are generate from the inputs""" start="00:24:24.360" video="mainVideo-blee-lcnt" id="subtitle"]]</div>[[!template text="""Now that we have looked at the &quot;Outputs&quot; and the &quot;Inputs&quot;,""" start="00:24:24.360" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""let's look at how the Outputs""" start="00:24:29.320" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""are generated from the Inputs.""" start="00:24:31.680" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""Let's bootstrap Raw-BISOS and Raw-Blee.""" start="00:24:35.920" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""Starting from scratch,""" start="00:24:39.400" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""get yourself a fresh copy of Debian 12.""" start="00:24:41.720" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""Then go to https://github.com/bxGenesis/start .""" start="00:24:45.800" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""The README.org file""" start="00:24:52.720" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""of that github repo""" start="00:24:55.080" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""is same as Chapter 18,""" start="00:24:57.120" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""&quot;Engineering Adoption of BISOS and ByStar&quot; of the book.""" start="00:24:58.640" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""We will next run &quot;raw-bisos.sh&quot;,""" start="00:25:01.960" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""but prior to that, let's take a quick look.""" start="00:25:05.360" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""This bootstrap scripts will do a lot as root""" start="00:25:09.960" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""on your Fresh-Debian.""" start="00:25:14.760" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""It is best to first try it""" start="00:25:16.480" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""on a disposable VM.""" start="00:25:18.600" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""raw-bisos.sh adds the current debian user to sudoers.""" start="00:25:21.180" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""Then it installs pipx.""" start="00:25:27.160" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""And then with pipx it installs""" start="00:25:30.400" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""from PyPI bisos.provision.""" start="00:25:34.200" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""bisos.provision includes additional bash scripts""" start="00:25:38.000" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""that are then executed.""" start="00:25:43.280" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""Full installation involves""" start="00:25:45.360" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""setting up various accounts, groups,""" start="00:25:48.160" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""various directory hierarchies,""" start="00:25:51.040" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""lots of apt packages""" start="00:25:53.280" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""and lots of python packages""" start="00:25:55.440" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""from the bisos namespace.""" start="00:25:57.980" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""If you are ready, copy and paste""" start="00:26:01.500" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""this line and run it.""" start="00:26:03.880" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""You will be prompted""" start="00:26:06.600" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""for the root password.""" start="00:26:08.040" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""Then be patient.""" start="00:26:09.620" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""Full installation""" start="00:26:11.280" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""can take 15 minutes or so.""" start="00:26:12.560" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""The logs of this script""" start="00:26:14.520" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""are also captured""" start="00:26:17.080" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""in ~/raw-bisos-${dateTag}-log.org""" start="00:26:18.520" video="mainVideo-blee-lcnt" id="subtitle"]]
+
+<div class="transcript-heading">[[!template new="1" text="""Context for unified source walkthrough""" start="00:26:25.200" video="mainVideo-blee-lcnt" id="subtitle"]]</div>[[!template text="""Now that we have Raw-BISOS and Raw-Blee installed,""" start="00:26:25.200" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""we are ready to walk through""" start="00:26:28.960" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""the unified source""" start="00:26:31.040" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""of the very presentation""" start="00:26:32.320" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""that you are watching.""" start="00:26:34.440" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""The &quot;bodyPresArtEnFa.tex&quot; file""" start="00:26:36.260" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""that we will visit""" start="00:26:40.960" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""is in COMEEGA-LaTeX syntax""" start="00:26:42.440" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""with lots of org-mode dblocks""" start="00:26:45.060" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""which generate Beamer-LaTeX frames""" start="00:26:47.700" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""and conditioned LaTeX bodies.""" start="00:26:50.480" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""After the walkthrough,""" start="00:26:54.140" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""I'll describe dblocks and COMEEGA in more detail.""" start="00:26:55.600" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""At the tail end of the walkthrough,""" start="00:27:00.360" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""we will also go through the generation process""" start="00:27:02.240" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""which runs XeLaTeX and HeVeA and a lot more.""" start="00:27:05.320" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""Let's look at our input file.""" start="00:27:10.860" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""It's a LaTeX file in LaTeX mode,""" start="00:27:13.620" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""and it has org syntax org-mode included in it,""" start="00:27:17.020" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""and I can toggle between LaTeX and org-mode.""" start="00:27:24.280" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""So, now I'm gonna be in org-mode,""" start="00:27:29.560" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""and org-mode gives me everything""" start="00:27:33.600" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""that org has to offer,""" start="00:27:37.840" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""including a very convenient navigation framework.""" start="00:27:39.400" video="mainVideo-blee-lcnt" id="subtitle"]]
+
+<div class="transcript-heading">[[!template new="1" text="""One slide""" start="00:27:46.480" video="mainVideo-blee-lcnt" id="subtitle"]]</div>[[!template text="""Let's take one slide and take a look at how it was done.""" start="00:27:46.480" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""So I would come to this scope slide""" start="00:27:54.280" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""and while I am there, I'm going to click on N.""" start="00:27:58.680" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""N takes me to the native LaTeX form back,""" start="00:28:04.000" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""so that I'll be looking at it not in org, but in LaTeX.""" start="00:28:09.760" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""So we're back in LaTeX, and as you can see""" start="00:28:16.360" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""it uses a dynamic block""" start="00:28:22.907" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""starting with the comments and the BEGIN,""" start="00:28:26.000" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""and it uses a dynamic block""" start="00:28:30.800" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""named a framedDrive image,""" start="00:28:34.840" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""which means the content of this frame""" start="00:28:38.080" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""will be dispensed as an image, not as text,""" start="00:28:45.400" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""and it also automatically creates for me""" start="00:28:50.440" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""a name, a label, that can be used""" start="00:28:56.900" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""for voiceover augmentation.""" start="00:29:00.440" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""So a file in the audio directory""" start="00:29:05.120" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""called ScopeOfBleeLcnt.mp3""" start="00:29:08.120" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""is this audio that will come on top of this slide""" start="00:29:13.040" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""and then the rest is the LaTeX itself.""" start="00:29:19.320" video="mainVideo-blee-lcnt" id="subtitle"]]
+
+<div class="transcript-heading">[[!template new="1" text="""Dynamic blocks""" start="00:29:24.080" video="mainVideo-blee-lcnt" id="subtitle"]]</div>[[!template text="""The concept of &quot;Org Dynamic Blocks&quot;""" start="00:29:24.080" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""is very powerful.""" start="00:29:29.680" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""I think of them as universal""" start="00:29:31.520" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""visible macros.""" start="00:29:33.600" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""But, why should they be primarily used in just Org-Mode?""" start="00:29:35.180" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""I say, let's generalize them""" start="00:29:41.360" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""to &quot;Emacs Dynamic Blocks&quot;.""" start="00:29:43.640" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""Have defaults for org-dblock-start-re""" start="00:29:46.060" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""in every relevant mode""" start="00:29:49.960" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""and use them everywhere.""" start="00:29:52.160" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""Blee does that.""" start="00:29:55.100" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""In COMEEGA-LaTeX, Dynamic Blocks create Frame Controls""" start="00:29:56.320" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""and insert Image and Video contents.""" start="00:30:01.720" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""Much of Blee and BISOS""" start="00:30:05.520" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""are implemented in COMEEGA.""" start="00:30:07.520" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""Almost all of our Elisp, Python, Bash""" start="00:30:09.960" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""and LaTeX work uses COMEEGA.""" start="00:30:13.600" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""COMEEGA stands for Collaborative""" start="00:30:17.200" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""Org-Mode""" start="00:30:19.300" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""Enhanced Emacs Generalized Authorship.""" start="00:30:21.680" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""It is the inverse of org-babel.""" start="00:30:24.760" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""COMEEGA adds org-mode""" start="00:30:27.880" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""to your programming mode.""" start="00:30:30.000" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""Full and proper use of COMEEGA,""" start="00:30:33.100" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""requires Polymode.""" start="00:30:35.080" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""Let's call that Poly-COMEEGA.""" start="00:30:38.300" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""But Emacs's Polymode""" start="00:30:41.360" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""is work-in-progress,""" start="00:30:43.320" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""particularly now with the new tree-sitter.""" start="00:30:45.680" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""So, in the interim, my usage of COMEEGA""" start="00:30:49.200" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""has been in the form of Toggle-COMEEGA.""" start="00:30:53.200" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""Where I manually switch between""" start="00:30:55.920" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""the programming-mode and org-mode.""" start="00:30:59.480" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""For me this has proved to be""" start="00:31:02.360" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""a fine interim solution.""" start="00:31:04.200" video="mainVideo-blee-lcnt" id="subtitle"]]
+
+<div class="transcript-heading">[[!template new="1" text="""Internationalization - a non-Americanist perspective""" start="00:31:05.800" video="mainVideo-blee-lcnt" id="subtitle"]]</div>[[!template text="""Naturally, content processing""" start="00:31:05.800" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""should be multi-lingual""" start="00:31:09.680" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""and internationalized.""" start="00:31:11.240" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""Let's look at that dimension.""" start="00:31:14.160" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""I am Iranian and much of what I write is in Farsi.""" start="00:31:15.840" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""Getting Perso-Arabic text right""" start="00:31:21.020" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""is often a challenge,""" start="00:31:23.520" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""as it involves Bi-Directional text (BIDI)""" start="00:31:25.520" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""and shaping of characters.""" start="00:31:30.060" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""In the context of our content generation""" start="00:31:33.000" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""these need to span all relevant tools,""" start="00:31:36.040" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""not just emacs.""" start="00:31:39.820" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""For emacs, I have created""" start="00:31:41.760" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""my own input method""" start="00:31:43.760" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""called farsi-transliterate-banan.""" start="00:31:46.240" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""My EmacsConf 2021 talk was about that.""" start="00:31:49.420" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""Now let's look at some examples""" start="00:31:54.140" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""and spice it up a bit with semantics.""" start="00:31:57.200" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""As an example of proper BIDI text,""" start="00:32:01.700" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""here is the orignal Farsi text""" start="00:32:05.280" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""along with English translation""" start="00:32:07.900" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""of Imam Khomeini's text""" start="00:32:10.360" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""with respect to invalidity""" start="00:32:12.520" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""of Western Intellectual Proprty Rights regime.""" start="00:32:15.480" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""And as another example""" start="00:32:20.400" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""of proper BIDI text,""" start="00:32:23.040" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""here is Ayatollah Mothari's take on Western IPR""" start="00:32:24.480" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""not being private property. Note that these predate""" start="00:32:29.920" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""by more than half a century""" start="00:32:35.160" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""Jack Dorsey and Elon Musk's tweets of April 11, 2025""" start="00:32:36.920" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""saying &quot;Delete all IP law&quot;.""" start="00:32:43.240" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""This topic is too important""" start="00:32:47.200" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""and too sensitive""" start="00:32:49.160" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""to be left to American billionaires""" start="00:32:50.400" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""and their tweets.""" start="00:32:53.640" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""Let me again refer you to the logic""" start="00:32:55.640" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""of polyexistentials in my book.""" start="00:32:58.200" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""Chapter 14 of the book is dedicated to""" start="00:33:00.600" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""Ethics and ownership in Religions.""" start="00:33:06.360" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""With respect to my preference""" start="00:33:08.580" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""for Ethics over Freedom,""" start="00:33:10.920" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""let me refer you to Section 12.4""" start="00:33:12.720" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""&quot;A Cynical Perspective""" start="00:33:16.520" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""on Freedom Orientation of Americans&quot;""" start="00:33:19.080" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""in which I describe where the FOSS labels""" start="00:33:22.860" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""and the likes of Stallman, Raymond,""" start="00:33:26.000" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""Moglen and Lessig have gone wrong.""" start="00:33:29.040" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""If you are one of their followers,""" start="00:33:31.600" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""perhaps Chapter 12 is for you.""" start="00:33:34.240" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""My emphasis thus far has been on content generation.""" start="00:33:36.600" video="mainVideo-blee-lcnt" id="subtitle"]]
+
+<div class="transcript-heading">[[!template new="1" text="""Autonomous self-publication and federated re-publications""" start="00:33:42.280" video="mainVideo-blee-lcnt" id="subtitle"]]</div>[[!template text="""Let's very briefly also look at""" start="00:33:42.280" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""Autonomous Self-Publication""" start="00:33:45.000" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""and Federated Re-Publications of our content.""" start="00:33:47.160" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""From the very beginning the Debian folks""" start="00:33:52.280" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""understood the importance of &quot;Universality&quot;""" start="00:33:55.760" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""and coined the &quot;Universal Debian&quot; label.""" start="00:33:59.040" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""This means that we can base""" start="00:34:03.360" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""our entire digital ecosystem""" start="00:34:05.920" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""on just the Libre-Halaal Debian distro.""" start="00:34:08.620" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""And that is what we have done with ByStar.""" start="00:34:13.500" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""In ByStar, everything is based on""" start="00:34:17.300" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""just the Universal Debian everywhere.""" start="00:34:20.040" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""This has made our Usage Environment""" start="00:34:24.120" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""totally harmonious with our Service Environment""" start="00:34:27.000" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""allowing for very powerful software-service continuums.""" start="00:34:31.320" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""Of course, all of this is immediately applicable""" start="00:34:38.060" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""to our ByStar Content Bundle as well.""" start="00:34:41.480" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""Some have asked, why don't you also include Ubuntu?""" start="00:34:46.020" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""I think the opposite makes more sense.""" start="00:34:50.520" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""Ubuntu should converge with Debian.""" start="00:34:53.680" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""I tried to explain this to Mark Shuttleworth""" start="00:34:56.700" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""in an email a while back.""" start="00:34:59.640" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""I have included that email""" start="00:35:02.480" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""in Section 12.1.5.""" start="00:35:04.120" video="mainVideo-blee-lcnt" id="subtitle"]]
+
+<div class="transcript-heading">[[!template new="1" text="""Ingredients of BISOS platforms and their progression""" start="00:35:07.720" video="mainVideo-blee-lcnt" id="subtitle"]]</div>[[!template text="""In this presentation, we have stopped""" start="00:35:07.720" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""at the &quot;Raw-BISOS&quot; stage.""" start="00:35:10.440" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""We can further evolve Raw-BISOS""" start="00:35:13.160" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""and make it be &quot;Sited&quot;""" start="00:35:15.760" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""and provide autonomous publication services.""" start="00:35:17.960" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""But here by going through EmacsConf and youtube""" start="00:35:22.240" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""we are using the &quot;Federated Re-Publications&quot; model.""" start="00:35:25.680" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""Something this large,""" start="00:35:30.960" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""should be well documented.""" start="00:35:32.480" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""In Emacs, the way that""" start="00:35:35.480" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""we have been dealing with documentation""" start="00:35:37.080" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""and information retrieval is archaic.""" start="00:35:39.320" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""Man-pages, TeXInfo, Helpful-Mode""" start="00:35:43.440" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""and convention based Doc-Strings are old and limited.""" start="00:35:46.080" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""In BISOS and Blee, we use Blee-Panels""" start="00:35:51.600" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""for all kinds of documentation.""" start="00:35:55.280" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""Let me show you some examples.""" start="00:35:57.740" video="mainVideo-blee-lcnt" id="subtitle"]]
+
+<div class="transcript-heading">[[!template new="1" text="""Moving forward""" start="00:36:02.560" video="mainVideo-blee-lcnt" id="subtitle"]]</div>[[!template text="""So, what next?""" start="00:36:02.560" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""If Blee, BISOS, ByStar, Libre-Halaal, Polyexistentials""" start="00:36:05.200" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""and these Content Processing capabilities""" start="00:36:10.600" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""have piqued your interest,""" start="00:36:14.160" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""please feel welcome to contact me.""" start="00:36:16.640" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""These Emacs Conferences have proven""" start="00:36:19.380" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""to be very useful and productive.""" start="00:36:22.240" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""I look forward to your thoughts,""" start="00:36:25.380" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""feedback and questions.""" start="00:36:27.200" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""I want to thank all the EmacsConf 2025 Organizers""" start="00:36:29.600" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""for their great work,""" start="00:36:35.360" video="mainVideo-blee-lcnt" id="subtitle"]]
+[[!template text="""and Sacha in particular.""" start="00:36:37.200" video="mainVideo-blee-lcnt" id="subtitle"]]
+
+</div>
+
+Captioner: mohsen
+
Questions or comments? Please e-mail [emacsconf-org-private@gnu.org](mailto:emacsconf-org-private@gnu.org?subject=Comment%20for%20EmacsConf%202023%20blee-lcnt%3A%20Blee-LCNT%3A%20An%20Emacs-centered%20content%20production%20and%20self-publication%20framework)
diff --git a/2025/info/blee-lcnt-before.md b/2025/info/blee-lcnt-before.md
index 1fb81a7a..10cb406b 100644
--- a/2025/info/blee-lcnt-before.md
+++ b/2025/info/blee-lcnt-before.md
@@ -8,12 +8,39 @@ The following image shows where the talk is in the schedule for Sat 2025-12-06.
Format: 37-min talk ; Q&A: BigBlueButton conference room <https://media.emacsconf.org/2025/current/bbb-blee-lcnt.html> Etherpad: <https://pad.emacsconf.org/2025-blee-lcnt>
Etherpad: <https://pad.emacsconf.org/2025-blee-lcnt>
Discuss on IRC: [#emacsconf-gen](https://chat.emacsconf.org/?join=emacsconf,emacsconf-gen)
-Status: Ready to stream
+Status: Now playing on the conference livestream
<div>Times in different time zones:</div><div class="times" start="2025-12-06T18:35:00Z" end="2025-12-06T19:15:00Z"><div class="conf-time">Saturday, Dec 6 2025, ~1:35 PM - 2:15 PM EST (US/Eastern)</div><div class="others"><div>which is the same as:</div>Saturday, Dec 6 2025, ~12:35 PM - 1:15 PM CST (US/Central)<br />Saturday, Dec 6 2025, ~11:35 AM - 12:15 PM MST (US/Mountain)<br />Saturday, Dec 6 2025, ~10:35 AM - 11:15 AM PST (US/Pacific)<br />Saturday, Dec 6 2025, ~6:35 PM - 7:15 PM UTC <br />Saturday, Dec 6 2025, ~7:35 PM - 8:15 PM CET (Europe/Paris)<br />Saturday, Dec 6 2025, ~8:35 PM - 9:15 PM EET (Europe/Athens)<br />Sunday, Dec 7 2025, ~12:05 AM - 12:45 AM IST (Asia/Kolkata)<br />Sunday, Dec 7 2025, ~2:35 AM - 3:15 AM +08 (Asia/Singapore)<br />Sunday, Dec 7 2025, ~3:35 AM - 4:15 AM JST (Asia/Tokyo)</div></div><div><strong><a href="/2025/watch/gen/">Find out how to watch and participate</a></strong></div>
+<div class="vid mainVideo"><video controls preload="none" id="mainVideo-blee-lcnt"><source src="https://media.emacsconf.org/2025/emacsconf-2025-blee-lcnt--bleelcnt-an-emacscentered-content-production-and-selfpublication-framework--mohsen-banan--main.webm" />captions="""<track label="English" kind="captions" srclang="en" src="/2025/captions/emacsconf-2025-blee-lcnt--bleelcnt-an-emacscentered-content-production-and-selfpublication-framework--mohsen-banan--main.vtt" default />"""<track kind="chapters" label="Chapters" src="/2025/captions/emacsconf-2025-blee-lcnt--bleelcnt-an-emacscentered-content-production-and-selfpublication-framework--mohsen-banan--main--chapters.vtt" /><p><em>Your browser does not support the video tag. Please download the video instead.</em></p></video>[[!template id="chapters" vidid="mainVideo-blee-lcnt" data="""
+00:05.760 Introduction
+01:20.080 Scope: A complete multi-media content processing framework
+02:10.320 Prior art and similar art
+03:02.420 LaTeX-Beamer + Reveal.js with Blee and BISOS
+03:57.160 Blee-LCNT novel concepts
+05:12.520 Part of a bigger picture - part of a series
+06:32.560 Nature of polyexistentials
+12:52.640 Content processing - a ByStar/BISOS/Blee Capability Bundle (BCB)
+14:23.120 ByStar containment hierarchy and ByStar capability bundles
+14:31.280 Aggregated conviviality of ByStar capabilities
+15:22.000 Parts list: integrated components
+15:47.868 Resulting contents - output forms and formats
+18:45.720 reveal.js
+20:31.980 Generating the video
+21:33.480 A unified single input -- a sequencef of frames
+22:39.180 Abstractions to keep in mind
+23:16.200 Frame control types
+24:24.360 How outputs are generate from the inputs
+26:25.200 Context for unified source walkthrough
+27:46.480 One slide
+29:24.080 Dynamic blocks
+31:05.800 Internationalization - a non-Americanist perspective
+33:42.280 Autonomous self-publication and federated re-publications
+35:07.720 Ingredients of BISOS platforms and their progression
+36:02.560 Moving forward
+"""]]<div></div>Duration: 36:41 minutes<div class="files resources"><ul><li><a href="https://pad.emacsconf.org/2025-blee-lcnt">Open Etherpad</a></li><li><a href="https://media.emacsconf.org/2025/current/bbb-blee-lcnt.html">Open public Q&A</a></li><li><a href="https://media.emacsconf.org/2025/emacsconf-2025-blee-lcnt--bleelcnt-an-emacscentered-content-production-and-selfpublication-framework--mohsen-banan--intro.vtt">Download --intro.vtt</a></li><li><a href="https://media.emacsconf.org/2025/emacsconf-2025-blee-lcnt--bleelcnt-an-emacscentered-content-production-and-selfpublication-framework--mohsen-banan--intro.webm">Download --intro.webm</a></li><li><a href="https://media.emacsconf.org/2025/emacsconf-2025-blee-lcnt--bleelcnt-an-emacscentered-content-production-and-selfpublication-framework--mohsen-banan--main--chapters.vtt">Download --main--chapters.vtt</a></li><li><a href="https://media.emacsconf.org/2025/emacsconf-2025-blee-lcnt--bleelcnt-an-emacscentered-content-production-and-selfpublication-framework--mohsen-banan--main.opus">Download --main.opus (32MB)</a></li><li><a href="https://media.emacsconf.org/2025/emacsconf-2025-blee-lcnt--bleelcnt-an-emacscentered-content-production-and-selfpublication-framework--mohsen-banan--main.png">Download --main.png</a></li><li><a href="https://media.emacsconf.org/2025/emacsconf-2025-blee-lcnt--bleelcnt-an-emacscentered-content-production-and-selfpublication-framework--mohsen-banan--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2025/emacsconf-2025-blee-lcnt--bleelcnt-an-emacscentered-content-production-and-selfpublication-framework--mohsen-banan--main.webm">Download --main.webm (97MB)</a></li><li><a href="https://media.emacsconf.org/2025/emacsconf-2025-blee-lcnt--bleelcnt-an-emacscentered-content-production-and-selfpublication-framework--mohsen-banan--script.txt">Download --script.txt</a></li><li><a href="https://media.emacsconf.org/2025/emacsconf-2025-blee-lcnt--bleelcnt-an-emacscentered-content-production-and-selfpublication-framework--mohsen-banan--split.txt">Download --split.txt</a></li><li><a href="https://media.emacsconf.org/2025/emacsconf-2025-blee-lcnt--bleelcnt-an-emacscentered-content-production-and-selfpublication-framework--mohsen-banan--split.vtt">Download --split.vtt</a></li><li><a href="https://youtu.be/49e0ES-nk0k">View on Youtube</a></li></ul></div></div>
# Description
<!-- End of emacsconf-publish-before-page --> \ No newline at end of file
diff --git a/2025/info/calc-after.md b/2025/info/calc-after.md
index 3dbaf680..7c0f6ebf 100644
--- a/2025/info/calc-after.md
+++ b/2025/info/calc-after.md
@@ -1,6 +1,313 @@
<!-- Automatically generated by emacsconf-publish-after-page -->
+<div class="transcript transcript-mainVideo"><a name="calc-mainVideo-transcript"></a><h1>Transcript</h1>
+
+
+<div class="transcript-heading">[[!template new="1" text="""Introduction""" start="00:00:03.620" video="mainVideo-calc" id="subtitle"]]</div>[[!template text="""Hello, my name is Christopher Howard and welcome to my talk.""" start="00:00:03.620" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""This is basically an introduction""" start="00:00:08.800" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""to the built-in Emacs calculator,""" start="00:00:11.320" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""properly known as Emacs Calc,""" start="00:00:15.120" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""particularly from the perspective of someone""" start="00:00:18.320" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""with a technical background such as engineering or electronics.""" start="00:00:21.440" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""I will say, though, my personal interest is not really""" start="00:00:27.560" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""in digital computing or digital calculators,""" start="00:00:32.880" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""but lately has been focused more on analog computing.""" start="00:00:37.840" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""I have, for example, been working to master""" start="00:00:42.520" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""the venerable slide rule, a mechanical computer""" start="00:00:46.800" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""that calculates multiplication powers and logarithms.""" start="00:00:50.840" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""Here's a picture of one.""" start="00:00:57.320" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""It's a physical tool that was used for hundreds of years""" start="00:01:02.200" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""for this sort of thing""" start="00:01:06.800" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""before the handheld calculator was made popular.""" start="00:01:09.000" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""And I also had a project that I did""" start="00:01:16.680" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""for a while to several months""" start="00:01:18.640" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""to build an electronic analog computer.""" start="00:01:21.120" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""A rudimentary attempt of mine, but it's functional,""" start="00:01:33.120" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""and it's basically a 1960s or 1970s style""" start="00:01:38.680" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""electronic analog computer built very much on a budget,""" start="00:01:43.400" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""but the box in the middle is the computer proper""" start="00:01:48.840" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""which has most of the components inside of it""" start="00:01:52.560" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""as well as the potentiometers for setting values,""" start="00:01:55.720" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""and an operation switch.""" start="00:02:00.200" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""There's a patch panel on the left""" start="00:02:02.040" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""for connecting the different integrators,""" start="00:02:04.400" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""amplifiers, multipliers, and so forth together.""" start="00:02:07.120" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""Then the output of the simulation is displayed""" start="00:02:11.320" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""on the oscilloscope on the right side,""" start="00:02:16.920" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""which is a digital oscilloscope.""" start="00:02:19.800" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""To be honest, I think that a talk about analog computing""" start="00:02:25.480" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""would be much more interesting""" start="00:02:28.440" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""than the talk that I'm about to give,""" start="00:02:30.200" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""but unfortunately that would be out of scope for EmacsConf.""" start="00:02:32.040" video="mainVideo-calc" id="subtitle"]]
+
+<div class="transcript-heading">[[!template new="1" text="""What is Calc?""" start="00:02:36.640" video="mainVideo-calc" id="subtitle"]]</div>[[!template text="""So instead I will talk about Emacs Calc,""" start="00:02:36.640" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""the digital calculator built into Emacs.""" start="00:02:39.920" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""Emacs Calc, while not being a replacement for software""" start="00:02:43.360" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""like GNU Octave, does have advanced calculator functionality""" start="00:02:47.520" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""that can be useful in engineering, electronics,""" start="00:02:51.480" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""or other technical applications. So I don't want to oversell it,""" start="00:02:55.040" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""but I think functionality-wise, Calc is somewhere in between""" start="00:03:00.760" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""what you'd expect of a decent scientific calculator""" start="00:03:06.480" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""and an advanced graphics calculator.""" start="00:03:12.240" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""So this talk I'll mention is not intended to be a tutorial""" start="00:03:23.940" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""but only a brief introduction to Calc.""" start="00:03:28.840" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""Please refer to the built-in Calc info manual""" start="00:03:33.840" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""for detailed instructions on how to complete operations.""" start="00:03:37.440" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""Turn off my volume here.""" start="00:03:46.740" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""The documentation for Emacs Calc is built-in,""" start="00:04:01.480" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""although on some distributions you may have to install""" start="00:04:05.720" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""the Emacs documentation separately for licensing reasons.""" start="00:04:10.440" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""Calc presents itself as a stack-based calculator""" start="00:04:24.480" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""where entries are dropped onto a stack""" start="00:04:28.600" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""and then an operation is performed on the stack entries.""" start="00:04:31.600" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""For example, I can drop 1.23 onto the stack,""" start="00:04:36.740" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""and then 8.56, and then multiply them together.""" start="00:04:42.900" video="mainVideo-calc" id="subtitle"]]
+
+<div class="transcript-heading">[[!template new="1" text="""calc-algebraic-entry""" start="00:04:54.280" video="mainVideo-calc" id="subtitle"]]</div>[[!template text="""It may present itself as a stack-based calculator,""" start="00:04:54.280" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""but indeed, Calc is also capable of accepting input""" start="00:05:01.560" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""in the more well-known algebraic format""" start="00:05:05.400" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""by using the calc-algebraic-entry command,""" start="00:05:07.740" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""which by default is bound to the apostrophe (') key.""" start="00:05:10.760" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""So you type the apostrophe key, enter the algebraic input,""" start="00:05:15.000" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""including parentheses as needed.""" start="00:05:19.760" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""For example, here's a calculation of the resonance frequency""" start="00:05:22.760" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""of a coil which has an inductance of 250 microhenries""" start="00:05:28.200" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""and 160 picofarads, taken from one of my electronics handbooks.""" start="00:05:35.040" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""The formula for that is 1 over 2 pi""" start="00:05:41.060" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""and then the square root of our inductance""" start="00:05:50.020" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""which is in this case 250 microfarads - excuse me, microhenries""" start="00:05:57.440" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""and then the capacitance is 160 picofarads.""" start="00:06:06.280" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""Small typo here.""" start="00:06:19.400" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""Now I need to evaluate that one more time,""" start="00:06:24.400" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""because pi is a symbol.""" start="00:06:26.640" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""I get about 800 kHz resonant frequency.""" start="00:06:30.920" video="mainVideo-calc" id="subtitle"]]
+
+<div class="transcript-heading">[[!template new="1" text="""calc-roll-down""" start="00:06:37.399" video="mainVideo-calc" id="subtitle"]]</div>[[!template text="""The command calc-roll-down,""" start="00:06:37.399" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""which by default is bound to the TAB key,""" start="00:06:41.680" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""will swap the top two stack entries,""" start="00:06:44.200" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""which is sometimes useful if you need to manipulate something""" start="00:06:47.920" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""that's further down the stack.""" start="00:06:51.560" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""So I can swap this around and say multiply by two""" start="00:06:57.000" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""and then put it back where it was.""" start="00:07:02.040" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""This command is also capable of rolling the entire stack.""" start="00:07:05.480" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""Say I want to shift them all around.""" start="00:07:14.040" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""This can be done by passing extra arguments""" start="00:07:18.900" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""to the calc-roll-down function.""" start="00:07:21.400" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""That's a little bit inconvenient to do manually,""" start="00:07:23.560" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""so in my init file, I defined here a key definition""" start="00:07:28.280" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""that passes in those arguments correctly.""" start="00:07:40.080" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""I attached this to shift-tab,""" start="00:07:45.760" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""so this way, I can roll the entire stack.""" start="00:07:49.180" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""Then I could change one entry here""" start="00:07:52.320" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""and then put it back where it was.""" start="00:07:56.160" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""So Calc does algebraic input.""" start="00:08:03.460" video="mainVideo-calc" id="subtitle"]]
+
+<div class="transcript-heading">[[!template new="1" text="""Advanced functions""" start="00:08:07.760" video="mainVideo-calc" id="subtitle"]]</div>[[!template text="""It also does advanced functions""" start="00:08:07.760" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""that you would expect any handheld scientific calculator,""" start="00:08:10.160" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""including trigonometric functions.""" start="00:08:15.600" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""For example, we can get the sine of a number.""" start="00:08:19.160" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""Now I'll mention here that Calc has multiple modes.""" start="00:08:25.320" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""Right now it's in degree mode.""" start="00:08:30.720" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""You can switch over to radian mode if you want.""" start="00:08:32.320" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""I'm going to put it back in degrees.""" start="00:08:38.160" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""Drop 12 degrees on the stack, and then get the sine of that.""" start="00:08:42.800" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""And then with the inverse sine function, I can put it back.""" start="00:08:49.800" video="mainVideo-calc" id="subtitle"]]
+
+<div class="transcript-heading">[[!template new="1" text="""Solving equations with calc-solve-for""" start="00:08:58.180" video="mainVideo-calc" id="subtitle"]]</div>[[!template text="""Calc also has the nifty ability to solve equations for you""" start="00:08:58.180" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""so long as the equation is not too complicated.""" start="00:09:07.520" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""This is using the calc-solve-for function.""" start="00:09:13.920" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""For example, we could enter in an equation algebraically,""" start="00:09:19.960" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""then run calc-solve-for, and we just have to tell it""" start="00:09:31.700" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""what variable we want to solve for. And there we go.""" start="00:09:36.680" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""We can do this manually as well""" start="00:09:41.000" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""just so you can see that we get the same result.""" start="00:09:43.200" video="mainVideo-calc" id="subtitle"]]
+
+<div class="transcript-heading">[[!template new="1" text="""Systems of equations""" start="00:09:54.720" video="mainVideo-calc" id="subtitle"]]</div>[[!template text="""Calc is also able to solve systems of equations.""" start="00:09:54.720" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""We can put more than one equation on the stack,""" start="00:09:57.960" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""and then solve for several variables.""" start="00:10:03.440" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""To give a technical example for this,""" start="00:10:08.960" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""I'll show you a resistor network scribble that I did recently.""" start="00:10:13.320" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""Hopefully you can see that. Basically,""" start="00:10:30.660" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""it's fairly simple, a pretty simple resistor network""" start="00:10:32.820" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""with 1 kilo ohm and 10 kilo ohm resistors,""" start="00:10:38.720" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""and using the loop methods, we are calculating the currents,""" start="00:10:42.160" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""the current in each loop, and then that current can be used""" start="00:10:48.960" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""to solve for the voltage of each individual resistor""" start="00:10:52.760" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""if we want to. So at the bottom there we have the equations""" start="00:10:58.840" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""that we come up with as we work through each loop.""" start="00:11:06.200" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""And I'm going to paste that into Calc.""" start="00:11:11.520" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""To save some time, I'm going to copy and paste that""" start="00:11:19.580" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""from my notes instead of typing it out.""" start="00:11:22.720" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""So we have two equations there on the stack""" start="00:11:34.260" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""in one stack entry. We run that calc-solve-for function again,""" start="00:11:38.260" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""and we tell it which variables we want to solve for.""" start="00:11:44.720" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""And voila! Those are our currents,""" start="00:11:49.900" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""which we can then use to get the voltages""" start="00:11:51.960" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""for the individual resistors.""" start="00:11:55.720" video="mainVideo-calc" id="subtitle"]]
+
+<div class="transcript-heading">[[!template new="1" text="""calc-find-root""" start="00:12:00.080" video="mainVideo-calc" id="subtitle"]]</div>[[!template text="""I'll just briefly mention""" start="00:12:00.080" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""that if Calc is not able to solve an equation""" start="00:12:02.000" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""with calc-solve-for,""" start="00:12:05.840" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""then you might be helped by another calc function""" start="00:12:07.780" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""called calc-find-root.""" start="00:12:10.280" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""This function basically does a manual search""" start="00:12:11.560" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""for a numerical solution to the equation.""" start="00:12:14.440" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""And there's the documentation page on that.""" start="00:12:30.200" video="mainVideo-calc" id="subtitle"]]
+
+<div class="transcript-heading">[[!template new="1" text="""Derivatives and integrals""" start="00:12:39.960" video="mainVideo-calc" id="subtitle"]]</div>[[!template text="""Calc can also solve or find derivatives of functions,""" start="00:12:39.960" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""at least the more straightforward functions.""" start="00:12:44.040" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""For a simple example,""" start="00:12:47.580" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""we can get the derivative of that""" start="00:12:49.840" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""with the derivative function.""" start="00:13:00.560" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""On the other hand, Calc is also capable of figuring out""" start="00:13:11.980" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""indefinite integrals.""" start="00:13:17.160" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""Say we put that function back on the stack,""" start="00:13:22.100" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""and this time, we call the integral function.""" start="00:13:26.860" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""There you go. Of course, you have to add""" start="00:13:32.560" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""your own constant of integration.""" start="00:13:35.080" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""For integrals that Calc cannot figure out symbolically,""" start="00:13:39.820" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""a numerical integration method is available""" start="00:13:43.400" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""through the calc-num-integral command, which is documented...""" start="00:13:46.080" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""The function documentation is available here, more or less.""" start="00:13:59.999" video="mainVideo-calc" id="subtitle"]]
+
+<div class="transcript-heading">[[!template new="1" text="""Programmable functions""" start="00:14:17.540" video="mainVideo-calc" id="subtitle"]]</div>[[!template text="""I definitely need to mention""" start="00:14:17.540" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""that Calc is capable of doing programmable functions.""" start="00:14:20.400" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""That is to say, you can program your own functions into Calc.""" start="00:14:24.760" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""There are three separate ways to do this.""" start="00:14:29.620" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""One is through a macro method""" start="00:14:32.240" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""similar to Emacs's usual keyboard macros.""" start="00:14:36.280" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""The second method is to transform an algebraic function""" start="00:14:41.540" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""into a stored function definition.""" start="00:14:46.520" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""And the third is to use Elisp directly.""" start="00:14:50.860" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""Personally, I find that the second method""" start="00:14:54.060" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""is the most practical, the most convenient and practical""" start="00:14:56.600" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""in my opinion. So I'll give a quick example of that.""" start="00:15:01.800" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""So I could... Let's say I wanted to have a function""" start="00:15:08.060" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""for calculating capacitive reactance.""" start="00:15:14.160" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""I'll define that in algebraic mode first.""" start="00:15:20.700" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""The function for that is 1 over 2 pi""" start="00:15:28.900" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""the frequency and the capacitance.""" start="00:15:33.640" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""Drop that on the stack. You see, it does automatically""" start="00:15:41.600" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""get simplified a little bit, but it's the same function.""" start="00:15:44.960" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""And then I press letters Z and F. Do that again.""" start="00:15:52.080" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""Z and F to start transforming that into a stored function.""" start="00:15:58.840" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""It asks me to select a user key, a single key press.""" start="00:16:06.240" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""I'll use the letter c.""" start="00:16:11.040" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""Then it's going to ask for a longer command name.""" start="00:16:15.480" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""I've actually defined this once before, so it prefilled in""" start="00:16:19.080" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""that command name.""" start="00:16:24.640" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""Then I need to enter which variables in the formula""" start="00:16:38.340" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""are actual arguments, rather than just symbols""" start="00:16:43.000" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""to be evaluated later. I prefer to put this in with frequency""" start="00:16:46.560" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""and the capacitance after that,""" start="00:16:52.560" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""but actually in this particular case,""" start="00:16:54.280" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""it doesn't matter at all to the mathematics.""" start="00:16:57.800" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""So, now all I have to do, that this is defined,""" start="00:17:07.340" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""is I can drop the frequency on the stack,""" start="00:17:11.400" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""which we'll say, for this example, will be 4.5 MHz,""" start="00:17:15.200" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""and then drop on the capacitance, which in this example""" start="00:17:24.400" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""will be 22 pF.""" start="00:17:32.280" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""Then I'll call the function that I just defined.""" start="00:17:40.320" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""I don't really like having to try to remember""" start="00:17:42.440" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""the short letters that I've come up with,""" start="00:17:45.240" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""so I'll just use the longer name.""" start="00:17:48.680" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""I need to evaluate one more time""" start="00:17:57.840" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""because the symbol pi is in there and not yet evaluated.""" start="00:17:59.800" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""And so if I've done that right,""" start="00:18:05.620" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""we have a capacitive reactance of about 1600 ohms.""" start="00:18:07.540" video="mainVideo-calc" id="subtitle"]]
+
+<div class="transcript-heading">[[!template new="1" text="""Plotting""" start="00:18:12.160" video="mainVideo-calc" id="subtitle"]]</div>[[!template text="""As the last feature that I'll mention here,""" start="00:18:12.160" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""Emacs Calc does have an interface with gnuplot,""" start="00:18:16.840" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""if you want to have Calc work as your graphing calculator.""" start="00:18:24.060" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""I do need to be honest and mention""" start="00:18:30.800" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""that I don't generally use it myself""" start="00:18:33.160" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""because there's another program in GNOME""" start="00:18:35.580" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""that I've found to be generally more convenient""" start="00:18:39.720" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""for the things that I want to graph quickly.""" start="00:18:43.500" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""But I think I can give you a simple example.""" start="00:18:47.400" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""So first, we need to drop a range on the stack.""" start="00:18:53.400" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""Let's say 0 to 10.""" start="00:19:00.340" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""And then we need to drop the function on the stack.""" start="00:19:06.620" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""And then I believe it's the letters g and f that graph this.""" start="00:19:11.640" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""Let's see. Yep, there we go.""" start="00:19:17.840" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""So there's our function and it looks nice.""" start="00:19:22.320" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""That was pretty easy.""" start="00:19:25.060" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""That's the fast way to do it.""" start="00:19:26.660" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""I will, as a disclaimer, mention that""" start="00:19:29.020" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""using this quick approach,""" start="00:19:32.840" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""that sometimes more complicated graphs""" start="00:19:34.160" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""will not turn out nicely,""" start="00:19:38.760" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""because by default, the resolution will be pretty low.""" start="00:19:40.000" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""That is to say it's... gnuplot is going to be""" start="00:19:44.340" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""skipping a lot of points""" start="00:19:48.120" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""and so you'll have to learn a bit more""" start="00:19:49.900" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""about how to use the interface,""" start="00:19:52.040" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""what parameters to pass if you want all your graphs""" start="00:19:55.320" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""to come out looking nice.""" start="00:19:59.520" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""So that covers all the features that I wanted to cover.""" start="00:20:03.700" video="mainVideo-calc" id="subtitle"]]
+
+<div class="transcript-heading">[[!template new="1" text="""Wish list""" start="00:20:08.800" video="mainVideo-calc" id="subtitle"]]</div>[[!template text="""I wanted to briefly mention a wish list of items""" start="00:20:08.800" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""that I'd like to see in Calc.""" start="00:20:13.280" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""One of them would be improper integrals.""" start="00:20:16.680" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""So that's like our definite integrals""" start="00:20:23.640" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""except for where a limit of integration is infinity.""" start="00:20:25.160" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""That's something that can be useful in a few applications.""" start="00:20:32.860" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""Something else that would be neat to have would be""" start="00:20:38.560" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""annotations for row entries. So for example""" start="00:20:41.080" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""if I was putting together a sum of numbers""" start="00:20:45.680" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""for, say, my monthly budget,""" start="00:20:48.820" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""let's say I was paying $2,000 for my rent""" start="00:20:53.280" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""and let's say $800 a month for my groceries,""" start="00:20:57.480" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""(a lot of kids to feed there)""" start="00:21:03.832" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""and then say another $60 for dining out, and so on,""" start="00:21:07.932" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""it would be nice if there was some way""" start="00:21:14.566" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""to put a little annotation next to each number""" start="00:21:18.260" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""so that you could remember""" start="00:21:21.320" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""what the meaning of that number was more easily.""" start="00:21:23.400" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""I actually looked into programming this into Calc myself,""" start="00:21:27.040" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""but discovered that it would require reprogramming""" start="00:21:31.200" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""quite a bit of Calc to make that work well""" start="00:21:35.920" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""across all calc functionality,""" start="00:21:41.840" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""and so, eventually, I gave up.""" start="00:21:43.480" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""But I'd still really like to have that feature.""" start="00:21:46.940" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""The final thing, though""" start="00:21:51.140" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""I think this would not necessarily belong in Calc,""" start="00:21:52.040" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""I think it would be cool if Emacs had some way""" start="00:21:54.580" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""to run numerical solutions""" start="00:21:57.920" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""for systems of differential equations,""" start="00:22:00.600" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""also known as a differential analyzer.""" start="00:22:02.600" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""So this would allow you to be able to set up simulation models""" start="00:22:06.020" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""involving systems of differential equations,""" start="00:22:09.280" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""for example, a spring mass system, or pressure temperature,""" start="00:22:11.680" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""or what have you, and then run the simulation""" start="00:22:14.880" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""using numerical approximation.""" start="00:22:18.040" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""Maybe it would be silly""" start="00:22:22.120" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""to actually put that in Calc itself,""" start="00:22:24.080" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""but a nice interface maybe to some other software,""" start="00:22:26.000" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""simple software that did that,""" start="00:22:30.340" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""an easy to use interface for that""" start="00:22:33.300" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""would be really great.""" start="00:22:35.780" video="mainVideo-calc" id="subtitle"]]
+
+<div class="transcript-heading">[[!template new="1" text="""Wrapping up""" start="00:22:38.600" video="mainVideo-calc" id="subtitle"]]</div>[[!template text="""So that's my entire talk.""" start="00:22:38.600" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""I'll just mention some information.""" start="00:22:41.801" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""If you want to learn more about me""" start="00:22:44.535" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""or things that I'm interested in,""" start="00:22:48.366" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""I do not any longer have a web presence.""" start="00:22:50.120" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""I don't have a website anymore,""" start="00:22:57.780" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""but I do have a Gemini capsule""" start="00:22:59.660" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""that I post to all the time.""" start="00:23:03.360" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""And if you can install, if you're willing to install the...""" start="00:23:07.140" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""Gemini browser known as Elpher""" start="00:23:13.880" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""into Emacs, which is available from ELPA,""" start="00:23:19.080" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""then you can browse directly to it""" start="00:23:23.699" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""and look around my Gemini capsule.""" start="00:23:27.360" video="mainVideo-calc" id="subtitle"]]
+[[!template text="""Thank you very much.""" start="00:23:31.440" video="mainVideo-calc" id="subtitle"]]
+
+</div>
+
+Captioner: sachac
+
Questions or comments? Please e-mail [christopher@librehacker.com](mailto:christopher@librehacker.com?subject=Comment%20for%20EmacsConf%202023%20calc%3A%20Basic%20Calc%20functionality%20for%20engineering%20or%20electronics)
diff --git a/2025/info/calc-before.md b/2025/info/calc-before.md
index ae994a76..28465a83 100644
--- a/2025/info/calc-before.md
+++ b/2025/info/calc-before.md
@@ -8,12 +8,27 @@ The following image shows where the talk is in the schedule for Sat 2025-12-06.
Format: 24-min talk ; Q&A: IRC <https://chat.emacsconf.org/?join=emacsconf,emacsconf-gen> Etherpad: <https://pad.emacsconf.org/2025-calc>
Etherpad: <https://pad.emacsconf.org/2025-calc>
Discuss on IRC: [#emacsconf-gen](https://chat.emacsconf.org/?join=emacsconf,emacsconf-gen)
-Status: Ready to stream
+Status: Q&A open for participation
<div>Times in different time zones:</div><div class="times" start="2025-12-06T18:00:00Z" end="2025-12-06T18:25:00Z"><div class="conf-time">Saturday, Dec 6 2025, ~1:00 PM - 1:25 PM EST (US/Eastern)</div><div class="others"><div>which is the same as:</div>Saturday, Dec 6 2025, ~12:00 PM - 12:25 PM CST (US/Central)<br />Saturday, Dec 6 2025, ~11:00 AM - 11:25 AM MST (US/Mountain)<br />Saturday, Dec 6 2025, ~10:00 AM - 10:25 AM PST (US/Pacific)<br />Saturday, Dec 6 2025, ~6:00 PM - 6:25 PM UTC <br />Saturday, Dec 6 2025, ~7:00 PM - 7:25 PM CET (Europe/Paris)<br />Saturday, Dec 6 2025, ~8:00 PM - 8:25 PM EET (Europe/Athens)<br />Saturday, Dec 6 2025, ~11:30 PM - 11:55 PM IST (Asia/Kolkata)<br />Sunday, Dec 7 2025, ~2:00 AM - 2:25 AM +08 (Asia/Singapore)<br />Sunday, Dec 7 2025, ~3:00 AM - 3:25 AM JST (Asia/Tokyo)</div></div><div><strong><a href="/2025/watch/gen/">Find out how to watch and participate</a></strong></div>
+<div class="vid mainVideo"><video controls preload="none" id="mainVideo-calc"><source src="https://media.emacsconf.org/2025/emacsconf-2025-calc--basic-calc-functionality-for-engineering-or-electronics--christopher-howard--main.webm" />captions="""<track label="English" kind="captions" srclang="en" src="/2025/captions/emacsconf-2025-calc--basic-calc-functionality-for-engineering-or-electronics--christopher-howard--main.vtt" default />"""<track kind="chapters" label="Chapters" src="/2025/captions/emacsconf-2025-calc--basic-calc-functionality-for-engineering-or-electronics--christopher-howard--main--chapters.vtt" /><p><em>Your browser does not support the video tag. Please download the video instead.</em></p></video>[[!template id="chapters" vidid="mainVideo-calc" data="""
+00:03.620 Introduction
+02:36.640 What is Calc?
+04:54.280 calc-algebraic-entry
+06:37.399 calc-roll-down
+08:07.760 Advanced functions
+08:58.180 Solving equations with calc-solve-for
+09:54.720 Systems of equations
+12:00.080 calc-find-root
+12:39.960 Derivatives and integrals
+14:17.540 Programmable functions
+18:12.160 Plotting
+20:08.800 Wish list
+22:38.600 Wrapping up
+"""]]<div></div>Duration: 23:35 minutes<div class="files resources"><ul><li><a href="https://pad.emacsconf.org/2025-calc">Open Etherpad</a></li><li><a href="https://chat.emacsconf.org/?join=emacsconf,emacsconf-gen">Open public Q&A</a></li><li><a href="https://media.emacsconf.org/2025/emacsconf-2025-calc--basic-calc-functionality-for-engineering-or-electronics--christopher-howard--intro.vtt">Download --intro.vtt</a></li><li><a href="https://media.emacsconf.org/2025/emacsconf-2025-calc--basic-calc-functionality-for-engineering-or-electronics--christopher-howard--intro.webm">Download --intro.webm</a></li><li><a href="https://media.emacsconf.org/2025/emacsconf-2025-calc--basic-calc-functionality-for-engineering-or-electronics--christopher-howard--main--chapters.vtt">Download --main--chapters.vtt</a></li><li><a href="https://media.emacsconf.org/2025/emacsconf-2025-calc--basic-calc-functionality-for-engineering-or-electronics--christopher-howard--main.opus">Download --main.opus (20MB)</a></li><li><a href="https://media.emacsconf.org/2025/emacsconf-2025-calc--basic-calc-functionality-for-engineering-or-electronics--christopher-howard--main.png">Download --main.png</a></li><li><a href="https://media.emacsconf.org/2025/emacsconf-2025-calc--basic-calc-functionality-for-engineering-or-electronics--christopher-howard--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2025/emacsconf-2025-calc--basic-calc-functionality-for-engineering-or-electronics--christopher-howard--main.webm">Download --main.webm (56MB)</a></li><li><a href="https://youtu.be/MAc6gCUHjOw">View on Youtube</a></li></ul></div></div>
# Description
<!-- End of emacsconf-publish-before-page --> \ No newline at end of file
diff --git a/2025/info/gmail-before.md b/2025/info/gmail-before.md
index 0c76e39f..a9daa85b 100644
--- a/2025/info/gmail-before.md
+++ b/2025/info/gmail-before.md
@@ -8,7 +8,7 @@ The following image shows where the talk is in the schedule for Sat 2025-12-06.
Format: 24-min talk ; Q&A: BigBlueButton conference room <https://media.emacsconf.org/2025/current/bbb-gmail.html> Etherpad: <https://pad.emacsconf.org/2025-gmail>
Etherpad: <https://pad.emacsconf.org/2025-gmail>
Discuss on IRC: [#emacsconf-gen](https://chat.emacsconf.org/?join=emacsconf,emacsconf-gen)
-Status: Now playing on the conference livestream
+Status: Q&A open for participation
<div>Times in different time zones:</div><div class="times" start="2025-12-06T15:15:00Z" end="2025-12-06T15:40:00Z"><div class="conf-time">Saturday, Dec 6 2025, ~10:15 AM - 10:40 AM EST (US/Eastern)</div><div class="others"><div>which is the same as:</div>Saturday, Dec 6 2025, ~9:15 AM - 9:40 AM CST (US/Central)<br />Saturday, Dec 6 2025, ~8:15 AM - 8:40 AM MST (US/Mountain)<br />Saturday, Dec 6 2025, ~7:15 AM - 7:40 AM PST (US/Pacific)<br />Saturday, Dec 6 2025, ~3:15 PM - 3:40 PM UTC <br />Saturday, Dec 6 2025, ~4:15 PM - 4:40 PM CET (Europe/Paris)<br />Saturday, Dec 6 2025, ~5:15 PM - 5:40 PM EET (Europe/Athens)<br />Saturday, Dec 6 2025, ~8:45 PM - 9:10 PM IST (Asia/Kolkata)<br />Saturday, Dec 6 2025, ~11:15 PM - 11:40 PM +08 (Asia/Singapore)<br />Sunday, Dec 7 2025, ~12:15 AM - 12:40 AM JST (Asia/Tokyo)</div></div><div><strong><a href="/2025/watch/gen/">Find out how to watch and participate</a></strong></div>
diff --git a/2025/info/gnus-after.md b/2025/info/gnus-after.md
index f36b6ba8..bb76010d 100644
--- a/2025/info/gnus-after.md
+++ b/2025/info/gnus-after.md
@@ -1,6 +1,462 @@
<!-- Automatically generated by emacsconf-publish-after-page -->
+<div class="transcript transcript-mainVideo"><a name="gnus-mainVideo-transcript"></a><h1>Transcript</h1>
+
+
+<div class="transcript-heading">[[!template new="1" text="""Introduction""" start="00:00:02.620" video="mainVideo-gnus" id="subtitle"]]</div>[[!template text="""Hello, my name is Amin Bandali,""" start="00:00:02.620" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""and today I'd like to talk about""" start="00:00:04.800" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""reading and writing emails in GNU Emacs""" start="00:00:06.360" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""using Gnus specifically.""" start="00:00:08.800" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""Gnus has had this sort of reputation""" start="00:00:14.320" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""of being difficult to approach and configure.""" start="00:00:16.880" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""That's understandable""" start="00:00:20.600" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""because it has many, many options""" start="00:00:23.360" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""and major and minor modes""" start="00:00:26.320" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""that interact in different ways with each other.""" start="00:00:27.680" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""And it also doesn't help that Gnus started originally""" start="00:00:30.680" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""as a newsreader""" start="00:00:35.320" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""rather than a mail client.""" start="00:00:36.360" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""So a lot of the terminology that it uses""" start="00:00:38.760" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""is also rooted in that,""" start="00:00:40.880" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""in reading and writing news.""" start="00:00:42.520" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""But nevertheless, with this video and talk,""" start="00:00:45.560" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""I hope to provide a sort""" start="00:00:48.120" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""of very quick introduction""" start="00:00:52.160" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""of starting to use Gnus""" start="00:00:55.760" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""to read and write email and send it.""" start="00:00:57.540" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""We will use Gnus' IMAP support,""" start="00:01:00.920" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""mainly because a lot of people""" start="00:01:02.680" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""these days have email accounts""" start="00:01:06.120" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""with mail service providers""" start="00:01:08.680" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""that support IMAP,""" start="00:01:10.760" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""which is an open standard.""" start="00:01:12.040" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""So it's widely available and supported""" start="00:01:14.320" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""across many different providers""" start="00:01:17.480" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""as well as mail clients or mail user agents as well.""" start="00:01:19.720" video="mainVideo-gnus" id="subtitle"]]
+
+<div class="transcript-heading">[[!template new="1" text="""Demo""" start="00:01:25.240" video="mainVideo-gnus" id="subtitle"]]</div>[[!template text="""Okay, so let's just jump straight right in.""" start="00:01:25.240" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""I will enter this demo directory that I created""" start="00:01:30.560" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""for the purposes of this demonstration""" start="00:01:34.280" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""and change my home directory to this one""" start="00:01:36.920" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""so that we can safely experiment with Gnus here.""" start="00:01:41.000" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""For this presentation, I've written up""" start="00:01:49.840" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""a quick initialization file or init file""" start="00:01:53.980" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""that I will share afterwards as well""" start="00:01:56.840" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""to get us going with Gnus.""" start="00:01:59.720" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""There's not much to it at the moment.""" start="00:02:01.640" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""Just set up the package archives and""" start="00:02:04.520" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""install the keycast package""" start="00:02:07.400" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""for showing the key presses in the mode line.""" start="00:02:09.480" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""Yeah, that's about it.""" start="00:02:14.080" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""And I'll also define""" start="00:02:15.360" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""a little like inline function +emacs.d""" start="00:02:16.240" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""that allows me to conveniently write""" start="00:02:20.280" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""and have it expanded""" start="00:02:24.080" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""or refer to files and directories, rather,""" start="00:02:26.640" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""paths that we could expand,""" start="00:02:29.301" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""inside my Emacs configuration directory.""" start="00:02:30.901" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""I also have this eval-last-sexp""" start="00:02:32.834" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""bound to a global key,""" start="00:02:37.501" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""so that I will be able to easily""" start="00:02:41.120" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""use it for this talk.""" start="00:02:43.280" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""Okay, let's jump right in.""" start="00:02:47.520" video="mainVideo-gnus" id="subtitle"]]
+
+<div class="transcript-heading">[[!template new="1" text="""Don't panic""" start="00:02:49.960" video="mainVideo-gnus" id="subtitle"]]</div>[[!template text="""First things first, don't panic.""" start="00:02:49.960" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""And that's actually also the name""" start="00:02:52.240" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""of the very first node""" start="00:02:55.268" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""in the Gnus manual when you open it.""" start="00:02:58.360" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""And it's actually nice.""" start="00:03:01.560" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""I definitely, definitely recommend""" start="00:03:02.840" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""that you look through""" start="00:03:04.480" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""at least the very first couple of chapters of this,""" start="00:03:07.080" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""skim through it, and later on refer to it""" start="00:03:10.200" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""whenever you find something confusing""" start="00:03:14.200" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""or don't understand it.""" start="00:03:16.134" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""But yeah, we'll start""" start="00:03:19.500" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""with these two paragraphs here.""" start="00:03:21.360" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""So again, a Gnus installation""" start="00:03:22.400" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""is basically just a list of one or more servers""" start="00:03:23.640" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""and the subscribed groups from those servers""" start="00:03:28.120" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""and articles in those groups.""" start="00:03:30.120" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""You can already kind of see""" start="00:03:32.320" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""where that influence of a newsreader comes in.""" start="00:03:34.280" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""But yeah, basically what it's saying is that,""" start="00:03:39.480" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""you know, we have one or more servers.""" start="00:03:41.840" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""We can think of them as email servers.""" start="00:03:43.840" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""Groups can be like, we can think""" start="00:03:47.080" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""of them as folders or directories.""" start="00:03:49.360" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""And yeah, articles,""" start="00:03:52.960" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""those would be like our email messages.""" start="00:03:55.240" video="mainVideo-gnus" id="subtitle"]]
+
+<div class="transcript-heading">[[!template new="1" text="""Configuring servers""" start="00:03:58.560" video="mainVideo-gnus" id="subtitle"]]</div>[[!template text="""With Gnus, we can add""" start="00:03:58.560" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""and configure servers mainly using two variables.""" start="00:03:59.680" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""One of them is the gnus-select-method""" start="00:04:06.120" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""and the other is gnus-secondary-select-methods.""" start="00:04:07.920" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""The first one predates the second one""" start="00:04:11.480" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""and I generally don't recommend using it, because""" start="00:04:15.760" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""first of all, it can only point""" start="00:04:17.560" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""to one server, and that server,""" start="00:04:22.560" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""because it's the primary,""" start="00:04:26.360" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""then Gnus won't add a prefix to its groups,""" start="00:04:27.880" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""so later on, as you get into""" start="00:04:32.560" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""more advanced features of Gnus""" start="00:04:34.840" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""and, for example, want to write rules""" start="00:04:36.680" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""to modify your message composition""" start="00:04:38.520" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""in a way for certain groups, or file mail,""" start="00:04:42.960" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""automatically classify mail,""" start="00:04:47.040" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""this distinction can become""" start="00:04:48.800" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""confusing and annoying.""" start="00:04:51.880" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""My recommendation is to always and only use""" start="00:04:53.960" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""the gnus-secondary-select-methods.""" start="00:04:57.200" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""Yeah, so let's do that here.""" start="00:05:01.800" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""I'm gonna uncomment this portion.""" start="00:05:07.320" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""So here, I set the primary select method to nil,""" start="00:05:10.300" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""and the second one, I define an nnimap server""" start="00:05:16.420" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""of the nnimap backend.""" start="00:05:24.160" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""I give it the name ec25gnus.""" start="00:05:30.040" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""What I want it to do is to""" start="00:05:32.440" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""connect to my mail server,""" start="00:05:35.880" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""which is at this address,""" start="00:05:37.800" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""and fetch emails from it over TLS with this username.""" start="00:05:41.080" video="mainVideo-gnus" id="subtitle"]]
+
+<div class="transcript-heading">[[!template new="1" text=""".authinfo""" start="00:05:46.240" video="mainVideo-gnus" id="subtitle"]]</div>[[!template text="""And then the passwords or the credentials,""" start="00:05:46.240" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""you can put them in the .authinfo file.""" start="00:05:50.720" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""Normally, you would want to, for example,""" start="00:05:56.840" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""encrypt this file with your GPG key.""" start="00:05:58.800" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""But for this demonstration, I haven't.""" start="00:06:03.720" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""So yeah, the format is the keyword &quot;machine&quot;""" start="00:06:06.720" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""followed by the name of your Gnus server or account,""" start="00:06:10.480" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""followed by the word &quot;login&quot;,""" start="00:06:15.240" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""then your login username,""" start="00:06:17.200" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""and then the password, which here it's not shown.""" start="00:06:19.200" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""Yeah.""" start="00:06:23.960" video="mainVideo-gnus" id="subtitle"]]
+
+<div class="transcript-heading">[[!template new="1" text="""Configuration""" start="00:06:26.600" video="mainVideo-gnus" id="subtitle"]]</div>[[!template text="""But before we actually set this,""" start="00:06:26.600" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""I'll just show you that if we like start Gnus""" start="00:06:28.680" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""with M-x gnus,""" start="00:06:31.480" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""initially, it will just show""" start="00:06:33.720" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""an error like this.""" start="00:06:36.440" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""Even if we continue, it's empty.""" start="00:06:37.760" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""There's not much because Gnus doesn't know""" start="00:06:40.400" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""where to fetch these emails from.""" start="00:06:43.400" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""And that's what we will configure.""" start="00:06:47.040" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""Excuse me.""" start="00:06:52.160" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""Yeah, so just for convenience,""" start="00:06:55.860" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""we can bind Gnus to,""" start="00:06:57.560" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""for example, C-c g, as I've done here.""" start="00:06:59.080" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""You will want to set your name""" start="00:07:00.680" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""and email address, like so.""" start="00:07:04.120" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""Here we tell Emacs""" start="00:07:05.800" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""that we are going to be using Gnus for reading email,""" start="00:07:09.240" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""because Emacs comes""" start="00:07:11.440" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""with other email clients as well,""" start="00:07:12.840" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""such as Rmail, and in fact, defaults to Rmail,""" start="00:07:14.760" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""so this way, we tell it to use Gnus.""" start="00:07:18.560" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""By default, Gnus puts its newsrc file and other files,""" start="00:07:24.840" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""I believe it still scatters them""" start="00:07:31.560" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""in a few different directories""" start="00:07:34.320" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""in your home directory,""" start="00:07:35.440" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""so it's a little bit messy.""" start="00:07:36.280" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""So what I prefer to do is to just put it""" start="00:07:37.400" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""all under the Gnus directory""" start="00:07:40.040" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""inside of my Emacs configuration, as I do here.""" start="00:07:42.440" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""Yeah, and then here we just tell Gnus""" start="00:07:47.440" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""to, like, don't try to bother""" start="00:07:50.640" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""with a generic newsrc file""" start="00:07:53.320" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""that would be shared""" start="00:07:55.760" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""with other news readers.""" start="00:07:57.120" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""Just want to use it for email.""" start="00:07:58.400" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""And yeah, so we just tell Gnus""" start="00:07:59.680" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""to keep all of its data""" start="00:08:01.960" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""inside a dedicated .newsrc.eld""" start="00:08:03.040" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""(for Emacs Lisp data) file instead.""" start="00:08:08.080" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""And we can also have Gnus not prompt us""" start="00:08:12.160" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""when we want to exit with q.""" start="00:08:15.200" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""Anyway, so let's go ahead and evaluate this.""" start="00:08:19.680" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""So this has been set,""" start="00:08:23.400" video="mainVideo-gnus" id="subtitle"]]
+
+<div class="transcript-heading">[[!template new="1" text="""Starting Gnus""" start="00:08:25.720" video="mainVideo-gnus" id="subtitle"]]</div>[[!template text="""so if we type M-x gnus again, or hit C-c g,""" start="00:08:25.720" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""now we're faced with an empty buffer,""" start="00:08:32.268" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""and it says no news is good news,""" start="00:08:35.700" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""and that's actually""" start="00:08:37.400" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""one of the characteristics of Gnus""" start="00:08:38.400" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""is that by default it tries""" start="00:08:40.720" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""to like sort of declutter""" start="00:08:44.780" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""and show us a little less possible""" start="00:08:47.620" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""in the group buffer,""" start="00:08:49.200" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""meaning that if you don't have""" start="00:08:50.820" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""any groups with unread or marked""" start="00:08:53.260" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""or, like, starred messages, it will not show them.""" start="00:08:55.640" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""To actually see all of our groups or folders,""" start="00:09:00.120" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""we hit shift L or capital L,""" start="00:09:03.960" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""and we see that we have an inbox here,""" start="00:09:08.360" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""as expected. So we enter the inbox,""" start="00:09:12.420" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""and we see that there is an article there""" start="00:09:14.880" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""and it's already been marked as read.""" start="00:09:17.460" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""But if we mark it as unread""" start="00:09:20.780" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""and exit and enter Gnus again,""" start="00:09:22.680" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""this is what we would see.""" start="00:09:25.960" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""We would see that our group""" start="00:09:27.280" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""and then we enter it, we see our mail here.""" start="00:09:28.840" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""Yeah, and this is our very first email""" start="00:09:34.100" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""that we read in GNU Emacs here, inside Gnus.""" start="00:09:36.160" video="mainVideo-gnus" id="subtitle"]]
+
+<div class="transcript-heading">[[!template new="1" text="""Always showing groups""" start="00:09:40.080" video="mainVideo-gnus" id="subtitle"]]</div>[[!template text="""It might be useful to have Gnus always show""" start="00:09:40.080" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""certain groups or folders""" start="00:09:43.840" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""even if they don't have""" start="00:09:46.840" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""anything unread or marked inside of them.""" start="00:09:48.320" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""The way we can do that is""" start="00:09:52.340" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""by setting this variable""" start="00:09:56.040" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""gnus-permanently-visible-groups""" start="00:09:57.600" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""to a regular expression""" start="00:10:01.340" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""that describes the name of these groups.""" start="00:10:03.040" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""So if we launch Gnus again,""" start="00:10:09.120" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""this time, we see that that group is visible,""" start="00:10:11.540" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""even though there's no unread messages in it.""" start="00:10:14.760" video="mainVideo-gnus" id="subtitle"]]
+
+<div class="transcript-heading">[[!template new="1" text="""Reading messages""" start="00:10:19.900" video="mainVideo-gnus" id="subtitle"]]</div>[[!template text="""When we enter a group or folder,""" start="00:10:19.900" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""we will see a list of all of our messages.""" start="00:10:24.400" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""Here, we only have one.""" start="00:10:26.720" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""We can press M-u or Alt-u""" start="00:10:27.800" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""to mark something as unread.""" start="00:10:31.940" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""You can press d to mark it as read.""" start="00:10:34.680" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""If you press just u,""" start="00:10:38.540" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""it'll tick the article,""" start="00:10:40.080" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""which is kind of the equivalent""" start="00:10:41.960" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""of marking the message or email""" start="00:10:44.040" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""as starred in other email clients""" start="00:10:47.000" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""such as Thunderbird.""" start="00:10:50.540" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""We see that when there are groups""" start="00:10:55.720" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""that have starred or ticked messages""" start="00:11:00.640" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""inside of them,""" start="00:11:03.960" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""Gnus will mark them""" start="00:11:04.680" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""with this little star here, or asterisk.""" start="00:11:05.600" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""This talk is just barely""" start="00:11:16.020" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""scratching the surface.""" start="00:11:17.640" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""Let's see how far...""" start="00:11:19.040" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""How am I doing with the time?""" start="00:11:21.081" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""Okay, 11 minutes already.""" start="00:11:22.760" video="mainVideo-gnus" id="subtitle"]]
+
+<div class="transcript-heading">[[!template new="1" text="""Debugging IMAP""" start="00:11:30.120" video="mainVideo-gnus" id="subtitle"]]</div>[[!template text="""Just a couple of helpful things here,""" start="00:11:30.120" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""like this nnimap-record-commands variable.""" start="00:11:32.080" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""It's useful when you want to debug""" start="00:11:36.920" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""your IMAP setup with Gnus.""" start="00:11:38.520" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""If you set it to anything non-nil,""" start="00:11:40.120" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""it will log the commands that it runs""" start="00:11:42.860" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""to a special `\*imap log\*` buffer.""" start="00:11:46.700" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""And here I just set it""" start="00:11:49.540" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""to this init-file-debug variable,""" start="00:11:50.720" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""which is set to non-nil""" start="00:11:52.680" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""whenever you launch Emacs""" start="00:11:55.160" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""with the --debug-init switch,""" start="00:11:56.440" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""so that's pretty helpful.""" start="00:11:59.280" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""You want to also set your sent folder,""" start="00:12:02.240" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""basically, where Gnus will save""" start="00:12:05.120" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""a copy of the message that you just sent.""" start="00:12:07.480" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""Normally, I think the convention these days is,""" start="00:12:09.440" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""a lot of you know servers and clients""" start="00:12:12.800" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""use a dedicated sent folder,""" start="00:12:16.600" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""but with Gnus, I just prefer to use INBOX itself.""" start="00:12:18.800" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""Mainly because then I will have""" start="00:12:24.340" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""threading working for free,""" start="00:12:27.120" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""so I can read the entire thread""" start="00:12:28.760" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""of an email chain there in one place.""" start="00:12:31.940" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""Of course, we don't have to keep""" start="00:12:34.300" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""the messages in there forever.""" start="00:12:35.320" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""And in fact, Gnus has facilities,""" start="00:12:38.900" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""both manual and automated,""" start="00:12:42.080" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""for expiring emails into""" start="00:12:43.480" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""different locations or different folders.""" start="00:12:46.000" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""Yeah. So let's move on here.""" start="00:12:52.680" video="mainVideo-gnus" id="subtitle"]]
+
+<div class="transcript-heading">[[!template new="1" text="""Topics""" start="00:12:55.160" video="mainVideo-gnus" id="subtitle"]]</div>[[!template text="""Topics are another nice feature of Gnus.""" start="00:12:55.160" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""So this is useful""" start="00:13:02.040" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""for creating some topics""" start="00:13:03.280" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""and then classifying or grouping""" start="00:13:05.360" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""your directories there.""" start="00:13:08.460" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""So we will see the use""" start="00:13:10.600" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""of this in a moment,""" start="00:13:11.800" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""where, let's say, I want to add""" start="00:13:13.640" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""a second account to Gnus.""" start="00:13:17.020" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""This one I'm going to call ec25work.""" start="00:13:20.000" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""Let's pretend that""" start="00:13:23.560" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""this is my work email.""" start="00:13:24.680" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""So if we open Gnus now,""" start="00:13:29.860" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""we see that our work INBOX""" start="00:13:32.480" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""also shows up here.""" start="00:13:37.000" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""And because we enabled topic mode,""" start="00:13:37.960" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""we see that we have""" start="00:13:41.300" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""these sort of buttons""" start="00:13:42.360" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""like Gnus and misc here.""" start="00:13:43.440" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""And we can, I believe,""" start="00:13:44.840" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""create a topic with capital T n.""" start="00:13:46.680" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""We can call it personal, this one.""" start="00:13:49.800" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""Let's create another one, work.""" start="00:13:52.880" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""And then what we can do is go""" start="00:13:56.940" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""over the directory that we want,""" start="00:13:59.580" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""for example, this one,""" start="00:14:02.800" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""hit capital T m to move it""" start="00:14:04.760" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""to the personal topic,""" start="00:14:08.220" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""and this work one,""" start="00:14:11.900" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""move it to the work topic.""" start="00:14:13.080" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""So we can nicely classify""" start="00:14:15.200" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""and group our groups folders here,""" start="00:14:17.440" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""which is especially useful""" start="00:14:23.120" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""when you have hundreds of them.""" start="00:14:24.720" video="mainVideo-gnus" id="subtitle"]]
+
+<div class="transcript-heading">[[!template new="1" text="""Customizing message display""" start="00:14:25.560" video="mainVideo-gnus" id="subtitle"]]</div>[[!template text="""Anyhow, we can customize""" start="00:14:25.560" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""different aspects of message display.""" start="00:14:29.760" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""Like for example,""" start="00:14:35.040" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""we can this way customize""" start="00:14:35.840" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""and change the order of""" start="00:14:38.200" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""which headers we want to see and where.""" start="00:14:39.200" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""So if I launch Gnus""" start="00:14:41.600" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""and go back to this email here,""" start="00:14:45.200" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""these are the headers that we see at the top.""" start="00:14:48.460" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""Excuse me.""" start="00:14:52.140" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""And with Gnus we can always""" start="00:14:52.640" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""We can have it show all the headers""" start="00:14:55.160" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""by pressing t to toggle the headers.""" start="00:14:57.800" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""Here we can see all the nitty-gritty""" start="00:15:02.000" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""and all of the headers in the message""" start="00:15:04.580" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""and we can toggle it back with t again.""" start="00:15:06.360" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""We can modify and customize the sorting""" start="00:15:12.220" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""with dedicated sorting functions.""" start="00:15:16.480" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""It comes with a number of them""" start="00:15:20.020" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""out of the box""" start="00:15:21.000" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""but we can define them as well.""" start="00:15:21.600" video="mainVideo-gnus" id="subtitle"]]
+
+<div class="transcript-heading">[[!template new="1" text="""Sending emails""" start="00:15:24.320" video="mainVideo-gnus" id="subtitle"]]</div>[[!template text="""Now to send emails. Let's see.""" start="00:15:24.320" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""We will be using message,""" start="00:15:29.760" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""and that's what Gnus itself uses.""" start="00:15:31.000" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""So I will set things up here.""" start="00:15:34.940" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""Let's see.""" start="00:15:38.580" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""Okay, so first of all,""" start="00:15:42.640" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""we want to have Gnus mark""" start="00:15:44.520" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""the messages that we write to others""" start="00:15:46.440" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""as read automatically,""" start="00:15:48.520" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""so this option does that.""" start="00:15:49.760" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""And then we define posting styles this way""" start="00:15:51.360" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""using the prefix, the name""" start="00:15:58.040" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""of the IMAP server.""" start="00:16:01.620" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""And this is how we can tell it to use""" start="00:16:04.360" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""what email address for the From [header]""" start="00:16:06.520" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""and which SMTP server to send it with.""" start="00:16:09.200" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""Yeah, and then gcc is where Gnus will save""" start="00:16:14.600" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""the copy of the messages that we write.""" start="00:16:17.880" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""So if we go ahead and launch Gnus again.""" start="00:16:20.200" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""We can go into our personal email here,""" start="00:16:24.140" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""hit m to compose a new message.""" start="00:16:26.280" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""We can prepare an email to,""" start="00:16:28.920" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""let's say, our work address.""" start="00:16:33.560" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""Hello from EmacsConf 2025 Gnus talk.""" start="00:16:35.120" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""Hello, this is just a test. :)""" start="00:16:42.420" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""Yeah, and we hit send.""" start="00:16:47.640" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""The sending will be done""" start="00:16:55.740" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""using Emacs's built-in SMTP libraries.""" start="00:16:56.920" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""Sometimes it can take a moment.""" start="00:17:03.480" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""Okay, that's it. It's done.""" start="00:17:05.120" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""So if we go back out""" start="00:17:07.600" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""and if we hit g to get new news,""" start="00:17:09.260" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""we should be able to see our new email there""" start="00:17:11.560" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""in the other account that we just sent it to.""" start="00:17:15.680" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""So we can come here, open it,""" start="00:17:17.640" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""and there we go.""" start="00:17:22.361" video="mainVideo-gnus" id="subtitle"]]
+
+<div class="transcript-heading">[[!template new="1" text="""Plans""" start="00:17:26.660" video="mainVideo-gnus" id="subtitle"]]</div>[[!template text="""There is a lot to configure in Gnus,""" start="00:17:26.660" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""and we're just barely scratching the surface,""" start="00:17:29.240" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""and unfortunately I don't have the time""" start="00:17:31.440" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""to explain all of these""" start="00:17:34.080" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""but I do plan on doing""" start="00:17:35.000" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""a much longer running series,""" start="00:17:36.520" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""whether it's text or videos,""" start="00:17:38.840" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""showing how to configure""" start="00:17:41.500" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""and use a lot of these different aspects of Gnus.""" start="00:17:42.880" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""But yeah, here, near the end, just a couple of...""" start="00:17:45.320" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""quick things. I find it's nice to have message""" start="00:17:49.520" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""prompt us for [confirmation]""" start="00:17:54.920" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""that we do want to send a message.""" start="00:17:56.520" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""Actually, when it does that, I take""" start="00:17:59.200" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""another look over my email""" start="00:18:01.360" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""to make sure I don't have any typos.""" start="00:18:02.600" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""It's generally a good idea to wrap your messages""" start="00:18:07.060" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""around 70 or 72 characters.""" start="00:18:09.520" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""We do that here.""" start="00:18:14.120" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""We can tell Gnus to forward messages""" start="00:18:16.620" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""as a proper MIME part,""" start="00:18:19.160" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""instead of some half-broken way.""" start="00:18:22.600" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""This customization, the sendmail function,""" start="00:18:27.060" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""is how we tell Gnus with message""" start="00:18:30.120" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""to use the SMTP library to sending the email,""" start="00:18:34.240" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""and these two variables are useful for""" start="00:18:38.240" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""omitting our own email address""" start="00:18:42.480" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""when we want to send someone,""" start="00:18:45.960" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""like when we hit r, to reply to someone.""" start="00:18:47.440" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""if we configure these variables,""" start="00:18:50.180" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""then Gnus won't add""" start="00:18:51.960" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""our own address to the To or Cc,""" start="00:18:52.960" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""which is pretty useful.""" start="00:18:56.060" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""I also find it helpful""" start="00:18:58.480" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""to unbind C-c C-s.""" start="00:18:59.920" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""That's another key""" start="00:19:03.360" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""for sending the message [in addition to C-c C-c].""" start="00:19:04.975" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""And because C-c C-d,""" start="00:19:06.320" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""which is very close to it on the QWERTY layout,""" start="00:19:09.720" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""is useful for saving a draft""" start="00:19:13.360" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""and then coming back to it,""" start="00:19:15.720" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""I don't want to accidentally hit C-c C-s,""" start="00:19:16.840" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""and send the message prematurely.""" start="00:19:20.080" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""So I unbind it.""" start="00:19:22.040" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""Yeah, anyway, that's about it.""" start="00:19:25.980" video="mainVideo-gnus" id="subtitle"]]
+
+<div class="transcript-heading">[[!template new="1" text="""Wrapping up""" start="00:19:27.960" video="mainVideo-gnus" id="subtitle"]]</div>[[!template text="""That's a kind of very quick tour""" start="00:19:27.960" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""and introduction of setting up Gnus.""" start="00:19:31.040" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""Here, we just configured a remote IMAP server,""" start="00:19:37.120" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""but we can also, of course,""" start="00:19:40.720" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""set up a local IMAP server such as Dovecot""" start="00:19:43.520" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""and point Gnus to there,""" start="00:19:46.360" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""and use programs like OfflineIMAP, I believe,""" start="00:19:48.400" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""or the mbsync program from isync package""" start="00:19:52.800" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""or isync project to synchronize our messages""" start="00:19:57.480" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""to local mail directories""" start="00:20:02.940" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""and then point Gnus to it.""" start="00:20:04.480" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""The reason we might want to use that""" start="00:20:06.280" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""is to always have a copy of our messages at hand""" start="00:20:08.360" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""so we can use offline.""" start="00:20:11.720" video="mainVideo-gnus" id="subtitle"]]
+
+<div class="transcript-heading">[[!template new="1" text="""nnimap""" start="00:20:12.760" video="mainVideo-gnus" id="subtitle"]]</div>[[!template text="""And why use nnimap specifically?""" start="00:20:12.760" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""As of now, the Maildir backend included with Gnus""" start="00:20:17.440" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""is very inefficient,""" start="00:20:27.400" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""especially when dealing with""" start="00:20:29.680" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""tens or hundreds of thousands of messages""" start="00:20:31.400" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""like some of us are.""" start="00:20:33.840" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""It just takes an eternity to try""" start="00:20:36.660" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""and index them and get going.""" start="00:20:38.760" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""In that case, what I recommend doing""" start="00:20:43.260" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""is instead of interfacing directly with Maildir,""" start="00:20:44.640" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""for Gnus, just install and run""" start="00:20:47.800" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""Dovecot, a local IMAP server,""" start="00:20:52.360" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""and point Gnus to that.""" start="00:20:54.360" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""I plan on writing tutorials or doing videos""" start="00:20:59.820" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""about these other aspects""" start="00:21:02.960" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""of configuring Gnus after the conference.""" start="00:21:06.640" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""That's about it for me,""" start="00:21:10.520" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""so I hope you find this helpful.""" start="00:21:11.440" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""If you have any questions,""" start="00:21:14.120" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""please feel free to email me""" start="00:21:16.680" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""at bandali@gnu.org or @kelar.org.""" start="00:21:18.240" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""You can take a look at my personal website""" start="00:21:23.760" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""where I plan on posting""" start="00:21:25.880" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""other Emacs and Gnus materials.""" start="00:21:26.840" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""And yeah, thank you for watching""" start="00:21:31.060" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""and I hope you enjoy the rest of the conference.""" start="00:21:33.040" video="mainVideo-gnus" id="subtitle"]]
+[[!template text="""Take care.""" start="00:21:35.160" video="mainVideo-gnus" id="subtitle"]]
+
+</div>
+
+Captioner: sachac
+
Questions or comments? Please e-mail [bandali@gnu.org](mailto:bandali@gnu.org?subject=Comment%20for%20EmacsConf%202023%20gnus%3A%20Reading%20and%20writing%20emails%20in%20GNU%20Emacs%20with%20Gnus)
diff --git a/2025/info/gnus-before.md b/2025/info/gnus-before.md
index 1267f806..e2a23033 100644
--- a/2025/info/gnus-before.md
+++ b/2025/info/gnus-before.md
@@ -8,12 +8,30 @@ The following image shows where the talk is in the schedule for Sat 2025-12-06.
Format: 22-min talk ; Q&A: BigBlueButton conference room <https://media.emacsconf.org/2025/current/bbb-gnus.html> Etherpad: <https://pad.emacsconf.org/2025-gnus>
Etherpad: <https://pad.emacsconf.org/2025-gnus>
Discuss on IRC: [#emacsconf-gen](https://chat.emacsconf.org/?join=emacsconf,emacsconf-gen)
-Status: Ready to stream
+Status: Q&A open for participation
<div>Times in different time zones:</div><div class="times" start="2025-12-06T15:50:00Z" end="2025-12-06T16:15:00Z"><div class="conf-time">Saturday, Dec 6 2025, ~10:50 AM - 11:15 AM EST (US/Eastern)</div><div class="others"><div>which is the same as:</div>Saturday, Dec 6 2025, ~9:50 AM - 10:15 AM CST (US/Central)<br />Saturday, Dec 6 2025, ~8:50 AM - 9:15 AM MST (US/Mountain)<br />Saturday, Dec 6 2025, ~7:50 AM - 8:15 AM PST (US/Pacific)<br />Saturday, Dec 6 2025, ~3:50 PM - 4:15 PM UTC <br />Saturday, Dec 6 2025, ~4:50 PM - 5:15 PM CET (Europe/Paris)<br />Saturday, Dec 6 2025, ~5:50 PM - 6:15 PM EET (Europe/Athens)<br />Saturday, Dec 6 2025, ~9:20 PM - 9:45 PM IST (Asia/Kolkata)<br />Saturday, Dec 6 2025, ~11:50 PM - 12:15 AM +08 (Asia/Singapore)<br />Sunday, Dec 7 2025, ~12:50 AM - 1:15 AM JST (Asia/Tokyo)</div></div><div><strong><a href="/2025/watch/gen/">Find out how to watch and participate</a></strong></div>
+<div class="vid mainVideo"><video controls preload="none" id="mainVideo-gnus"><source src="https://media.emacsconf.org/2025/emacsconf-2025-gnus--reading-and-writing-emails-in-gnu-emacs-with-gnus--amin-bandali--main.webm" />captions="""<track label="English" kind="captions" srclang="en" src="/2025/captions/emacsconf-2025-gnus--reading-and-writing-emails-in-gnu-emacs-with-gnus--amin-bandali--main.vtt" default />"""<track kind="chapters" label="Chapters" src="/2025/captions/emacsconf-2025-gnus--reading-and-writing-emails-in-gnu-emacs-with-gnus--amin-bandali--main--chapters.vtt" /><p><em>Your browser does not support the video tag. Please download the video instead.</em></p></video>[[!template id="chapters" vidid="mainVideo-gnus" data="""
+00:02.620 Introduction
+01:25.240 Demo
+02:49.960 Don't panic
+03:58.560 Configuring servers
+05:46.240 .authinfo
+06:26.600 Configuration
+08:25.720 Starting Gnus
+09:40.080 Always showing groups
+10:19.900 Reading messages
+11:30.120 Debugging IMAP
+12:55.160 Topics
+14:25.560 Customizing message display
+15:24.320 Sending emails
+17:26.660 Plans
+19:27.960 Wrapping up
+20:12.760 nnimap
+"""]]<div></div>Duration: 21:37 minutes<div class="files resources"><ul><li><a href="https://pad.emacsconf.org/2025-gnus">Open Etherpad</a></li><li><a href="https://media.emacsconf.org/2025/current/bbb-gnus.html">Open public Q&A</a></li><li><a href="https://media.emacsconf.org/2025/emacsconf-2025-gnus--reading-and-writing-emails-in-gnu-emacs-with-gnus--amin-bandali--intro.vtt">Download --intro.vtt</a></li><li><a href="https://media.emacsconf.org/2025/emacsconf-2025-gnus--reading-and-writing-emails-in-gnu-emacs-with-gnus--amin-bandali--intro.webm">Download --intro.webm</a></li><li><a href="https://media.emacsconf.org/2025/emacsconf-2025-gnus--reading-and-writing-emails-in-gnu-emacs-with-gnus--amin-bandali--main--chapters.vtt">Download --main--chapters.vtt</a></li><li><a href="https://media.emacsconf.org/2025/emacsconf-2025-gnus--reading-and-writing-emails-in-gnu-emacs-with-gnus--amin-bandali--main.opus">Download --main.opus (19MB)</a></li><li><a href="https://media.emacsconf.org/2025/emacsconf-2025-gnus--reading-and-writing-emails-in-gnu-emacs-with-gnus--amin-bandali--main.png">Download --main.png</a></li><li><a href="https://media.emacsconf.org/2025/emacsconf-2025-gnus--reading-and-writing-emails-in-gnu-emacs-with-gnus--amin-bandali--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2025/emacsconf-2025-gnus--reading-and-writing-emails-in-gnu-emacs-with-gnus--amin-bandali--main.webm">Download --main.webm (60MB)</a></li><li><a href="https://media.emacsconf.org/2025/emacsconf-2025-gnus--reading-and-writing-emails-in-gnu-emacs-with-gnus--amin-bandali--split.txt">Download --split.txt</a></li><li><a href="https://media.emacsconf.org/2025/emacsconf-2025-gnus--reading-and-writing-emails-in-gnu-emacs-with-gnus--amin-bandali--split.vtt">Download --split.vtt</a></li><li><a href="https://youtu.be/0Pu8oqdsSig">View on Youtube</a></li></ul></div></div>
# Description
<!-- End of emacsconf-publish-before-page --> \ No newline at end of file
diff --git a/2025/info/juicemacs-before.md b/2025/info/juicemacs-before.md
index d41ff742..8f2135c4 100644
--- a/2025/info/juicemacs-before.md
+++ b/2025/info/juicemacs-before.md
@@ -8,7 +8,7 @@ The following image shows where the talk is in the schedule for Sat 2025-12-06.
Format: 20-min talk ; Q&A: Etherpad <https://pad.emacsconf.org/2025-juicemacs>
Etherpad: <https://pad.emacsconf.org/2025-juicemacs>
Discuss on IRC: [#emacsconf-dev](https://chat.emacsconf.org/?join=emacsconf,emacsconf-dev)
-Status: Now playing on the conference livestream
+Status: Q&A open for participation
<div>Times in different time zones:</div><div class="times" start="2025-12-06T15:15:00Z" end="2025-12-06T15:35:00Z"><div class="conf-time">Saturday, Dec 6 2025, ~10:15 AM - 10:35 AM EST (US/Eastern)</div><div class="others"><div>which is the same as:</div>Saturday, Dec 6 2025, ~9:15 AM - 9:35 AM CST (US/Central)<br />Saturday, Dec 6 2025, ~8:15 AM - 8:35 AM MST (US/Mountain)<br />Saturday, Dec 6 2025, ~7:15 AM - 7:35 AM PST (US/Pacific)<br />Saturday, Dec 6 2025, ~3:15 PM - 3:35 PM UTC <br />Saturday, Dec 6 2025, ~4:15 PM - 4:35 PM CET (Europe/Paris)<br />Saturday, Dec 6 2025, ~5:15 PM - 5:35 PM EET (Europe/Athens)<br />Saturday, Dec 6 2025, ~8:45 PM - 9:05 PM IST (Asia/Kolkata)<br />Saturday, Dec 6 2025, ~11:15 PM - 11:35 PM +08 (Asia/Singapore)<br />Sunday, Dec 7 2025, ~12:15 AM - 12:35 AM JST (Asia/Tokyo)</div></div><div><strong><a href="/2025/watch/dev/">Find out how to watch and participate</a></strong></div>
diff --git a/2025/info/latex-before.md b/2025/info/latex-before.md
index 57b9993c..e3affec9 100644
--- a/2025/info/latex-before.md
+++ b/2025/info/latex-before.md
@@ -8,12 +8,12 @@ The following image shows where the talk is in the schedule for Sat 2025-12-06.
Format: 20-min talk ; Q&A: BigBlueButton conference room <https://media.emacsconf.org/2025/current/bbb-latex.html> Etherpad: <https://pad.emacsconf.org/2025-latex>
Etherpad: <https://pad.emacsconf.org/2025-latex>
Discuss on IRC: [#emacsconf-gen](https://chat.emacsconf.org/?join=emacsconf,emacsconf-gen)
-Status: Ready to stream
+Status: Q&A open for participation
<div>Times in different time zones:</div><div class="times" start="2025-12-06T16:25:00Z" end="2025-12-06T16:45:00Z"><div class="conf-time">Saturday, Dec 6 2025, ~11:25 AM - 11:45 AM EST (US/Eastern)</div><div class="others"><div>which is the same as:</div>Saturday, Dec 6 2025, ~10:25 AM - 10:45 AM CST (US/Central)<br />Saturday, Dec 6 2025, ~9:25 AM - 9:45 AM MST (US/Mountain)<br />Saturday, Dec 6 2025, ~8:25 AM - 8:45 AM PST (US/Pacific)<br />Saturday, Dec 6 2025, ~4:25 PM - 4:45 PM UTC <br />Saturday, Dec 6 2025, ~5:25 PM - 5:45 PM CET (Europe/Paris)<br />Saturday, Dec 6 2025, ~6:25 PM - 6:45 PM EET (Europe/Athens)<br />Saturday, Dec 6 2025, ~9:55 PM - 10:15 PM IST (Asia/Kolkata)<br />Sunday, Dec 7 2025, ~12:25 AM - 12:45 AM +08 (Asia/Singapore)<br />Sunday, Dec 7 2025, ~1:25 AM - 1:45 AM JST (Asia/Tokyo)</div></div><div><strong><a href="/2025/watch/gen/">Find out how to watch and participate</a></strong></div>
-
+<div class="vid mainVideo"><div></div><div class="files resources"><ul><li><a href="https://pad.emacsconf.org/2025-latex">Open Etherpad</a></li><li><a href="https://media.emacsconf.org/2025/current/bbb-latex.html">Open public Q&A</a></li><li><a href="https://media.emacsconf.org/2025/emacsconf-2025-latex--latex-export-in-orgmode-the-overhaul--pedro-a-aranda-gutirrez--intro.vtt">Download --intro.vtt</a></li><li><a href="https://media.emacsconf.org/2025/emacsconf-2025-latex--latex-export-in-orgmode-the-overhaul--pedro-a-aranda-gutirrez--intro.webm">Download --intro.webm</a></li></ul></div></div>
# Description
<!-- End of emacsconf-publish-before-page --> \ No newline at end of file
diff --git a/2025/info/llm-after.md b/2025/info/llm-after.md
index b83899b2..91904dd7 100644
--- a/2025/info/llm-after.md
+++ b/2025/info/llm-after.md
@@ -1,6 +1,372 @@
<!-- Automatically generated by emacsconf-publish-after-page -->
+<div class="transcript transcript-mainVideo"><a name="llm-mainVideo-transcript"></a><h1>Transcript</h1>
+
+
+<div class="transcript-heading">[[!template new="1" text="""Introduction""" start="00:00:01.040" video="mainVideo-llm" id="subtitle"]]</div>[[!template text="""Hi, I'm Andrew Hyatt.""" start="00:00:01.040" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""I'm going to talk to you today about Emacs and AI,""" start="00:00:03.080" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""and where things are right now""" start="00:00:09.400" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""in the world of Emacs and AI,""" start="00:00:10.880" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""via large language models,""" start="00:00:12.120" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""and where things might be going,""" start="00:00:14.160" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""and what it means for the future of Emacs.""" start="00:00:17.000" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""I think what we're seeing with Emacs is interesting.""" start="00:00:22.700" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""We've seen a lot of different things""" start="00:00:27.280" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""come around in the past year,""" start="00:00:29.400" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""in the past several years.""" start="00:00:31.560" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""There's lots of different solutions.""" start="00:00:33.120" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""But in the past year, things have been very interesting.""" start="00:00:35.080" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""I think there's new and interesting questions""" start="00:00:36.760" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""about what does it mean to use Emacs?""" start="00:00:39.680" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""What does it mean to use any editor?""" start="00:00:43.280" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""I'm going to be talking about Emacs,""" start="00:00:45.480" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""and I'm going to show you various Emacs packages""" start="00:00:47.280" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""as demonstrations of these ideas.""" start="00:00:50.360" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""But there's the general question of""" start="00:00:53.080" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""what does it mean to use any editor, not just Emacs?""" start="00:00:59.840" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""What does it mean to do work?""" start="00:01:03.720" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""And I think the industry in general is facing these challenges""" start="00:01:06.240" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""of we don't really know where things are going to end up,""" start="00:01:10.720" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""but we do know the direction they're going.""" start="00:01:13.280" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""Emacs is a reflection of that.""" start="00:01:16.920" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""I think the answer for Emacs might be""" start="00:01:20.040" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""a little bit different than everything else,""" start="00:01:23.240" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""but I do want to show you what's out there""" start="00:01:25.720" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""so we can explore what are the possibilities""" start="00:01:28.600" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""of Emacs, AI, and generally how we get things done.""" start="00:01:33.320" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""Thanks. Let's dive right into it.""" start="00:01:41.120" video="mainVideo-llm" id="subtitle"]]
+
+<div class="transcript-heading">[[!template new="1" text="""Copilot""" start="00:01:44.720" video="mainVideo-llm" id="subtitle"]]</div>[[!template text="""We're going to start by showing you""" start="00:01:44.720" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""some things that are pretty well integrated,""" start="00:01:48.080" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""that look a lot like what you see in Emacs""" start="00:01:51.040" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""and fit in with the kinds of editing""" start="00:01:55.280" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""that you normally do in Emacs.""" start="00:01:58.680" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""So this is just kind of like, it's well integrated.""" start="00:02:02.640" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""So we're going to talk about Copilot and Semext.""" start="00:02:06.580" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""Copilot is by Microsoft via GitHub,""" start="00:02:08.780" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""and Semext is just my personal demo,""" start="00:02:12.680" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""but they're both showing you, you know,""" start="00:02:14.760" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""this kind of thing. Let's start with Copilot.""" start="00:02:18.040" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""Let's try out Copilot on just a standard bit of Elisp.""" start="00:02:24.400" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""We're going to write a Fibonacci function.""" start="00:02:31.920" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""Let's try out Emacs on a standard bit of Elisp.""" start="00:02:38.440" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""We're going to write a Fibonacci function.""" start="00:02:43.080" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""And you can see like as soon as we even start typing it,""" start="00:02:49.280" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""we get everything as a completion.""" start="00:02:53.160" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""So you can just press Tab here,""" start="00:02:56.340" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""and you've just completed""" start="00:02:59.880" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""a significant bunch of Emacs Lisp code.""" start="00:03:02.160" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""It will do this no matter where you are.""" start="00:03:06.800" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""So, pretty useful. It will just keep suggesting things.""" start="00:03:09.920" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""Do you want to do this?""" start="00:03:14.800" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""I'm not sure.""" start="00:03:16.440" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""But it usually is offering pretty reasonable things.""" start="00:03:17.480" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""So you could do this with code,""" start="00:03:22.840" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""of course, any code.""" start="00:03:29.300" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""You don't really even have to have a mode for it, right?""" start="00:03:32.120" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""That's kind of the beauty of AI is that""" start="00:03:33.920" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""you don't need any Emacs functionality for this,""" start="00:03:36.680" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""except for Copilot.""" start="00:03:38.520" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""It doesn't need to know the structure of your code.""" start="00:03:39.520" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""It doesn't need anything except for the text itself""" start="00:03:41.680" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""and whatever AI integration that this is.""" start="00:03:45.280" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""We can look at, you can do the same thing with Org-mode.""" start="00:03:51.240" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""So we could say create, no,""" start="00:03:53.740" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""how about let's, let's do, you know, spring cleaning.""" start="00:03:58.000" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""It's actually the fall, but still we'll say spring cleaning.""" start="00:04:02.920" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""And it'll start suggesting things that, you know,""" start="00:04:10.840" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""maybe at first, it doesn't really know what to do to""" start="00:04:12.768" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""clean up all code.""" start="00:04:15.440" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""It thinks I need to clean up code, but no,""" start="00:04:16.434" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""this is going to be actual, you know,""" start="00:04:18.401" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""clean hood over range. Clean out pantry.""" start="00:04:21.840" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""These are all really reasonable suggestions.""" start="00:04:31.568" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""You just keep going here.""" start="00:04:33.880" video="mainVideo-llm" id="subtitle"]]
+
+<div class="transcript-heading">[[!template new="1" text="""Semext""" start="00:04:38.320" video="mainVideo-llm" id="subtitle"]]</div>[[!template text="""I'm going to demonstrate Semext,""" start="00:04:38.320" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""which is a package I have on GNU Elpa,""" start="00:04:40.560" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""that is designed to integrate AI in a very Emacs-like way.""" start="00:04:43.880" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""And so what you could do is you could do a""" start="00:04:48.720" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""semext-search-forward.""" start="00:04:51.000" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""The UI looks just like other Emacs commands,""" start="00:04:54.800" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""but you can search for anything.""" start="00:04:58.720" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""There's really no way to express what I'm about to,""" start="00:05:02.380" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""what I'm trying to demonstrate""" start="00:05:06.280" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""in Emacs's normal search commands.""" start="00:05:08.680" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""You could really ask for anything.""" start="00:05:12.360" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""And it takes a little while, which is not Emacs-like,""" start="00:05:15.400" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""but everything else is sort of like""" start="00:05:18.760" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""it's designed to be like Emacs,""" start="00:05:20.034" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""except way more powerful.""" start="00:05:21.720" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""You don't need any mode to be active for this.""" start="00:05:23.520" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""You just need the library""" start="00:05:27.120" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""and an AI provider of some sort, either locally""" start="00:05:32.040" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""or, you know, your favorite cloud provider.""" start="00:05:34.760" video="mainVideo-llm" id="subtitle"]]
+
+<div class="transcript-heading">[[!template new="1" text="""Integrated AI experiences: gptel, ellama, chatgpt-shell, etc.""" start="00:05:41.200" video="mainVideo-llm" id="subtitle"]]</div>[[!template text="""Now we're going to move on to a different way""" start="00:05:41.200" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""of interacting with AI and Emacs.""" start="00:05:43.680" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""This way is less like the normal editing experience.""" start="00:05:46.400" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""So you lose some familiarity. However, in exchange,""" start="00:05:52.320" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""it is a lot more powerful.""" start="00:05:57.000" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""And there's a whole suite of these tools.""" start="00:05:58.080" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""I'm going to demonstrate gptel,""" start="00:06:00.120" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""which is the most popular one.""" start="00:06:02.480" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""But there are many.""" start="00:06:05.780" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""And I think different people have""" start="00:06:06.400" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""their own preferences of what they like to use.""" start="00:06:08.480" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""We're going to try now something""" start="00:06:11.760" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""that is a step away from just editing.""" start="00:06:13.000" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""And we're going to, I'm actually using gptel.""" start="00:06:15.080" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""There are several packages that are going to be""" start="00:06:19.840" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""doing the same sort of thing as I'm going to show you.""" start="00:06:22.800" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""gptel has sort of become the most popular one.""" start="00:06:25.960" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""So that's why I'm showing that to you.""" start="00:06:30.000" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""But let's just highlight everything and say gptel rewrite.""" start="00:06:32.200" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""And gptel basically just has a few things.""" start="00:06:39.320" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""There's different ways of thinking about this.""" start="00:06:42.400" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""With just a few very configurable menus,""" start="00:06:45.120" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""you can do a large variety of things.""" start="00:06:50.000" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""So let's give rewrite instructions.""" start="00:06:53.960" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""&quot;Turn this into an iterative program""" start="00:06:59.820" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""instead of a recursive program.&quot;""" start="00:07:06.601" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""In Elisp, you really should not be using recursion.""" start="00:07:12.200" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""So we could say &quot;return to be ready&quot;.""" start="00:07:17.800" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""Do we accept it?""" start="00:07:20.360" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""Yes, we accept it. Or we could iterate and say, no, no,""" start="00:07:21.120" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""that's not what we meant. We meant something else.""" start="00:07:24.520" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""Or you did something a little something wrong.""" start="00:07:26.800" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""Please fix it.""" start="00:07:29.160" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""So this is all very powerful.""" start="00:07:29.880" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""Is this editing?""" start="00:07:31.880" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""Well, it's in the editor.""" start="00:07:33.800" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""You could do this while editing, while deleting,""" start="00:07:40.280" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""you could be doing some sort of traditional editing.""" start="00:07:42.760" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""And then this, which is editing""" start="00:07:44.960" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""in the sense that it's in your editor,""" start="00:07:47.680" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""you might have to highlight""" start="00:07:48.920" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""some parts of the file and do things,""" start="00:07:51.040" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""but generally you don't even need to,""" start="00:07:52.800" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""or you go to a spot and you say, put code at this spot.""" start="00:07:54.720" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""It's kind of like editing.""" start="00:07:59.880" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""I would say it's not exactly editing,""" start="00:08:01.960" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""but it's at least something that must happen in an editor""" start="00:08:05.840" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""and it's well integrated into Emacs.""" start="00:08:10.160" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""As you can tell, it used very sort of""" start="00:08:12.360" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""modern standard Emacs UI paradigms""" start="00:08:14.760" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""and it's all written in Elisp.""" start="00:08:18.240" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""Everything is happening in Elisp here.""" start="00:08:20.760" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""So this is just very much an Emacs experience.""" start="00:08:23.780" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""It's just not exactly editing""" start="00:08:25.960" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""because the thing doing the editing""" start="00:08:27.680" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""is the AI and not you.""" start="00:08:29.880" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""You're just kind of telling it what to do.""" start="00:08:32.520" video="mainVideo-llm" id="subtitle"]]
+
+<div class="transcript-heading">[[!template new="1" text="""Outside the editor""" start="00:08:36.040" video="mainVideo-llm" id="subtitle"]]</div>[[!template text="""Now we're going to go and look at a way of interaction""" start="00:08:36.040" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""that's even more powerful""" start="00:08:41.120" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""and even more disconnected from the normal editing experience.""" start="00:08:43.240" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""In fact, it's so disconnected""" start="00:08:46.280" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""that most people are using this without an editor.""" start="00:08:47.920" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""These are things like Claude Code""" start="00:08:52.400" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""or the sort of open source equivalent, Aider.""" start="00:08:57.880" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""There's a few other things that follow this pattern as well.""" start="00:09:01.080" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""But it's very interesting in the sense""" start="00:09:05.040" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""that while you can integrate these with the editors,""" start="00:09:07.480" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""and I'm going to show you an Emacs integration,""" start="00:09:09.840" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""you don't need to.""" start="00:09:12.040" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""And that's not the way most people are using them.""" start="00:09:13.520" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""And I find it very interesting that sort of""" start="00:09:16.940" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""we're going back kind of full circle where, you know,""" start="00:09:19.760" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""in the 1960s or 70s, we were using Ed from the terminal""" start="00:09:23.720" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""to edit files, but then we created editors,""" start="00:09:31.960" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""and that was a really good idea.""" start="00:09:35.640" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""It is a lot easier to edit files""" start="00:09:37.960" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""when you have an actual UI.""" start="00:09:40.168" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""But now it's 2025, and we're back in the terminal,""" start="00:09:42.500" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""and we're editing files through the terminal,""" start="00:09:46.880" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""and you know what, it's great,""" start="00:09:50.800" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""but I think it's even better with Emacs.""" start="00:09:53.600" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""On the other hand, it comes with some trade-offs,""" start="00:09:56.900" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""as you can see, as we will see.""" start="00:10:00.280" video="mainVideo-llm" id="subtitle"]]
+
+<div class="transcript-heading">[[!template new="1" text="""Outside Experiences: claude-code.el, aidermacs, eca""" start="00:10:04.734" video="mainVideo-llm" id="subtitle"]]</div>[[!template text="""Okay, we're going to look at""" start="00:10:04.734" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""[audio glitch] Claude Code IDE, aidermacs, ECA.""" start="00:10:07.468" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""Last time, I didn't show you all the variants.""" start="00:10:20.321" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""I do want to show you eca, which points to,""" start="00:10:22.640" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""it is a very similar tool in what it does,""" start="00:10:26.840" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""but does have a different""" start="00:10:29.800" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""and I think better type of Emacs integration.""" start="00:10:32.740" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""All right, we're going to demonstrate Claude Code IDE,""" start="00:10:37.240" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""which is one of three Claude Code packages.""" start="00:10:42.600" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""It's a bit confusing.""" start="00:10:46.840" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""One of them will be demoed by another presenter""" start="00:10:47.720" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""at the Emacs conference, so stay tuned for that.""" start="00:10:52.040" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""Here I'm just going to give you a little taste""" start="00:10:54.640" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""of what these packages look like.""" start="00:10:56.440" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""So if we say Claude Code IDE,""" start="00:10:58.760" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""it presents us with basically""" start="00:11:03.340" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""almost exactly what you would get""" start="00:11:06.840" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""when you're running this in the terminal.""" start="00:11:09.040" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""And essentially there's a terminal interface.""" start="00:11:11.520" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""You can see that there's a vterm.""" start="00:11:13.934" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""But here we're going to say, &quot;In scratch.el&quot;...""" start="00:11:16.660" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""let's say what we want to happen.""" start="00:11:20.700" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""[In scratch.el, there is a fibonacci function.""" start="00:11:23.401" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""Can you add all normal elisp headers""" start="00:11:32.134" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""and footers to this file?]""" start="00:11:39.568" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""So, we just say what's going to happen,""" start="00:11:43.860" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""and this is going to do things in the background.""" start="00:11:45.841" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""It's not going to do things through Emacs.""" start="00:11:48.400" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""That said, there is an integration with Emacs,""" start="00:11:50.980" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""so that it can do things like show you these nice ediffs.""" start="00:11:54.080" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""My screen is not really wide enough""" start="00:12:00.660" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""to show you a really great ediff here,""" start="00:12:03.200" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""but you can kind of see what it's doing,""" start="00:12:04.700" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""and you can see, yeah, that looks good,""" start="00:12:06.240" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""so you could say yes, yes, accept the changes,""" start="00:12:09.080" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""and if we... Just need to revert the buffer.""" start="00:12:14.121" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""We can quit the printout of this.""" start="00:12:25.300" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""We see that it just did everything I asked it to.""" start="00:12:28.460" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""Is everything exactly right?""" start="00:12:33.020" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""Probably not. It's reasonable for a start though.""" start="00:12:36.140" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""But you could ask it to do anything.""" start="00:12:39.160" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""You could say, write unit tests for this, and it will.""" start="00:12:40.960" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""You could say, write me a suite of functions""" start="00:12:45.340" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""like Fibonacci, and it'll probably do something reasonable.""" start="00:12:49.020" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""But you can see this is not editing.""" start="00:12:52.580" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""There's nothing editing-like about this.""" start="00:12:54.901" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""That said, there is something that is editing.""" start="00:12:58.660" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""You need to give it instructions.""" start="00:13:07.160" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""You need to tell it what to do.""" start="00:13:08.600" video="mainVideo-llm" id="subtitle"]]
+
+<div class="transcript-heading">[[!template new="1" text="""Org files""" start="00:13:10.960" video="mainVideo-llm" id="subtitle"]]</div>[[!template text="""And what you could do is... You could have a project.org,""" start="00:13:10.960" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""and what you could do is you could have functions.""" start="00:13:19.620" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""The way I've done things often is ....""" start="00:13:23.900" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""You could say something like,""" start="00:13:26.660" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""unit tests for Fibonacci. How do you spell Fibonacci?""" start="00:13:28.440" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""I don't remember. But then you could say that this is,""" start="00:13:36.200" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""you could clock it, basically. org-clock.""" start="00:13:40.480" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""What I've done is...""" start="00:13:47.160" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""You could add custom commands to Claude Code,""" start="00:13:48.880" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""and you could just say, look, here's my Org file,""" start="00:13:50.400" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""read it and do the thing that I'm clocked in as.""" start="00:13:53.120" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""And then you can write a bunch of instructions here, like,""" start="00:13:57.880" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""I like to use ert for tests. Tests should, like, whatever.""" start="00:14:01.160" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""You should just say... everything""" start="00:14:07.040" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""you need to kind of specify.""" start="00:14:08.640" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""As you get to more complicated tasks,""" start="00:14:11.000" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""it's harder and harder to give it all the context""" start="00:14:13.200" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""it needs for a task,""" start="00:14:16.680" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""and Org Mode is actually a pretty good way to do this.""" start="00:14:17.800" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""I find that this works pretty well,""" start="00:14:22.300" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""and you can even have it instruct Claude""" start="00:14:24.080" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""to just mark things done in your Org file""" start="00:14:26.700" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""when they're done.""" start="00:14:29.334" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""And it knows how to do this, of course.""" start="00:14:30.680" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""So, let's just clock out.""" start="00:14:32.868" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""That's one way to do things.""" start="00:14:37.960" video="mainVideo-llm" id="subtitle"]]
+
+<div class="transcript-heading">[[!template new="1" text="""ECA""" start="00:14:45.240" video="mainVideo-llm" id="subtitle"]]</div>[[!template text="""So one other thing I'd like to show you is eca,""" start="00:14:45.240" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""which, compared to Claude Code, ECA is open source.""" start="00:14:49.500" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""It's very nice in that respect.""" start="00:14:52.880" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""It doesn't have to use Anthropic's models.""" start="00:14:54.240" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""You can use local models,""" start="00:14:57.840" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""but it has the advantage of integrating very well with Emacs.""" start="00:15:00.280" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""I'm not going to demonstrate it,""" start="00:15:07.620" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""because it works essentially the same thing you could do""" start="00:15:08.560" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""approximately the same kinds of things""" start="00:15:11.160" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""you could do with Claude Code.""" start="00:15:14.120" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""You just write what you want to happen""" start="00:15:15.480" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""and it will make it happen.""" start="00:15:17.440" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""It again does not do this through Emacs,""" start="00:15:18.640" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""but what it does do is""" start="00:15:21.880" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""it gives you a much better Emacs interface""" start="00:15:23.040" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""that's not terminal-based,""" start="00:15:25.120" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""because you're not using it through the terminal,""" start="00:15:26.920" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""or not even through comint,""" start="00:15:29.640" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""you are using it through a backend""" start="00:15:31.240" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""that is exchanging structured information""" start="00:15:35.600" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""with this process that is doing all the work.""" start="00:15:37.500" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""But other than that,""" start="00:15:41.000" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""it's the same model as Claude Code""" start="00:15:41.901" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""and projects of that nature.""" start="00:15:44.520" video="mainVideo-llm" id="subtitle"]]
+
+<div class="transcript-heading">[[!template new="1" text="""Editing""" start="00:15:52.060" video="mainVideo-llm" id="subtitle"]]</div>[[!template text="""We've seen in the demos that I gave""" start="00:15:52.060" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""that there are AI experiences""" start="00:15:56.160" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""that are very natural in the world of editing.""" start="00:15:58.640" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""because they, like Copilot, just offers completion,""" start="00:16:01.280" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""it fits very well with what we all do in Emacs.""" start="00:16:05.340" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""And it's truly, yes, it's kind of a cheat in a sense""" start="00:16:09.480" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""for editing experiences,""" start="00:16:14.280" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""because it can do so much, but it's just editing.""" start="00:16:15.640" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""Whereas things like gptel and those kinds of tools,""" start="00:16:20.160" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""they are clearly in an editor and using editor,""" start="00:16:25.260" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""they're using Emacs, but they represent sort of like, well,""" start="00:16:29.800" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""you can edit for a while, then you could use these tools""" start="00:16:35.320" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""to do something that is not editing,""" start="00:16:37.760" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""this AI just changing the buffer for you. And that's fine.""" start="00:16:39.480" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""It's still... It may not be editing,""" start="00:16:45.900" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""but it's still clearly something that""" start="00:16:48.400" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""is useful to do in Emacs""" start="00:16:52.034" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""and belongs in Emacs.""" start="00:16:55.568" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""But the new tools like Claude Code and things like that""" start="00:16:57.040" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""are kind of different.""" start="00:17:01.860" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""Yes, they will get better integrated with Emacs,""" start="00:17:02.640" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""but it's not clear that they really need to.""" start="00:17:06.640" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""They can do a lot of things without editing.""" start="00:17:11.640" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""In a sense, editing is obsolete in some sense.""" start="00:17:15.480" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""For as many tasks, you don't need to edit anymore.""" start="00:17:19.240" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""And that's a nice thing.""" start="00:17:23.460" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""No one really knows when all this will end,""" start="00:17:26.440" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""how far things will go. It could be that in a decade or so,""" start="00:17:30.580" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""no one's really editing for work anymore.""" start="00:17:36.880" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""Maybe you're just writing instructions.""" start="00:17:41.040" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""You could do that with anything.""" start="00:17:43.160" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""You don't need Emacs or any special editor.""" start="00:17:44.320" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""We could all be using Notepad. That would be bad.""" start="00:17:47.440" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""But... I think it could go that far,""" start="00:17:50.440" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""but it could be that, well, for many specialized things,""" start="00:17:58.040" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""people are still using editing for certain tasks,""" start="00:18:01.840" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""but most tasks are getting fed to just...""" start="00:18:04.360" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""AI is just doing those things.""" start="00:18:07.001" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""In any case, I think it's clear that editing is diminishing,""" start="00:18:08.840" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""the need for editing itself is diminishing.""" start="00:18:15.760" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""And in such a world, It's interesting to think""" start="00:18:17.960" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""where Emacs is headed, especially in relation to""" start="00:18:21.880" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""all the other editors.""" start="00:18:24.800" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""I think people will use Emacs less.""" start="00:18:26.360" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""But I think other editors, like VS Code,""" start="00:18:28.600" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""may simply disappear or be a relatively fringe tool.""" start="00:18:31.640" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""And Emacs is going to follow its own path.""" start="00:18:38.000" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""It's very extensible. It could do anything.""" start="00:18:42.720" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""If there's one thing Emacs can do, it's adapt.""" start="00:18:44.680" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""Emacs has been around for a long time.""" start="00:18:47.920" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""It's pretty clear that Emacs will be around for a long time.""" start="00:18:51.680" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""It might be that in the future,""" start="00:18:54.800" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""editing is some sort of like an artisanal activity that we do.""" start="00:18:58.880" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""It's kind of weird to think about it.""" start="00:19:04.340" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""It's not like baking bread.""" start="00:19:05.600" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""But it is the sense that AI might be""" start="00:19:07.680" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""churning out code in the way, you know,""" start="00:19:10.080" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""the factories are turning out bread,""" start="00:19:12.400" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""but if you really want the good stuff,""" start="00:19:14.200" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""you'll have to do it yourself.""" start="00:19:17.140" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""I don't know if it'll be exactly like that,""" start="00:19:21.000" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""but it could be that Emacs survives and thrives""" start="00:19:23.960" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""in a very kind of specialized ecosystem of people""" start="00:19:29.520" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""who contribute and use it in the way""" start="00:19:33.560" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""it has survived and thrive right now.""" start="00:19:35.600" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""And I think that's a really nice way for all this to end up.""" start="00:19:39.540" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""There's the whole sense of how society will end up""" start="00:19:46.140" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""if all this happens. I don't know,""" start="00:19:48.720" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""but Emacs will be there for us when whatever happens.""" start="00:19:50.760" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""So thank you, and let's help make Emacs the best it can be""" start="00:19:54.640" video="mainVideo-llm" id="subtitle"]]
+[[!template text="""to survive and thrive in the next decade.""" start="00:20:00.080" video="mainVideo-llm" id="subtitle"]]
+
+</div>
+
+Captioner: amitav
+
Questions or comments? Please e-mail [ahyatt@gmail.com](mailto:ahyatt@gmail.com?subject=Comment%20for%20EmacsConf%202023%20llm%3A%20Emacs%2C%20editors%2C%20and%20LLM%20driven%20workflows)
diff --git a/2025/info/llm-before.md b/2025/info/llm-before.md
index c2aa1889..f975bb05 100644
--- a/2025/info/llm-before.md
+++ b/2025/info/llm-before.md
@@ -8,12 +8,12 @@ The following image shows where the talk is in the schedule for Sat 2025-12-06.
Format: 21-min talk ; Q&A: BigBlueButton conference room <https://media.emacsconf.org/2025/current/bbb-llm.html> Etherpad: <https://pad.emacsconf.org/2025-llm>
Etherpad: <https://pad.emacsconf.org/2025-llm>
Discuss on IRC: [#emacsconf-dev](https://chat.emacsconf.org/?join=emacsconf,emacsconf-dev)
-Status: Ready to stream
+Status: Q&A open for participation
<div>Times in different time zones:</div><div class="times" start="2025-12-06T18:00:00Z" end="2025-12-06T18:25:00Z"><div class="conf-time">Saturday, Dec 6 2025, ~1:00 PM - 1:25 PM EST (US/Eastern)</div><div class="others"><div>which is the same as:</div>Saturday, Dec 6 2025, ~12:00 PM - 12:25 PM CST (US/Central)<br />Saturday, Dec 6 2025, ~11:00 AM - 11:25 AM MST (US/Mountain)<br />Saturday, Dec 6 2025, ~10:00 AM - 10:25 AM PST (US/Pacific)<br />Saturday, Dec 6 2025, ~6:00 PM - 6:25 PM UTC <br />Saturday, Dec 6 2025, ~7:00 PM - 7:25 PM CET (Europe/Paris)<br />Saturday, Dec 6 2025, ~8:00 PM - 8:25 PM EET (Europe/Athens)<br />Saturday, Dec 6 2025, ~11:30 PM - 11:55 PM IST (Asia/Kolkata)<br />Sunday, Dec 7 2025, ~2:00 AM - 2:25 AM +08 (Asia/Singapore)<br />Sunday, Dec 7 2025, ~3:00 AM - 3:25 AM JST (Asia/Tokyo)</div></div><div><strong><a href="/2025/watch/dev/">Find out how to watch and participate</a></strong></div>
-
+<div class="vid mainVideo"><video controls preload="none" id="mainVideo-llm"><source src="https://media.emacsconf.org/2025/emacsconf-2025-llm--emacs-editors-and-llm-driven-workflows--andrew-hyatt--main.webm" />captions="""<track label="English" kind="captions" srclang="en" src="/2025/captions/emacsconf-2025-llm--emacs-editors-and-llm-driven-workflows--andrew-hyatt--main.vtt" default />"""<p><em>Your browser does not support the video tag. Please download the video instead.</em></p></video><div></div>Duration: 20:04 minutes<div class="files resources"><ul><li><a href="https://pad.emacsconf.org/2025-llm">Open Etherpad</a></li><li><a href="https://media.emacsconf.org/2025/current/bbb-llm.html">Open public Q&A</a></li><li><a href="https://media.emacsconf.org/2025/emacsconf-2025-llm--emacs-editors-and-llm-driven-workflows--andrew-hyatt--intro.vtt">Download --intro.vtt</a></li><li><a href="https://media.emacsconf.org/2025/emacsconf-2025-llm--emacs-editors-and-llm-driven-workflows--andrew-hyatt--intro.webm">Download --intro.webm</a></li><li><a href="https://media.emacsconf.org/2025/emacsconf-2025-llm--emacs-editors-and-llm-driven-workflows--andrew-hyatt--main.opus">Download --main.opus (17MB)</a></li><li><a href="https://media.emacsconf.org/2025/emacsconf-2025-llm--emacs-editors-and-llm-driven-workflows--andrew-hyatt--main.png">Download --main.png</a></li><li><a href="https://media.emacsconf.org/2025/emacsconf-2025-llm--emacs-editors-and-llm-driven-workflows--andrew-hyatt--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2025/emacsconf-2025-llm--emacs-editors-and-llm-driven-workflows--andrew-hyatt--main.webm">Download --main.webm (45MB)</a></li><li><a href="https://youtu.be/U3kbEabBJ_s">View on Youtube</a></li></ul></div></div>
# Description
<!-- End of emacsconf-publish-before-page --> \ No newline at end of file
diff --git a/2025/info/private-ai-before.md b/2025/info/private-ai-before.md
index 8f455e85..9dc6f8dc 100644
--- a/2025/info/private-ai-before.md
+++ b/2025/info/private-ai-before.md
@@ -8,12 +8,12 @@ The following image shows where the talk is in the schedule for Sat 2025-12-06.
Format: 20-min talk ; Q&A: BigBlueButton conference room <https://media.emacsconf.org/2025/current/bbb-private-ai.html> Etherpad: <https://pad.emacsconf.org/2025-private-ai>
Etherpad: <https://pad.emacsconf.org/2025-private-ai>
Discuss on IRC: [#emacsconf-dev](https://chat.emacsconf.org/?join=emacsconf,emacsconf-dev)
-Status: Waiting for video from speaker
+Status: Q&A open for participation
<div>Times in different time zones:</div><div class="times" start="2025-12-06T18:45:00Z" end="2025-12-06T19:05:00Z"><div class="conf-time">Saturday, Dec 6 2025, ~1:45 PM - 2:05 PM EST (US/Eastern)</div><div class="others"><div>which is the same as:</div>Saturday, Dec 6 2025, ~12:45 PM - 1:05 PM CST (US/Central)<br />Saturday, Dec 6 2025, ~11:45 AM - 12:05 PM MST (US/Mountain)<br />Saturday, Dec 6 2025, ~10:45 AM - 11:05 AM PST (US/Pacific)<br />Saturday, Dec 6 2025, ~6:45 PM - 7:05 PM UTC <br />Saturday, Dec 6 2025, ~7:45 PM - 8:05 PM CET (Europe/Paris)<br />Saturday, Dec 6 2025, ~8:45 PM - 9:05 PM EET (Europe/Athens)<br />Sunday, Dec 7 2025, ~12:15 AM - 12:35 AM IST (Asia/Kolkata)<br />Sunday, Dec 7 2025, ~2:45 AM - 3:05 AM +08 (Asia/Singapore)<br />Sunday, Dec 7 2025, ~3:45 AM - 4:05 AM JST (Asia/Tokyo)</div></div><div><strong><a href="/2025/watch/dev/">Find out how to watch and participate</a></strong></div>
-
+<div class="vid mainVideo"><div></div><div class="files resources"><ul><li><a href="https://pad.emacsconf.org/2025-private-ai">Open Etherpad</a></li><li><a href="https://media.emacsconf.org/2025/current/bbb-private-ai.html">Open public Q&A</a></li><li><a href="https://media.emacsconf.org/2025/emacsconf-2025-private-ai--emacs-and-private-ai-a-great-match--aaron-grothe--intro.vtt">Download --intro.vtt</a></li><li><a href="https://media.emacsconf.org/2025/emacsconf-2025-private-ai--emacs-and-private-ai-a-great-match--aaron-grothe--intro.webm">Download --intro.webm</a></li><li><a href="https://media.emacsconf.org/2025/emacsconf-2025-private-ai--emacs-and-private-ai-a-great-match--aaron-grothe--slides.pdf">Download --slides.pdf</a></li></ul></div></div>
# Description
<!-- End of emacsconf-publish-before-page --> \ No newline at end of file
diff --git a/2025/info/python-after.md b/2025/info/python-after.md
index 1c8c84b9..4233580a 100644
--- a/2025/info/python-after.md
+++ b/2025/info/python-after.md
@@ -1,6 +1,258 @@
<!-- Automatically generated by emacsconf-publish-after-page -->
+<div class="transcript transcript-mainVideo"><a name="python-mainVideo-transcript"></a><h1>Transcript</h1>
+
+[[!template text="""Okay, so welcome to this session about interactive Python""" start="00:00:00.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""programming. My name is David Vujic and I live and work in""" start="00:00:04.440" video="mainVideo-python" id="subtitle"]]
+[[!template text="""Stockholm, Sweden. a developer and today I focus""" start="00:00:09.680" video="mainVideo-python" id="subtitle"]]
+[[!template text="""mainly on Python software development. So I do this at work""" start="00:00:15.320" video="mainVideo-python" id="subtitle"]]
+[[!template text="""and I also do this on my spare time in my open source projects.""" start="00:00:20.440" video="mainVideo-python" id="subtitle"]]
+[[!template text="""Before that, I've been part of the Lisp community. I've""" start="00:00:26.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""been a Clojure developer, and also, like, way back,""" start="00:00:30.480" video="mainVideo-python" id="subtitle"]]
+[[!template text="""I was in the Microsoft world and developed C# and .NET stuff.""" start="00:00:33.701" video="mainVideo-python" id="subtitle"]]
+[[!template text="""What I've been doing lately is to try to improve the""" start="00:00:40.280" video="mainVideo-python" id="subtitle"]]
+[[!template text="""developer experience when you write Python code. So what I""" start="00:00:46.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""want to talk about is this, but also I want to begin with""" start="00:00:52.400" video="mainVideo-python" id="subtitle"]]
+[[!template text="""feedback loops because I think it's very related to this""" start="00:00:56.160" video="mainVideo-python" id="subtitle"]]
+[[!template text="""interactive programming style, like having this nice""" start="00:01:00.840" video="mainVideo-python" id="subtitle"]]
+[[!template text="""feedback when you write code.""" start="00:01:05.360" video="mainVideo-python" id="subtitle"]]
+[[!template text="""So I'm going to begin with that.""" start="00:01:07.068" video="mainVideo-python" id="subtitle"]]
+
+<div class="transcript-heading">[[!template new="1" text="""Feedback loops""" start="00:01:10.534" video="mainVideo-python" id="subtitle"]]</div>[[!template text="""So this image, you know, this circle is supposed to be a""" start="00:01:10.534" video="mainVideo-python" id="subtitle"]]
+[[!template text="""visualization of a feedback loop. Let's say we write our""" start="00:01:14.200" video="mainVideo-python" id="subtitle"]]
+[[!template text="""code and then we deploy it to production. Then when it's""" start="00:01:19.880" video="mainVideo-python" id="subtitle"]]
+[[!template text="""running there, we can check if things work, or if maybe someone""" start="00:01:25.240" video="mainVideo-python" id="subtitle"]]
+[[!template text="""else will let us know. Maybe our customers will let us know.""" start="00:01:29.640" video="mainVideo-python" id="subtitle"]]
+[[!template text="""That's a pretty slow feedback loop with potential risks of""" start="00:01:35.320" video="mainVideo-python" id="subtitle"]]
+[[!template text="""damaging your business or whatever.""" start="00:01:39.640" video="mainVideo-python" id="subtitle"]]
+[[!template text="""This is obvious, of course.""" start="00:01:41.868" video="mainVideo-python" id="subtitle"]]
+[[!template text="""So a faster feedback loop probably is to have""" start="00:01:44.168" video="mainVideo-python" id="subtitle"]]
+[[!template text="""some kind of automation when you do commits""" start="00:01:50.001" video="mainVideo-python" id="subtitle"]]
+[[!template text="""or maybe you have this pull request things and even reviews.""" start="00:01:54.067" video="mainVideo-python" id="subtitle"]]
+[[!template text="""So maybe not always as fast as deploy,""" start="00:01:59.734" video="mainVideo-python" id="subtitle"]]
+[[!template text="""don't deploy directly to production, but""" start="00:02:02.934" video="mainVideo-python" id="subtitle"]]
+[[!template text="""it's probably safer and often you get this automated""" start="00:02:05.840" video="mainVideo-python" id="subtitle"]]
+[[!template text="""feedback faster anyway. But it's still kind of slow. You""" start="00:02:10.540" video="mainVideo-python" id="subtitle"]]
+[[!template text="""have to wait. You have to push things to GitHub maybe and""" start="00:02:16.200" video="mainVideo-python" id="subtitle"]]
+[[!template text="""wait. So there's faster ways for sure to get feedback.""" start="00:02:20.240" video="mainVideo-python" id="subtitle"]]
+[[!template text="""So a much faster way is to write code,""" start="00:02:24.280" video="mainVideo-python" id="subtitle"]]
+[[!template text="""and write some unit tests, and run those unit tests.""" start="00:02:27.968" video="mainVideo-python" id="subtitle"]]
+[[!template text="""So then you do everything on your local machine""" start="00:02:31.368" video="mainVideo-python" id="subtitle"]]
+[[!template text="""and you will fairly quickly learn if your code does""" start="00:02:33.468" video="mainVideo-python" id="subtitle"]]
+[[!template text="""what you think it does or if it doesn't. I want to zoom in to""" start="00:02:39.040" video="mainVideo-python" id="subtitle"]]
+[[!template text="""this test write code and test flow a bit. Let's do that.""" start="00:02:47.160" video="mainVideo-python" id="subtitle"]]
+
+<div class="transcript-heading">[[!template new="1" text="""Test-driven development""" start="00:02:56.000" video="mainVideo-python" id="subtitle"]]</div>[[!template text="""As a developer, I have used a thing called test-driven""" start="00:02:56.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""development for quite some time. I find that this way of""" start="00:02:59.760" video="mainVideo-python" id="subtitle"]]
+[[!template text="""working is very fast when it comes to getting feedback on""" start="00:03:06.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""what your code does and how you should continue the""" start="00:03:11.260" video="mainVideo-python" id="subtitle"]]
+[[!template text="""development. So, test-driven development,""" start="00:03:14.520" video="mainVideo-python" id="subtitle"]]
+[[!template text="""basically that you start writing a test for""" start="00:03:19.981" video="mainVideo-python" id="subtitle"]]
+[[!template text="""something that you want to develop, and then you continue""" start="00:03:24.221" video="mainVideo-python" id="subtitle"]]
+[[!template text="""developing that, and then you go back to the test, and modify""" start="00:03:27.021" video="mainVideo-python" id="subtitle"]]
+[[!template text="""and modify the code, and you go back and forth between the""" start="00:03:31.020" video="mainVideo-python" id="subtitle"]]
+[[!template text="""tests and the code.""" start="00:03:35.080" video="mainVideo-python" id="subtitle"]]
+[[!template text="""It's sort of like a ping-pong game. I find this very""" start="00:03:36.960" video="mainVideo-python" id="subtitle"]]
+[[!template text="""effective when you want to get feedback and to know how to""" start="00:03:44.420" video="mainVideo-python" id="subtitle"]]
+[[!template text="""continue the development. The most important thing""" start="00:03:50.520" video="mainVideo-python" id="subtitle"]]
+[[!template text="""that I feel is that you know what the code does.""" start="00:03:57.234" video="mainVideo-python" id="subtitle"]]
+[[!template text="""You learn very quickly.""" start="00:04:01.701" video="mainVideo-python" id="subtitle"]]
+
+<div class="transcript-heading">[[!template new="1" text="""REPL-driven development""" start="00:04:05.560" video="mainVideo-python" id="subtitle"]]</div>[[!template text="""Let's zoom into this TDD flow a little bit. The last couple of""" start="00:04:05.560" video="mainVideo-python" id="subtitle"]]
+[[!template text="""years, I've been doing a slightly different thing which is""" start="00:04:12.200" video="mainVideo-python" id="subtitle"]]
+[[!template text="""called REPL-driven development. REPL-driven""" start="00:04:17.380" video="mainVideo-python" id="subtitle"]]
+[[!template text="""development is very similar to test-driven development,""" start="00:04:21.980" video="mainVideo-python" id="subtitle"]]
+[[!template text="""but I find it even quicker. You get feedback even quicker""" start="00:04:25.720" video="mainVideo-python" id="subtitle"]]
+[[!template text="""than with a regular TDD setup. So REPL-driven development""" start="00:04:31.160" video="mainVideo-python" id="subtitle"]]
+[[!template text="""is about writing and evaluating code in a REPL basically.""" start="00:04:34.980" video="mainVideo-python" id="subtitle"]]
+[[!template text="""And you can do experiments and you can refactor and""" start="00:04:41.200" video="mainVideo-python" id="subtitle"]]
+[[!template text="""re-evaluate and you get instant feedback on what the code""" start="00:04:46.840" video="mainVideo-python" id="subtitle"]]
+[[!template text="""does and what you need to change. So I think that's even""" start="00:04:51.700" video="mainVideo-python" id="subtitle"]]
+[[!template text="""faster than test-driven development.""" start="00:04:54.800" video="mainVideo-python" id="subtitle"]]
+[[!template text="""Okay, REPL driven development. Let's go back. What's the""" start="00:04:59.520" video="mainVideo-python" id="subtitle"]]
+[[!template text="""REPL? Most of developers know what a REPL is. The most common""" start="00:05:02.900" video="mainVideo-python" id="subtitle"]]
+[[!template text="""setup is you open this shell and you use the REPL for your""" start="00:05:10.760" video="mainVideo-python" id="subtitle"]]
+[[!template text="""programming language. In this case I'm using the Python""" start="00:05:16.400" video="mainVideo-python" id="subtitle"]]
+[[!template text="""REPL or the IPython REPL which is an enhanced REPL for Python""" start="00:05:19.360" video="mainVideo-python" id="subtitle"]]
+[[!template text="""development. So what happens here is that we start a REPL""" start="00:05:25.620" video="mainVideo-python" id="subtitle"]]
+[[!template text="""session in isolation. So this session knows about the""" start="00:05:30.680" video="mainVideo-python" id="subtitle"]]
+[[!template text="""Python environment. So it knows about the Python language""" start="00:05:34.920" video="mainVideo-python" id="subtitle"]]
+[[!template text="""basically. So as soon as we start writing things, adding""" start="00:05:38.120" video="mainVideo-python" id="subtitle"]]
+[[!template text="""variables or creating writing functions or even doing""" start="00:05:42.360" video="mainVideo-python" id="subtitle"]]
+[[!template text="""imports. Then the session will be more and more aware of the""" start="00:05:47.360" video="mainVideo-python" id="subtitle"]]
+[[!template text="""code so we will add things to the to the session and then that""" start="00:05:51.680" video="mainVideo-python" id="subtitle"]]
+[[!template text="""means that we can run functions we can print out these""" start="00:05:55.820" video="mainVideo-python" id="subtitle"]]
+[[!template text="""variables and things like that. But with REPL driven""" start="00:06:00.520" video="mainVideo-python" id="subtitle"]]
+[[!template text="""development it's not really that well at least not what I""" start="00:06:05.860" video="mainVideo-python" id="subtitle"]]
+[[!template text="""mean with REPL driven development. So what I'm thinking of""" start="00:06:09.840" video="mainVideo-python" id="subtitle"]]
+[[!template text="""is that you are in your code editor where you have your""" start="00:06:14.040" video="mainVideo-python" id="subtitle"]]
+[[!template text="""autocomplete, and you have your syntax highlighting and""" start="00:06:19.640" video="mainVideo-python" id="subtitle"]]
+[[!template text="""your favorite theme, color theme, and all of those things. But""" start="00:06:22.800" video="mainVideo-python" id="subtitle"]]
+[[!template text="""instead, you have this running REPL in the background or in a""" start="00:06:30.460" video="mainVideo-python" id="subtitle"]]
+[[!template text="""smaller window or buffer. So that means that you write code""" start="00:06:34.980" video="mainVideo-python" id="subtitle"]]
+[[!template text="""and you can send that code to the running REPL, to the REPL""" start="00:06:41.140" video="mainVideo-python" id="subtitle"]]
+[[!template text="""session. You write and do everything as you would do when""" start="00:06:45.320" video="mainVideo-python" id="subtitle"]]
+[[!template text="""writing your code basically. In this case, in this""" start="00:06:50.400" video="mainVideo-python" id="subtitle"]]
+[[!template text="""example, I have evaluated these two functions. I've sent""" start="00:06:55.220" video="mainVideo-python" id="subtitle"]]
+[[!template text="""them to the REPL session so it's aware of these functions.""" start="00:07:00.600" video="mainVideo-python" id="subtitle"]]
+[[!template text="""Then I switched to a separate different module and""" start="00:07:05.820" video="mainVideo-python" id="subtitle"]]
+[[!template text="""evaluated that one. So the REPL session now knows about""" start="00:07:10.400" video="mainVideo-python" id="subtitle"]]
+[[!template text="""these two functions and also these two variables. That""" start="00:07:14.040" video="mainVideo-python" id="subtitle"]]
+[[!template text="""means that I can evaluate the state of those variables and""" start="00:07:19.040" video="mainVideo-python" id="subtitle"]]
+[[!template text="""change code and re-evaluate and things like that. So in this""" start="00:07:24.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""example if you look in the smaller area there you see that I""" start="00:07:29.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""have evaluated this res variable on line 6 and the output was""" start="00:07:33.640" video="mainVideo-python" id="subtitle"]]
+[[!template text="""that it's a dictionary with two keys and two values""" start="00:07:39.640" video="mainVideo-python" id="subtitle"]]
+[[!template text="""basically. So this setup works in basically any of your""" start="00:07:42.400" video="mainVideo-python" id="subtitle"]]
+[[!template text="""favorite code editors. So you can do this in Visual Studio""" start="00:07:51.220" video="mainVideo-python" id="subtitle"]]
+[[!template text="""Code, you can do this in PyCharm or Vim. But what I have done is""" start="00:07:54.080" video="mainVideo-python" id="subtitle"]]
+[[!template text="""that... More like what I have missed is that when I write code""" start="00:08:01.240" video="mainVideo-python" id="subtitle"]]
+[[!template text="""and do this evaluation, this is really cool, but then I need""" start="00:08:07.120" video="mainVideo-python" id="subtitle"]]
+[[!template text="""to switch context if I want to see the result. I have to switch""" start="00:08:10.240" video="mainVideo-python" id="subtitle"]]
+[[!template text="""context to this other window. I""" start="00:08:15.460" video="mainVideo-python" id="subtitle"]]
+[[!template text="""have my focus on the code and then I have to look in a different""" start="00:08:21.980" video="mainVideo-python" id="subtitle"]]
+[[!template text="""place to know the results. And if it's a larger output, then""" start="00:08:25.760" video="mainVideo-python" id="subtitle"]]
+[[!template text="""maybe I need to scroll. So I wanted to find out if it was""" start="00:08:31.800" video="mainVideo-python" id="subtitle"]]
+[[!template text="""possible to make this even smoother and faster, this""" start="00:08:37.480" video="mainVideo-python" id="subtitle"]]
+[[!template text="""feedback loop even faster, so I don't have to switch""" start="00:08:43.480" video="mainVideo-python" id="subtitle"]]
+[[!template text="""context. What I've done here is that... I can select a row or a""" start="00:08:45.480" video="mainVideo-python" id="subtitle"]]
+[[!template text="""region and I can evaluate and then an overlay, a small pop-up""" start="00:08:52.120" video="mainVideo-python" id="subtitle"]]
+[[!template text="""shows up with the evaluated result right next to it. So I can""" start="00:08:58.080" video="mainVideo-python" id="subtitle"]]
+[[!template text="""change code and re-evaluate and quickly see the result of it""" start="00:09:03.120" video="mainVideo-python" id="subtitle"]]
+[[!template text="""without doing this context switching. So the way I've done""" start="00:09:07.520" video="mainVideo-python" id="subtitle"]]
+[[!template text="""it is that I wanted to reuse the existing tooling that I""" start="00:09:12.641" video="mainVideo-python" id="subtitle"]]
+[[!template text="""already had. I know that my in-editor REPL, the IPython""" start="00:09:20.680" video="mainVideo-python" id="subtitle"]]
+[[!template text="""REPL, already does this evaluation. So I figured maybe I can""" start="00:09:27.740" video="mainVideo-python" id="subtitle"]]
+[[!template text="""extract the data and do this visualization as a separate""" start="00:09:31.560" video="mainVideo-python" id="subtitle"]]
+[[!template text="""thing. That's how I've done it. What I've done is that""" start="00:09:35.360" video="mainVideo-python" id="subtitle"]]
+[[!template text="""I've created this overlay and placed it where my cursor""" start="00:09:40.840" video="mainVideo-python" id="subtitle"]]
+[[!template text="""currently is, right next to the code. Then I've""" start="00:09:47.200" video="mainVideo-python" id="subtitle"]]
+[[!template text="""extracted the evaluated result and put it in this overlay.""" start="00:09:50.860" video="mainVideo-python" id="subtitle"]]
+[[!template text="""I also want this overlay to have this nice looking syntax,""" start="00:09:55.720" video="mainVideo-python" id="subtitle"]]
+[[!template text="""so I've set it to this Python mode, so we get this syntax""" start="00:10:01.040" video="mainVideo-python" id="subtitle"]]
+[[!template text="""highlighting. Make it look very readable. And as a nice""" start="00:10:04.760" video="mainVideo-python" id="subtitle"]]
+[[!template text="""developer experience thing,""" start="00:10:10.560" video="mainVideo-python" id="subtitle"]]
+[[!template text="""when you move the cursor, of course you don't want the""" start="00:10:16.880" video="mainVideo-python" id="subtitle"]]
+[[!template text="""overlay to be there. You want it to disappear. So those kinds""" start="00:10:20.380" video="mainVideo-python" id="subtitle"]]
+[[!template text="""of things I've added. So putting the overlay at the right""" start="00:10:25.680" video="mainVideo-python" id="subtitle"]]
+[[!template text="""place and feed it with the evaluated data and then make it""" start="00:10:29.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""disappear when it's not interesting to look at anymore.""" start="00:10:33.280" video="mainVideo-python" id="subtitle"]]
+[[!template text="""What I've described so far is something that I use on a""" start="00:10:39.840" video="mainVideo-python" id="subtitle"]]
+[[!template text="""daily basis, and it covers most of my needs while doing Python""" start="00:10:44.640" video="mainVideo-python" id="subtitle"]]
+[[!template text="""development. But one thing I still miss, and I miss it from my""" start="00:10:50.640" video="mainVideo-python" id="subtitle"]]
+[[!template text="""days as a Clojure developer, because over there we could""" start="00:10:56.120" video="mainVideo-python" id="subtitle"]]
+[[!template text="""have a running app on our local machine and we can have our""" start="00:11:03.480" video="mainVideo-python" id="subtitle"]]
+[[!template text="""editor, and the app and the editor were connected. So when I""" start="00:11:07.920" video="mainVideo-python" id="subtitle"]]
+[[!template text="""did some changes in the code, the app would change without""" start="00:11:12.720" video="mainVideo-python" id="subtitle"]]
+[[!template text="""any restarts or anything like that. And the same if I would""" start="00:11:17.200" video="mainVideo-python" id="subtitle"]]
+[[!template text="""change the state of the app, I can inspect the state from the""" start="00:11:20.560" video="mainVideo-python" id="subtitle"]]
+[[!template text="""code. So they were connected. They are connected. So I was""" start="00:11:24.680" video="mainVideo-python" id="subtitle"]]
+[[!template text="""thinking, hey, this would be really cool if we could have""" start="00:11:28.920" video="mainVideo-python" id="subtitle"]]
+[[!template text="""something like this in Python. And that reminded me of""" start="00:11:32.840" video="mainVideo-python" id="subtitle"]]
+[[!template text="""Jupyter and Jupyter notebooks because I think notebooks,""" start="00:11:39.200" video="mainVideo-python" id="subtitle"]]
+[[!template text="""the way you do things there, is very similar to what I was""" start="00:11:43.840" video="mainVideo-python" id="subtitle"]]
+[[!template text="""trying to achieve. So I was reading up a little bit on how this""" start="00:11:49.660" video="mainVideo-python" id="subtitle"]]
+[[!template text="""notebook thing works. It turns out that a notebook is a""" start="00:11:56.880" video="mainVideo-python" id="subtitle"]]
+[[!template text="""client that talks to a server, that communicates with a""" start="00:12:00.920" video="mainVideo-python" id="subtitle"]]
+[[!template text="""server. It's on the server that all this Python""" start="00:12:05.280" video="mainVideo-python" id="subtitle"]]
+[[!template text="""evaluation and all this thing happens. Then what I've""" start="00:12:08.800" video="mainVideo-python" id="subtitle"]]
+[[!template text="""done is that instead of starting up IPython in my editor, I""" start="00:12:14.160" video="mainVideo-python" id="subtitle"]]
+[[!template text="""start the Jupyter console instead. And then I can give it""" start="00:12:19.660" video="mainVideo-python" id="subtitle"]]
+[[!template text="""that unique ID and it will be connected to that running""" start="00:12:23.520" video="mainVideo-python" id="subtitle"]]
+[[!template text="""kernel.""" start="00:12:27.160" video="mainVideo-python" id="subtitle"]]
+
+<div class="transcript-heading">[[!template new="1" text="""FastAPI CRUD""" start="00:12:30.920" video="mainVideo-python" id="subtitle"]]</div>[[!template text="""In this example, I've created this FastAPI CRUD app that""" start="00:12:30.920" video="mainVideo-python" id="subtitle"]]
+[[!template text="""has this create, read, update, and delete endpoints. It""" start="00:12:37.200" video="mainVideo-python" id="subtitle"]]
+[[!template text="""has this, it's locally running, it has this database where""" start="00:12:41.920" video="mainVideo-python" id="subtitle"]]
+[[!template text="""you can do all these things. I'm running this FastAPI app""" start="00:12:46.400" video="mainVideo-python" id="subtitle"]]
+[[!template text="""in the kernel and then I've connected to, I've connected to""" start="00:12:51.640" video="mainVideo-python" id="subtitle"]]
+[[!template text="""the kernel in my editor too. Both of them are connected to""" start="00:12:58.060" video="mainVideo-python" id="subtitle"]]
+[[!template text="""the kernel. What I do now is that I want to initially create""" start="00:13:03.240" video="mainVideo-python" id="subtitle"]]
+[[!template text="""some data. I'm going to add this, creating this message.""" start="00:13:09.720" video="mainVideo-python" id="subtitle"]]
+[[!template text="""What I get back is a message ID. I want to experiment in""" start="00:13:15.240" video="mainVideo-python" id="subtitle"]]
+[[!template text="""my browser. What do I get with that message ID? I'm""" start="00:13:19.900" video="mainVideo-python" id="subtitle"]]
+[[!template text="""evaluating the read function. I instantly get this""" start="00:13:24.360" video="mainVideo-python" id="subtitle"]]
+[[!template text="""evaluated result, which was this hello world text. So what""" start="00:13:30.240" video="mainVideo-python" id="subtitle"]]
+[[!template text="""happens if I do some changes in this app? I'm going to grab""" start="00:13:34.780" video="mainVideo-python" id="subtitle"]]
+[[!template text="""this message ID and write something else.""" start="00:13:39.920" video="mainVideo-python" id="subtitle"]]
+[[!template text="""Now I can evaluate the same thing again, and you can see that""" start="00:13:49.660" video="mainVideo-python" id="subtitle"]]
+[[!template text="""the content has changed to this new value. My editor isn't""" start="00:13:53.760" video="mainVideo-python" id="subtitle"]]
+[[!template text="""in any debug mode or something like that. It doesn't know""" start="00:14:02.400" video="mainVideo-python" id="subtitle"]]
+[[!template text="""what database it is. It doesn't have any environment""" start="00:14:07.720" video="mainVideo-python" id="subtitle"]]
+[[!template text="""variables set up or something like that. It is only""" start="00:14:11.240" video="mainVideo-python" id="subtitle"]]
+[[!template text="""connected to the kernel, and the kernel is aware of that. It's""" start="00:14:14.480" video="mainVideo-python" id="subtitle"]]
+[[!template text="""running the app. It has the connection strings and""" start="00:14:17.600" video="mainVideo-python" id="subtitle"]]
+[[!template text="""everything that is needed. So that's how this thing works.""" start="00:14:20.480" video="mainVideo-python" id="subtitle"]]
+[[!template text="""Now I want to do some inline hacking because I want to store""" start="00:14:28.800" video="mainVideo-python" id="subtitle"]]
+[[!template text="""this input that is sent from this app because I want to work""" start="00:14:34.200" video="mainVideo-python" id="subtitle"]]
+[[!template text="""with it afterwards. I can add this dictionary that stores""" start="00:14:37.800" video="mainVideo-python" id="subtitle"]]
+[[!template text="""this message. I'm updating the source code of this app, and""" start="00:14:42.040" video="mainVideo-python" id="subtitle"]]
+[[!template text="""when I run any of these endpoints again, you will see that""" start="00:14:48.760" video="mainVideo-python" id="subtitle"]]
+[[!template text="""the state changes, and the new inputs, I can grab and I can use""" start="00:15:03.080" video="mainVideo-python" id="subtitle"]]
+[[!template text="""them for quick evaluation or testing. This example is""" start="00:15:08.760" video="mainVideo-python" id="subtitle"]]
+[[!template text="""really simple. It was just an integer. For example, if you""" start="00:15:14.400" video="mainVideo-python" id="subtitle"]]
+[[!template text="""are sending a more complex object, maybe a pydantic schema""" start="00:15:18.520" video="mainVideo-python" id="subtitle"]]
+[[!template text="""or something, and you want to inspect what's coming in, and if""" start="00:15:23.520" video="mainVideo-python" id="subtitle"]]
+[[!template text="""you have some sort of validation that you want to test out.""" start="00:15:28.200" video="mainVideo-python" id="subtitle"]]
+[[!template text="""The configuration or the code that I wrote to make this work""" start="00:15:34.200" video="mainVideo-python" id="subtitle"]]
+[[!template text="""is a little bit different than just adding an overlay. I'm""" start="00:15:38.400" video="mainVideo-python" id="subtitle"]]
+[[!template text="""using this overlay just like with the IPython example, but in""" start="00:15:44.160" video="mainVideo-python" id="subtitle"]]
+[[!template text="""this case, when I change code, I have to think about where that""" start="00:15:51.000" video="mainVideo-python" id="subtitle"]]
+[[!template text="""code lives, because it's the app that runs the code. So it's""" start="00:15:57.840" video="mainVideo-python" id="subtitle"]]
+[[!template text="""in the app context I need to manipulate with the data. If you""" start="00:16:02.160" video="mainVideo-python" id="subtitle"]]
+[[!template text="""have started the app from maybe a main function and that""" start="00:16:07.040" video="mainVideo-python" id="subtitle"]]
+[[!template text="""module imports namespaces, then you need to, if you want to""" start="00:16:11.920" video="mainVideo-python" id="subtitle"]]
+[[!template text="""update a function or something like that, you need to update""" start="00:16:17.880" video="mainVideo-python" id="subtitle"]]
+[[!template text="""it in the correct namespace. What I did before in IPython""" start="00:16:22.360" video="mainVideo-python" id="subtitle"]]
+[[!template text="""by adding and changing things, everything ends up in the""" start="00:16:26.680" video="mainVideo-python" id="subtitle"]]
+[[!template text="""global namespace. But here, if you want the app to actually""" start="00:16:29.920" video="mainVideo-python" id="subtitle"]]
+[[!template text="""react to the changes, you need to put it in the right""" start="00:16:34.440" video="mainVideo-python" id="subtitle"]]
+[[!template text="""namespace. So that's what I do here. I do some lookups, where""" start="00:16:38.480" video="mainVideo-python" id="subtitle"]]
+[[!template text="""is this function, and then I do this reload of this function or""" start="00:16:43.480" video="mainVideo-python" id="subtitle"]]
+[[!template text="""module. And when I was developing this, I was thinking, hey,""" start="00:16:49.140" video="mainVideo-python" id="subtitle"]]
+[[!template text="""this is really ugly. I'm in this REPL and do some""" start="00:16:54.800" video="mainVideo-python" id="subtitle"]]
+[[!template text="""manipulation of the imports and things like that. That""" start="00:16:59.320" video="mainVideo-python" id="subtitle"]]
+[[!template text="""didn't feel good. Then I was reminded of the IPython. And""" start="00:17:03.560" video="mainVideo-python" id="subtitle"]]
+[[!template text="""IPython has this feature to reload any updated""" start="00:17:09.760" video="mainVideo-python" id="subtitle"]]
+[[!template text="""submodules. I was curious how do they do it. I looked in the""" start="00:17:15.520" video="mainVideo-python" id="subtitle"]]
+[[!template text="""IPython source code and saw that they also use importlib and""" start="00:17:19.120" video="mainVideo-python" id="subtitle"]]
+[[!template text="""reloading of this module. Once I've learned that, then I""" start="00:17:24.080" video="mainVideo-python" id="subtitle"]]
+[[!template text="""stopped thinking that my code was hacky. I thought it was""" start="00:17:28.360" video="mainVideo-python" id="subtitle"]]
+[[!template text="""good enough at least.""" start="00:17:32.600" video="mainVideo-python" id="subtitle"]]
+
+<div class="transcript-heading">[[!template new="1" text="""Testing with an LLM""" start="00:17:37.160" video="mainVideo-python" id="subtitle"]]</div>[[!template text="""But one thing that has bothered me for a long time is I quite""" start="00:17:37.160" video="mainVideo-python" id="subtitle"]]
+[[!template text="""often want to test out and evaluate individual rows that""" start="00:17:45.060" video="mainVideo-python" id="subtitle"]]
+[[!template text="""lives in a function. Quite often, this code uses the input""" start="00:17:50.200" video="mainVideo-python" id="subtitle"]]
+[[!template text="""to that function like the input parameters. To be able to""" start="00:17:58.560" video="mainVideo-python" id="subtitle"]]
+[[!template text="""do that, I need to manually type some fake data and set it to""" start="00:18:02.640" video="mainVideo-python" id="subtitle"]]
+[[!template text="""this variable, and then I can evaluate the code. But I think""" start="00:18:07.720" video="mainVideo-python" id="subtitle"]]
+[[!template text="""that takes... That slows me down. I was thinking, maybe I can""" start="00:18:12.280" video="mainVideo-python" id="subtitle"]]
+[[!template text="""do this in a quicker way, so I have this quicker feedback, so I""" start="00:18:17.780" video="mainVideo-python" id="subtitle"]]
+[[!template text="""can run this or evaluate this code much quicker.""" start="00:18:23.440" video="mainVideo-python" id="subtitle"]]
+[[!template text="""So my idea was maybe I""" start="00:18:27.934" video="mainVideo-python" id="subtitle"]]
+[[!template text="""can use an LLM for this. If I give it the parameters, maybe it""" start="00:18:29.440" video="mainVideo-python" id="subtitle"]]
+[[!template text="""can return some random data so I don't have to write it""" start="00:18:35.240" video="mainVideo-python" id="subtitle"]]
+[[!template text="""myself. I ended up doing that. I have this source code.""" start="00:18:41.120" video="mainVideo-python" id="subtitle"]]
+[[!template text="""I'm loading the REPL with the code. Then I select this""" start="00:18:44.120" video="mainVideo-python" id="subtitle"]]
+[[!template text="""function name and the parameters with its data type. I""" start="00:18:50.400" video="mainVideo-python" id="subtitle"]]
+[[!template text="""have this prompt that instructs the LLM to come up with fake""" start="00:18:56.720" video="mainVideo-python" id="subtitle"]]
+[[!template text="""data based on the tag name and on the data type. And then I can""" start="00:19:02.840" video="mainVideo-python" id="subtitle"]]
+[[!template text="""send that to the REPL. I do that with a key command. Then""" start="00:19:06.240" video="mainVideo-python" id="subtitle"]]
+[[!template text="""I can proceed by running the code within the function that""" start="00:19:10.100" video="mainVideo-python" id="subtitle"]]
+[[!template text="""uses these inputs. This works for all the data types. If""" start="00:19:16.020" video="mainVideo-python" id="subtitle"]]
+[[!template text="""there's a custom data type, you need to give the LLM extra""" start="00:19:21.720" video="mainVideo-python" id="subtitle"]]
+[[!template text="""context. So that's something to think about. Once it knows""" start="00:19:26.280" video="mainVideo-python" id="subtitle"]]
+[[!template text="""the context, it can generate this fake data that very often is""" start="00:19:30.400" video="mainVideo-python" id="subtitle"]]
+[[!template text="""good enough just to test out, you know, like I've done here, like""" start="00:19:35.680" video="mainVideo-python" id="subtitle"]]
+[[!template text="""string... sorry, list destructuring and parsing and things""" start="00:19:39.840" video="mainVideo-python" id="subtitle"]]
+[[!template text="""like that. I think that was all I had, and thank you for""" start="00:19:45.400" video="mainVideo-python" id="subtitle"]]
+[[!template text="""listening!""" start="00:19:51.880" video="mainVideo-python" id="subtitle"]]
+
+</div>
+
+Captioner: sachac
+
Questions or comments? Please e-mail [emacsconf-org-private@gnu.org](mailto:emacsconf-org-private@gnu.org?subject=Comment%20for%20EmacsConf%202023%20python%3A%20Interactive%20Python%20programming%20in%20Emacs)
diff --git a/2025/info/python-before.md b/2025/info/python-before.md
index 9ca1dbc0..d2eb7152 100644
--- a/2025/info/python-before.md
+++ b/2025/info/python-before.md
@@ -8,12 +8,12 @@ The following image shows where the talk is in the schedule for Sat 2025-12-06.
Format: 20-min talk ; Q&A: BigBlueButton conference room <https://media.emacsconf.org/2025/current/bbb-python.html> Etherpad: <https://pad.emacsconf.org/2025-python>
Etherpad: <https://pad.emacsconf.org/2025-python>
Discuss on IRC: [#emacsconf-dev](https://chat.emacsconf.org/?join=emacsconf,emacsconf-dev)
-Status: Ready to stream
+Status: Q&A open for participation
<div>Times in different time zones:</div><div class="times" start="2025-12-06T16:20:00Z" end="2025-12-06T16:40:00Z"><div class="conf-time">Saturday, Dec 6 2025, ~11:20 AM - 11:40 AM EST (US/Eastern)</div><div class="others"><div>which is the same as:</div>Saturday, Dec 6 2025, ~10:20 AM - 10:40 AM CST (US/Central)<br />Saturday, Dec 6 2025, ~9:20 AM - 9:40 AM MST (US/Mountain)<br />Saturday, Dec 6 2025, ~8:20 AM - 8:40 AM PST (US/Pacific)<br />Saturday, Dec 6 2025, ~4:20 PM - 4:40 PM UTC <br />Saturday, Dec 6 2025, ~5:20 PM - 5:40 PM CET (Europe/Paris)<br />Saturday, Dec 6 2025, ~6:20 PM - 6:40 PM EET (Europe/Athens)<br />Saturday, Dec 6 2025, ~9:50 PM - 10:10 PM IST (Asia/Kolkata)<br />Sunday, Dec 7 2025, ~12:20 AM - 12:40 AM +08 (Asia/Singapore)<br />Sunday, Dec 7 2025, ~1:20 AM - 1:40 AM JST (Asia/Tokyo)</div></div><div><strong><a href="/2025/watch/dev/">Find out how to watch and participate</a></strong></div>
-
+<div class="vid mainVideo"><video controls preload="none" id="mainVideo-python"><source src="https://media.emacsconf.org/2025/emacsconf-2025-python--interactive-python-programming-in-emacs--david-vujic--main.webm" />captions="""<track label="English" kind="captions" srclang="en" src="/2025/captions/emacsconf-2025-python--interactive-python-programming-in-emacs--david-vujic--main.vtt" default />"""<p><em>Your browser does not support the video tag. Please download the video instead.</em></p></video><div></div>Duration: 19:52 minutes<div class="files resources"><ul><li><a href="https://pad.emacsconf.org/2025-python">Open Etherpad</a></li><li><a href="https://media.emacsconf.org/2025/current/bbb-python.html">Open public Q&A</a></li><li><a href="https://media.emacsconf.org/2025/emacsconf-2025-python--interactive-python-programming-in-emacs--david-vujic--intro.vtt">Download --intro.vtt</a></li><li><a href="https://media.emacsconf.org/2025/emacsconf-2025-python--interactive-python-programming-in-emacs--david-vujic--intro.webm">Download --intro.webm</a></li><li><a href="https://media.emacsconf.org/2025/emacsconf-2025-python--interactive-python-programming-in-emacs--david-vujic--main.opus">Download --main.opus (11MB)</a></li><li><a href="https://media.emacsconf.org/2025/emacsconf-2025-python--interactive-python-programming-in-emacs--david-vujic--main.png">Download --main.png</a></li><li><a href="https://media.emacsconf.org/2025/emacsconf-2025-python--interactive-python-programming-in-emacs--david-vujic--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2025/emacsconf-2025-python--interactive-python-programming-in-emacs--david-vujic--main.webm">Download --main.webm (37MB)</a></li><li><a href="https://youtu.be/uACM4a5MPQM">View on Youtube</a></li></ul></div></div>
# Description
<!-- End of emacsconf-publish-before-page --> \ No newline at end of file
diff --git a/2025/info/swanky-after.md b/2025/info/swanky-after.md
index 9386bdb6..53c84315 100644
--- a/2025/info/swanky-after.md
+++ b/2025/info/swanky-after.md
@@ -1,6 +1,386 @@
<!-- Automatically generated by emacsconf-publish-after-page -->
+<div class="transcript transcript-mainVideo"><a name="swanky-mainVideo-transcript"></a><h1>Transcript</h1>
+
+[[!template text="""Hello everyone, I'm Scott""" start="00:00:00.880" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""and I'll be talking about Swanky Python,""" start="00:00:02.440" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""which is a development environment for Python""" start="00:00:04.240" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""based on Emacs' Slime package.""" start="00:00:06.200" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""So what is that and why might you find it interesting?""" start="00:00:08.320" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""SLIME is the Superior Lisp Interaction Mode for Emacs.""" start="00:00:11.680" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""It's an Emacs package for developing Common Lisp,""" start="00:00:15.280" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""and it's a bit different from the way we develop most languages""" start="00:00:18.000" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""in that you're always connected""" start="00:00:20.680" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""to a running instance of your application,""" start="00:00:22.600" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""and you kind of build up your application, piece by piece,""" start="00:00:25.400" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""modifying one expression at a time""" start="00:00:27.960" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""without ever having to restart your application.""" start="00:00:30.400" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""So why might you want to develop this way?""" start="00:00:34.560" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""One advantage is that you can get a faster feedback loop.""" start="00:00:36.680" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""For some kinds of software, it doesn't make a big difference.""" start="00:00:40.040" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""Like, if you're developing a web backend""" start="00:00:42.600" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""where all state is stored externally in a database,""" start="00:00:43.920" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""then you can have a file watcher""" start="00:00:48.040" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""that just restarts the whole Python process""" start="00:00:50.280" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""whenever you make any edit,""" start="00:00:52.800" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""and you're not really losing anything,""" start="00:00:54.640" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""because all the state is stored outside the Python process""" start="00:00:56.160" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""in a database. So it works great.""" start="00:00:59.680" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""But for other kinds of software, like""" start="00:01:01.720" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""let's say you're developing an Emacs package""" start="00:01:03.560" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""or a video game,""" start="00:01:05.560" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""then it can be a real pain to restart the application""" start="00:01:07.280" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""and recreate the state it was in before""" start="00:01:10.320" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""just to test the effect of each edit you want to make.""" start="00:01:12.680" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""Another advantage is the runtime introspection you have available.""" start="00:01:17.280" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""So since you're always connected""" start="00:01:21.360" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""to a running instance of your application,""" start="00:01:22.680" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""you can inspect the values of variables,""" start="00:01:25.000" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""you can trace functions, and all sorts of other information""" start="00:01:27.800" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""to help you understand your application better.""" start="00:01:30.960" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""And lastly, it's just a lot of fun to develop this way,""" start="00:01:36.280" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""or at least I find it fun developing with SLIME,""" start="00:01:39.920" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""so I wrote a SLIME backend for Python""" start="00:01:43.520" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""so I could have more fun when I'm coding in Python.""" start="00:01:45.760" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""As for the name swanky-python, within SLIME,""" start="00:01:48.800" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""swank is the name of the Common Lisp backend""" start="00:01:52.600" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""that runs within your Common Lisp application""" start="00:01:56.280" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""and connects to Emacs. So I'm not too creative.""" start="00:01:59.200" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""swanky-python is just a swank implementation in Python.""" start="00:02:02.920" video="mainVideo-swanky" id="subtitle"]]
+
+<div class="transcript-heading">[[!template new="1" text="""Demo""" start="00:02:08.000" video="mainVideo-swanky" id="subtitle"]]</div>[[!template text="""So let's see it in action. So we started up with M-x slime.""" start="00:02:08.000" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""And what that does is it starts a Python process,""" start="00:02:15.280" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""starts swanky-python within it, and connects to it from Emacs.""" start="00:02:19.640" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""And you can configure how exactly it runs Python.""" start="00:02:25.040" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""Or you can start swanky python manually""" start="00:02:29.040" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""within a Python application running on a remote server""" start="00:02:32.480" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""and forward the port locally""" start="00:02:35.120" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""and connect to it in Emacs, from Emacs remotely.""" start="00:02:36.614" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""Within the README, there's more documentation""" start="00:02:40.920" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""on other ways to start it.""" start="00:02:43.240" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""But just M-x slime is the basic way that works most of the time.""" start="00:02:45.520" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""So within the REPL, the first thing you'll notice is that""" start="00:02:52.160" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""REPL outputs are clickable buttons,""" start="00:02:55.760" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""what SLIME calls presentations.""" start="00:02:58.840" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""So you can do things like inspect them.""" start="00:03:02.120" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""And for each presentation, in the Python backend,""" start="00:03:04.760" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""it holds on to the reference to the object.""" start="00:03:09.760" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""So for an int, it's not too interesting,""" start="00:03:12.480" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""but let's do a more complex object like a file.""" start="00:03:14.560" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""Then we can inspect the file.""" start="00:03:20.240" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""We can describe it, which will bring up documentation""" start="00:03:22.520" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""on that class. We can use it in further expressions""" start="00:03:26.600" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""like if we copy it, it will use the actual Python object""" start="00:03:33.760" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""in this expression.""" start="00:03:39.432" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""We can assign it to a variable.""" start="00:03:43.400" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""SLIME uses presentations everywhere""" start="00:03:48.320" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""that a Python object would be displayed.""" start="00:03:51.000" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""So instead of just their string representation,""" start="00:03:53.240" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""when you have a backtrace on an exception,""" start="00:03:56.560" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""or you... within the inspector or anywhere else really,""" start="00:04:00.240" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""anywhere that the string representation""" start="00:04:03.966" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""of an object would be displayed,""" start="00:04:06.020" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""it displays a presentation that you can go on to""" start="00:04:07.941" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""inspect, reuse, or send to the REPL and so on.""" start="00:04:10.741" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""One useful utility function is pp for print presentation.""" start="00:04:14.961" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""We haven't imported it yet.""" start="00:04:23.040" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""So when we get a name error exception""" start="00:04:25.120" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""and SLIME sees that that name is available for import somewhere,""" start="00:04:29.160" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""it'll give us the option of importing it.""" start="00:04:33.880" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""Since it's available for import from multiple modules,""" start="00:04:38.280" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""it'll prompt us for which one we want to import it from.""" start="00:04:40.600" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""We want to import it from swanky-python,""" start="00:04:43.920" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""not from the standard library.""" start="00:04:45.520" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""Then it will print a presentation of that object.""" start="00:04:48.480" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""Within the REPL, this is not really useful""" start="00:04:52.600" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""because all REPL outputs are already presentations.""" start="00:04:55.560" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""But I use this now whenever I would use print debugging,""" start="00:04:58.920" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""just whenever I would use insert print statements in my program""" start="00:05:02.800" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""to see what's going on, I have it print a presentation""" start="00:05:05.640" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""because that way I can go back and inspect it later,""" start="00:05:08.400" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""copy it to the REPL and further manipulate it and so on.""" start="00:05:11.200" video="mainVideo-swanky" id="subtitle"]]
+
+<div class="transcript-heading">[[!template new="1" text="""Inspector""" start="00:05:16.600" video="mainVideo-swanky" id="subtitle"]]</div>[[!template text="""Next up, let's look at the inspector more.""" start="00:05:16.600" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""If we go back and inspect the file object,""" start="00:05:20.120" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""you can write custom inspector views""" start="00:05:25.580" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""for different kinds of objects.""" start="00:05:27.240" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""So far, I just have a couple. One for sequences,""" start="00:05:28.840" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""one for mappings, and one for every other kind of object.""" start="00:05:32.520" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""Like if we inspect a mapping, there's a shortcut""" start="00:05:36.920" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""inspect last result, which is what I normally use""" start="00:05:45.980" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""to open the inspector. Then we see the values,""" start="00:05:48.640" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""and each value in the inspector is a presentation""" start="00:05:52.380" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""that we can go on to inspect, and so on.""" start="00:05:56.320" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""Let's go back to inspecting the file object.""" start="00:05:58.420" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""Again, we can inspect each of the values,""" start="00:06:03.980" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""we can copy them back to the REPL and so on.""" start="00:06:06.040" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""It just displays all the attributes for the class""" start="00:06:10.240" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""and their values.""" start="00:06:13.840" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""We can configure what attributes we want to show.""" start="00:06:15.400" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""There's a transient menu where we can toggle""" start="00:06:18.120" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""if we want to show private attributes, dunder attributes,""" start="00:06:21.120" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""doc strings, so on, or everything,""" start="00:06:23.360" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""which is a bit much to show by default.""" start="00:06:26.440" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""So we'll reset it to the default.""" start="00:06:28.520" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""In the future, I want to add graphical inspector views""" start="00:06:33.720" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""for different kinds of objects, and also support""" start="00:06:37.840" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""showing plots in both the inspector and the REPL,""" start="00:06:40.680" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""but that's future work I haven't started on yet.""" start="00:06:43.000" video="mainVideo-swanky" id="subtitle"]]
+
+<div class="transcript-heading">[[!template new="1" text="""Evaluating Python""" start="00:06:47.720" video="mainVideo-swanky" id="subtitle"]]</div>[[!template text="""Let's look at the different options for evaluating Python.""" start="00:06:47.720" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""So we can evaluate a whole file.""" start="00:06:52.000" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""We can evaluate just a class.""" start="00:06:59.100" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""We can evaluate just the method we're working on.""" start="00:07:00.640" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""We can evaluate a Python statement,""" start="00:07:03.480" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""and it will show the result in an overlay next to the cursor.""" start="00:07:06.360" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""We can select some code and just evaluate the highlighted region.""" start="00:07:11.840" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""We can sync the REPL to the active file.""" start="00:07:17.920" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""So now everything we evaluate in the REPL will be in the""" start="00:07:24.800" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""context of the eval_demo module.""" start="00:07:27.320" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""We can also set the module that the REPL is in.""" start="00:07:29.640" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""We can go back to main.""" start="00:07:35.400" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""But let's go back to the eval_demo module for now.""" start="00:07:38.280" video="mainVideo-swanky" id="subtitle"]]
+
+<div class="transcript-heading">[[!template new="1" text="""Updating""" start="00:07:43.680" video="mainVideo-swanky" id="subtitle"]]</div>[[!template text="""One useful thing is when you update a class or a function,""" start="00:07:43.680" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""it updates old instances of that class or function.""" start="00:07:49.800" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""So right now, f.bar is foobar.""" start="00:07:54.540" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""But if we edit that class, it will actually edit the code""" start="00:07:58.480" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""for the old instance of that class.""" start="00:08:03.720" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""And that's provided by code I copied""" start="00:08:05.240" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""from IPython's autoreload extension.""" start="00:08:07.600" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""It helps when you're trying to develop in Python""" start="00:08:12.080" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""without having to restart the Python process""" start="00:08:14.640" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""whenever you make a change.""" start="00:08:16.499" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""Auto reload in Python is a big topic""" start="00:08:20.040" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""that I don't really have time to go into here,""" start="00:08:22.600" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""but right now it is more limited""" start="00:08:26.520" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""than what is done in Common Lisp.""" start="00:08:29.480" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""Like for example, if you have a data class in Python""" start="00:08:32.560" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""and you add a new field to the data class,""" start="00:08:35.760" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""it won't automatically update old instances""" start="00:08:37.620" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""of the data class with a new field.""" start="00:08:41.040" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""So there's more that needs to be done with that,""" start="00:08:43.400" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""but I am perhaps naively optimistic""" start="00:08:46.600" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""that Python's runtime is quite dynamic and flexible,""" start="00:08:50.360" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""and that I can fully implement autoreload in Python,""" start="00:08:54.280" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""but there's still work to be done,""" start="00:08:59.800" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""and it's a big topic to go into.""" start="00:09:02.120" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""Next up, let's look at the backtrace buffer.""" start="00:09:05.420" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""But as it is right now, autoreload is actually useful.""" start="00:09:08.960" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""I mostly develop in Python without having to restart the process""" start="00:09:12.840" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""and without running into issues from old state""" start="00:09:16.960" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""that hasn't been updated properly.""" start="00:09:19.600" video="mainVideo-swanky" id="subtitle"]]
+
+<div class="transcript-heading">[[!template new="1" text="""Backtraces""" start="00:09:22.900" video="mainVideo-swanky" id="subtitle"]]</div>[[!template text="""So if we go on to look at the backtrace buffer,""" start="00:09:22.900" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""whenever we get an exception in Python...""" start="00:09:26.000" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""Let's go back to it.""" start="00:09:32.820" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""Whenever we get an exception, it will...""" start="00:09:37.080" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""let's change the code so that it actually""" start="00:09:41.420" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""gets an exception...""" start="00:09:43.699" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""we will get an interactive backtrace buffer""" start="00:09:49.966" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""where we can browse the source code for the different stack frames""" start="00:09:52.520" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""and the local variables within the stack frames,""" start="00:09:57.600" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""which are all presentations that we can inspect and so on.""" start="00:10:00.200" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""We can also open a REPL in the context of any stack frame.""" start="00:10:04.340" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""Or we can, when we go to the source for a given stack frame,""" start="00:10:10.620" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""we can select some Python code and evaluate it""" start="00:10:16.440" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""within the context of that stack frame.""" start="00:10:20.360" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""One major limitation compared to SLIME for Common Lisp""" start="00:10:25.960" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""is that in Common Lisp, you have the option to""" start="00:10:30.700" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""restart or resume execution from a given stack frame""" start="00:10:33.760" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""after an exception happens, where in Python,""" start="00:10:38.160" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""what we have right now is pretty much equivalent to""" start="00:10:42.440" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""the postmortem debugger.""" start="00:10:45.800" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""You can view the state that the call stack was in""" start="00:10:47.160" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""at the time of the exception,""" start="00:10:50.840" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""but you can't actually resume execution,""" start="00:10:51.960" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""which you often might want to do,""" start="00:10:55.660" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""because when you're coding in a dynamic language,""" start="00:10:57.560" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""you're going to get runtime errors.""" start="00:10:59.920" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""So if you're writing a script that does like some sort of""" start="00:11:01.480" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""long-running computation or processes a ton of files""" start="00:11:04.120" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""and gets an exception parsing one file halfway through,""" start="00:11:08.000" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""normally you'd have to fix the script, and then rerun it""" start="00:11:11.940" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""and have it process all the same files all over again,""" start="00:11:16.920" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""and lose a bunch of time for every bug you run into""" start="00:11:19.760" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""and fix you have to make.""" start="00:11:23.840" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""So right now we've got a kind of mediocre workaround""" start="00:11:24.880" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""which is you can add the restart decorator to a function""" start="00:11:28.680" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""and then... where in the case of a script""" start="00:11:34.020" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""processing a bunch of files,""" start="00:11:37.240" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""you would add the restart decorator to the function""" start="00:11:38.880" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""that processes a single file.""" start="00:11:41.800" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""You'd add it to the function""" start="00:11:43.600" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""that represents kind of the smallest unit of work""" start="00:11:45.440" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""that might fail with an exception,""" start="00:11:47.880" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""Then, when you get an exception,""" start="00:11:50.220" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""you can actually edit the function.""" start="00:11:54.360" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""Like, if we edit it so it doesn't throw an error,""" start="00:11:57.480" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""and then we can resume execution,""" start="00:12:01.020" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""then it will return from foo using the""" start="00:12:07.200" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""the new version of baz,""" start="00:12:12.800" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""without having to run the script from the beginning again.""" start="00:12:15.041" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""So in the example of a script that processes a bunch of files,""" start="00:12:18.560" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""that would let you,""" start="00:12:22.380" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""as you run into files that cause an exception,""" start="00:12:24.300" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""fix your code to deal with it""" start="00:12:27.620" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""and resume execution without having to restart the script""" start="00:12:29.080" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""from the beginning.""" start="00:12:31.881" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""But this is obviously a pretty terrible hack,""" start="00:12:33.081" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""having to add the restart decorator to the function.""" start="00:12:36.121" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""I would like it to be able to restart from any function.""" start="00:12:38.841" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""without needing the decorator, as you can in Common Lisp,""" start="00:12:46.740" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""but I think that will require patching CPython""" start="00:12:49.632" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""and I really have no idea how to do that.""" start="00:12:54.032" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""So if you do know anything about CPython internals""" start="00:12:56.580" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""and are interested in helping, please reach out.""" start="00:13:00.532" video="mainVideo-swanky" id="subtitle"]]
+
+<div class="transcript-heading">[[!template new="1" text="""pydumpling""" start="00:13:03.721" video="mainVideo-swanky" id="subtitle"]]</div>[[!template text="""Another feature we have with the backtrace buffer is""" start="00:13:03.721" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""there's this library called PyDumpling""" start="00:13:07.120" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""which can serialize a traceback and store it to a file.""" start="00:13:09.080" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""So you can use PyDumpling with your applications running in""" start="00:13:14.660" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""production to serialize a traceback""" start="00:13:17.860" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""whenever they have an exception and save it to a file.""" start="00:13:21.240" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""Then you can transfer the file locally""" start="00:13:24.900" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""and load it into your local Emacs with slime-py-load-pydumpling.""" start="00:13:28.600" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""This will load the same backtrace buffer,""" start="00:13:38.860" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""and you see all the same local variables""" start="00:13:41.840" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""at the time of the exception.""" start="00:13:44.560" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""You can inspect them and get a REPL""" start="00:13:45.760" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""in the context of the stack frame.""" start="00:13:48.200" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""Well, this will only work for variables""" start="00:13:51.000" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""that can be serialized with pickle.""" start="00:13:54.200" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""Or actually, the library uses dill,""" start="00:13:57.620" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""which can serialize a bit more than pickle can.""" start="00:13:59.520" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""But yeah so this can help you inspect and debug errors""" start="00:14:03.040" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""for applications running in production remotely""" start="00:14:10.201" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""that you don't want to have SLIME connected to 24-7.""" start="00:14:12.881" video="mainVideo-swanky" id="subtitle"]]
+
+<div class="transcript-heading">[[!template new="1" text="""Documentation browser""" start="00:14:20.060" video="mainVideo-swanky" id="subtitle"]]</div>[[!template text="""Next up, let's look at the documentation browser.""" start="00:14:20.060" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""We can bring up documentation for any module,""" start="00:14:24.860" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""and all this information is generated""" start="00:14:29.920" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""from runtime introspection,""" start="00:14:33.080" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""from the doc strings for the module""" start="00:14:35.000" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""and the classes and so on.""" start="00:14:37.080" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""So you won't see documentation for libraries""" start="00:14:39.160" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""that you don't have actually loaded""" start="00:14:41.880" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""into your running Python process.""" start="00:14:43.160" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""Then you can go browse to classes.""" start="00:14:45.940" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""It'll show all the attributes, their methods, and so on.""" start="00:14:50.120" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""By each method to the right, it will show""" start="00:14:54.720" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""the base class where the method was originally inherited from.""" start="00:14:57.240" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""You can also bring up a screen with all the Python packages""" start="00:15:02.600" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""that are installed, and browse that with imenu,""" start="00:15:09.080" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""and bring up information on any package and so on.""" start="00:15:14.440" video="mainVideo-swanky" id="subtitle"]]
+
+<div class="transcript-heading">[[!template new="1" text="""Thread view""" start="00:15:20.360" video="mainVideo-swanky" id="subtitle"]]</div>[[!template text="""Next up, let's take a look at the thread view.""" start="00:15:20.360" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""So let's run this and then bring up the thread view""" start="00:15:28.500" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""and this will show information on all running threads.""" start="00:15:31.840" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""You can configure it to refresh after a given interval,""" start="00:15:35.560" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""like every second, but I don't have that set up right now,""" start="00:15:38.800" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""so I have to manually refresh it.""" start="00:15:41.960" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""Probably the most useful thing is that""" start="00:15:45.660" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""you can bring up a backtrace for any thread""" start="00:15:47.640" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""which won't pause the thread or anything,""" start="00:15:49.740" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""but will just give you the call stack""" start="00:15:51.760" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""at the time you requested the backtrace.""" start="00:15:53.880" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""You can again view the stack frames, local variables,""" start="00:15:55.880" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""open a REPL in the context of the thread, and so on.""" start="00:15:59.200" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""There's also a viewer for async tasks,""" start="00:16:04.140" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""but I'm not going to demo that right now,""" start="00:16:07.840" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""because for that to work, you have to start swanky-python""" start="00:16:10.000" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""after the async event loop has started,""" start="00:16:14.160" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""from within the same thread.""" start="00:16:16.600" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""If you go to the project readme,""" start="00:16:18.520" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""there's a demo of how to use the async task viewer""" start="00:16:20.280" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""with a fastapi project.""" start="00:16:23.920" video="mainVideo-swanky" id="subtitle"]]
+
+<div class="transcript-heading">[[!template new="1" text="""Tracing functions""" start="00:16:27.440" video="mainVideo-swanky" id="subtitle"]]</div>[[!template text="""Next up, let's look at tracing functions.""" start="00:16:27.440" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""So here we got some random error,""" start="00:16:33.880" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""because this is still very much a work in progress.""" start="00:16:36.280" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""But it looks like it executed""" start="00:16:39.880" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""correctly this time.""" start="00:16:42.360" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""So now let's mark the fibonacci function""" start="00:16:43.200" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""for tracing and execute it.""" start="00:16:47.566" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""We can see, every time the function is called,""" start="00:16:50.240" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""all its arguments and return values.""" start="00:16:56.080" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""Again, there are presentations that we can inspect and so on.""" start="00:16:58.240" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""But let's inspect a more complex object, like a file object.""" start="00:17:02.900" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""If we trace the count_lines function and run that code,""" start="00:17:06.080" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""then we can inspect the file it was passed, or the file object.""" start="00:17:11.340" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""One pitfall is that in Python, objects are mutable.""" start="00:17:15.320" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""So in the trace buffer, the string representation""" start="00:17:21.040" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""that's printed is the string representation""" start="00:17:25.560" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""at the time it was passed to the function.""" start="00:17:27.880" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""But when we go to inspect it,""" start="00:17:31.220" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""we're inspecting the object as it is right now,""" start="00:17:32.640" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""which can be different than it was at the time""" start="00:17:34.920" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""the function saw it. So for this file object, for example,""" start="00:17:37.640" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""it's closed now, when it was open at the time""" start="00:17:41.560" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""the function used it.""" start="00:17:44.280" video="mainVideo-swanky" id="subtitle"]]
+
+<div class="transcript-heading">[[!template new="1" text="""AI integrations""" start="00:17:47.800" video="mainVideo-swanky" id="subtitle"]]</div>[[!template text="""Next up, let's look at AI integrations.""" start="00:17:47.800" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""So if you're used to SLIME with Common Lisp,""" start="00:17:50.480" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""Emacs actually has a built-in AI that can help with the transition.""" start="00:17:54.520" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""So it's just a joke, I actually really like Python.""" start="00:18:09.480" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""And for more serious AI integrations,""" start="00:18:14.560" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""I have some ideas for the future""" start="00:18:18.120" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""but I haven't implemented anything yet.""" start="00:18:19.960" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""I think right now, people are mostly passing source code to LLMs""" start="00:18:21.920" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""but since we're embedded in the Python process at runtime,""" start="00:18:27.320" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""we have a lot of more information available,""" start="00:18:32.680" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""like maybe we can trace all calls to functions,""" start="00:18:35.640" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""and when we have a bug,""" start="00:18:39.440" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""we can feed the trace to the LLM,""" start="00:18:41.800" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""and the LLM can point out maybe""" start="00:18:46.480" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""when this function was called with these arguments,""" start="00:18:48.720" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""its return value doesn't make sense,""" start="00:18:51.960" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""so maybe that's the root cause of your bug.""" start="00:18:53.880" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""If you have any ideas of potential LLM or AI integrations,""" start="00:18:55.680" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""let me know. I'm happy to discuss.""" start="00:19:02.360" video="mainVideo-swanky" id="subtitle"]]
+
+<div class="transcript-heading">[[!template new="1" text="""LSP-type features""" start="00:19:06.000" video="mainVideo-swanky" id="subtitle"]]</div>[[!template text="""Next up, let's look at standard LSP-type features.""" start="00:19:06.000" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""So we've got completions. It's fuzzy completions right now,""" start="00:19:09.920" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""so it's showing everything with a PR in the name.""" start="00:19:14.440" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""We can bring up documentation for each one.""" start="00:19:16.320" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""When we start calling a method in the minibuffer at the bottom""" start="00:19:21.780" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""it'll show the signature.""" start="00:19:26.760" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""There's some refactoring available.""" start="00:19:28.860" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""We can extract a function or variable,""" start="00:19:33.720" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""or rename something,""" start="00:19:37.400" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""like, let's rename fib to fib2,""" start="00:19:39.500" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""and it will rename all the uses of it.""" start="00:19:42.920" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""All these features are based on Jedi,""" start="00:19:47.480" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""which is the Python library used by IPython.""" start="00:19:49.760" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""But as it is right now,""" start="00:19:55.400" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""if you want the most complete Python development experience""" start="00:19:57.000" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""in Emacs, I'd probably recommend using LSP""" start="00:20:02.040" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""for everything LSP can do, and then just using swanky-python""" start="00:20:05.580" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""for the object inspector and backtrace buffer,""" start="00:20:10.440" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""and the interactive features it has""" start="00:20:13.680" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""that an LSP can't provide.""" start="00:20:15.360" video="mainVideo-swanky" id="subtitle"]]
+
+<div class="transcript-heading">[[!template new="1" text="""Wrapping up""" start="00:20:18.032" video="mainVideo-swanky" id="subtitle"]]</div>[[!template text="""And that's it really.""" start="00:20:18.032" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""Shortly we'll have questions and answers""" start="00:20:23.340" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""as part of EmacsConf, and later on,""" start="00:20:25.866" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""if you have any questions, ideas, or issues""" start="00:20:28.800" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""feel free to reach out over email""" start="00:20:31.200" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""or create an issue on the repository.""" start="00:20:34.640" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""I should probably warn you,""" start="00:20:38.000" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""if you want to try out the project:""" start="00:20:39.332" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""so far I'm probably the only user of it""" start="00:20:41.120" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""and I've only tested it on my own Emacs setup,""" start="00:20:45.280" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""so it's quite likely you'll run into issues""" start="00:20:48.280" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""trying to get it installed and working.""" start="00:20:50.840" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""But if you do run into problems, please reach out,""" start="00:20:53.480" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""let me know. I'm happy to help and try and fix them.""" start="00:20:56.120" video="mainVideo-swanky" id="subtitle"]]
+[[!template text="""So that's it. Thanks for listening.""" start="00:20:59.280" video="mainVideo-swanky" id="subtitle"]]
+
+</div>
+
+Captioner: sachac
+
Questions or comments? Please e-mail [sczi@disroot.org](mailto:sczi@disroot.org?subject=Comment%20for%20EmacsConf%202023%20swanky%3A%20Swanky%20Python%3A%20Interactive%20development%20for%20Python)
diff --git a/2025/info/swanky-before.md b/2025/info/swanky-before.md
index c3be7dd6..6b3006bf 100644
--- a/2025/info/swanky-before.md
+++ b/2025/info/swanky-before.md
@@ -8,12 +8,12 @@ The following image shows where the talk is in the schedule for Sat 2025-12-06.
Format: 22-min talk ; Q&A: ask questions via Etherpad/IRC; we'll e-mail the speaker and post answers on this wiki page after the conference Etherpad: <https://pad.emacsconf.org/2025-swanky>
Etherpad: <https://pad.emacsconf.org/2025-swanky>
Discuss on IRC: [#emacsconf-dev](https://chat.emacsconf.org/?join=emacsconf,emacsconf-dev)
-Status: Ready to stream
+Status: Q&A open for participation
<div>Times in different time zones:</div><div class="times" start="2025-12-06T15:45:00Z" end="2025-12-06T16:10:00Z"><div class="conf-time">Saturday, Dec 6 2025, ~10:45 AM - 11:10 AM EST (US/Eastern)</div><div class="others"><div>which is the same as:</div>Saturday, Dec 6 2025, ~9:45 AM - 10:10 AM CST (US/Central)<br />Saturday, Dec 6 2025, ~8:45 AM - 9:10 AM MST (US/Mountain)<br />Saturday, Dec 6 2025, ~7:45 AM - 8:10 AM PST (US/Pacific)<br />Saturday, Dec 6 2025, ~3:45 PM - 4:10 PM UTC <br />Saturday, Dec 6 2025, ~4:45 PM - 5:10 PM CET (Europe/Paris)<br />Saturday, Dec 6 2025, ~5:45 PM - 6:10 PM EET (Europe/Athens)<br />Saturday, Dec 6 2025, ~9:15 PM - 9:40 PM IST (Asia/Kolkata)<br />Saturday, Dec 6 2025, ~11:45 PM - 12:10 AM +08 (Asia/Singapore)<br />Sunday, Dec 7 2025, ~12:45 AM - 1:10 AM JST (Asia/Tokyo)</div></div><div><strong><a href="/2025/watch/dev/">Find out how to watch and participate</a></strong></div>
-
+<div class="vid mainVideo"><video controls preload="none" id="mainVideo-swanky"><source src="https://media.emacsconf.org/2025/emacsconf-2025-swanky--swanky-python-interactive-development-for-python--scott-zimmermann--main.webm" />captions="""<track label="English" kind="captions" srclang="en" src="/2025/captions/emacsconf-2025-swanky--swanky-python-interactive-development-for-python--scott-zimmermann--main.vtt" default />"""<p><em>Your browser does not support the video tag. Please download the video instead.</em></p></video><div></div>Duration: 21:03 minutes<div class="files resources"><ul><li><a href="https://pad.emacsconf.org/2025-swanky">Open Etherpad</a></li><li><a href="https://media.emacsconf.org/2025/emacsconf-2025-swanky--swanky-python-interactive-development-for-python--scott-zimmermann--intro.vtt">Download --intro.vtt</a></li><li><a href="https://media.emacsconf.org/2025/emacsconf-2025-swanky--swanky-python-interactive-development-for-python--scott-zimmermann--intro.webm">Download --intro.webm</a></li><li><a href="https://media.emacsconf.org/2025/emacsconf-2025-swanky--swanky-python-interactive-development-for-python--scott-zimmermann--main.opus">Download --main.opus (18MB)</a></li><li><a href="https://media.emacsconf.org/2025/emacsconf-2025-swanky--swanky-python-interactive-development-for-python--scott-zimmermann--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2025/emacsconf-2025-swanky--swanky-python-interactive-development-for-python--scott-zimmermann--main.webm">Download --main.webm (56MB)</a></li><li><a href="https://youtu.be/fy0ofT1I54U">View on Youtube</a></li></ul></div></div>
# Description
<!-- End of emacsconf-publish-before-page --> \ No newline at end of file
diff --git a/2025/organizers-notebook/schedule.svg b/2025/organizers-notebook/schedule.svg
index ca2dacfd..b3c5308a 100644
--- a/2025/organizers-notebook/schedule.svg
+++ b/2025/organizers-notebook/schedule.svg
@@ -1 +1 @@
-<svg width="500" height="700" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><title>Graphical view of the schedule</title><g transform="translate(0,0)"><title>Schedule for Saturday</title><rect width="250" height="700" x="0" y="0" fill="white"></rect><text font-size="10" fill="black" y="30" x="3">Saturday</text><a href="https://emacsconf.org/2025/talks/sat-open" title="Saturday opening remarks" data-slug="sat-open"><title> 9:00- 9:10 Saturday opening remarks</title><rect x="40" y="40" opacity="0.8" width="84" height="13" stroke="black" stroke-dasharray="5,5,5" fill="gray"></rect><g transform="translate(40,51)"><text fill="black" x="0" y="0" font-size="10" transform="nil">sat-open</text></g></a><a href="https://emacsconf.org/2025/talks/org-babel" title="Making Org-Babel reactive" data-slug="org-babel"><title> 9:10- 9:20 Making Org-Babel reactive</title><rect x="40" y="53" opacity="0.8" width="84" height="13" stroke="black" stroke-dasharray="5,5,5" fill="lightblue"></rect><g transform="translate(40,64)"><text fill="black" x="0" y="0" font-size="10" transform="nil">org-babel</text></g></a><a href="https://emacsconf.org/2025/talks/reference" title="Emacs as a fully-fledged reference manager" data-slug="reference"><title> 9:30- 9:55 Emacs as a fully-fledged reference manager</title><rect x="40" y="81" opacity="0.8" width="84" height="34" stroke="black" stroke-dasharray="" fill="gray"></rect><g transform="translate(40,113)"><text fill="black" x="0" y="0" font-size="10" transform="nil">reference</text></g></a><a href="https://emacsconf.org/2025/talks/gmail" title="org-gmail: A deep integration of Gmail into your Org Mode" data-slug="gmail"><title>10:15-10:40 org-gmail: A deep integration of Gmail into your Org Mode</title><rect x="40" y="142" opacity="0.8" width="84" height="34" stroke="black" stroke-dasharray="5,5,5" fill="lightblue"></rect><g transform="translate(40,174)"><text fill="black" x="0" y="0" font-size="10" transform="nil">gmail</text></g></a><a href="https://emacsconf.org/2025/talks/gnus" title="Reading and writing emails in GNU Emacs with Gnus" data-slug="gnus"><title>10:50-11:15 Reading and writing emails in GNU Emacs with Gnus</title><rect x="40" y="190" opacity="0.8" width="84" height="34" stroke="black" stroke-dasharray="" fill="gray"></rect><g transform="translate(40,222)"><text fill="black" x="0" y="0" font-size="10" transform="nil">gnus</text></g></a><a href="https://emacsconf.org/2025/talks/latex" title="LaTeX export in org-mode: the overhaul" data-slug="latex"><title>11:35-11:55 LaTeX export in org-mode: the overhaul</title><rect x="40" y="252" opacity="0.8" width="84" height="27" stroke="black" stroke-dasharray="" fill="peachpuff"></rect><g transform="translate(40,277)"><text fill="black" x="0" y="0" font-size="10" transform="nil">latex</text></g></a><a href="https://emacsconf.org/2025/talks/calc" title="Basic Calc functionality for engineering or electronics" data-slug="calc"><title> 1:00- 1:25 Basic Calc functionality for engineering or electronics</title><rect x="40" y="369" opacity="0.8" width="84" height="34" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect><g transform="translate(40,401)"><text fill="black" x="0" y="0" font-size="10" transform="nil">calc</text></g></a><a href="https://emacsconf.org/2025/talks/blee-lcnt" title="Blee-LCNT: An Emacs-centered content production and self-publication framework" data-slug="blee-lcnt"><title> 1:35- 2:15 Blee-LCNT: An Emacs-centered content production and self-publication framework</title><rect x="40" y="417" opacity="0.8" width="84" height="54" stroke="black" stroke-dasharray="" fill="gray"></rect><g transform="translate(40,469)"><text fill="black" x="0" y="0" font-size="10" transform="nil">blee-lcnt</text></g></a><a href="https://emacsconf.org/2025/talks/greader" title="GNU Emacs Greader (Gnamù Reader) mode is the best Emacs mode in existence" data-slug="greader"><title> 2:35- 2:40 GNU Emacs Greader (Gnamù Reader) mode is the best Emacs mode in existence</title><rect x="40" y="499" opacity="0.8" width="84" height="6" stroke="black" stroke-dasharray="5,5,5" fill="gray"></rect><g transform="translate(40,503)"><text fill="black" x="0" y="0" font-size="10" transform="nil">greader</text></g></a><a href="https://emacsconf.org/2025/talks/open-mic" title="Open session" data-slug="open-mic"><title> 2:50- 3:40 Open session</title><rect x="40" y="520" opacity="0.8" width="84" height="68" stroke="black" stroke-dasharray="" fill="gray"></rect><g transform="translate(40,586)"><text fill="black" x="0" y="0" font-size="10" transform="nil">open-mic</text></g></a><a href="https://emacsconf.org/2025/talks/sat-close" title="Saturday closing remarks / open session" data-slug="sat-close"><title> 4:00- 4:10 Saturday closing remarks / open session</title><rect x="40" y="616" opacity="0.8" width="84" height="13" stroke="black" stroke-dasharray="" fill="gray"></rect><g transform="translate(40,627)"><text fill="black" x="0" y="0" font-size="10" transform="nil">sat-close</text></g></a><a href="https://emacsconf.org/2025/talks/schemacs" title="One year progress update Schemacs (formerly Gypsum)" data-slug="schemacs"><title> 9:30- 9:55 One year progress update Schemacs (formerly Gypsum)</title><rect x="125" y="81" opacity="0.8" width="84" height="34" stroke="black" stroke-dasharray="" fill="lightblue"></rect><g transform="translate(125,113)"><text fill="black" x="0" y="0" font-size="10" transform="nil">schemacs</text></g></a><a href="https://emacsconf.org/2025/talks/juicemacs" title="Juicemacs: exploring speculative JIT compilation for ELisp in Java" data-slug="juicemacs"><title>10:15-10:35 Juicemacs: exploring speculative JIT compilation for ELisp in Java</title><rect x="125" y="142" opacity="0.8" width="84" height="27" stroke="black" stroke-dasharray="5,5,5" fill="lightblue"></rect><g transform="translate(125,167)"><text fill="black" x="0" y="0" font-size="10" transform="nil">juicemacs</text></g></a><a href="https://emacsconf.org/2025/talks/swanky" title="Swanky Python: Interactive development for Python" data-slug="swanky"><title>10:45-11:10 Swanky Python: Interactive development for Python</title><rect x="125" y="184" opacity="0.8" width="84" height="34" stroke="black" stroke-dasharray="5,5,5" fill="gray"></rect><g transform="translate(125,216)"><text fill="black" x="0" y="0" font-size="10" transform="nil">swanky</text></g></a><a href="https://emacsconf.org/2025/talks/python" title="Interactive Python programming in Emacs" data-slug="python"><title>11:20-11:40 Interactive Python programming in Emacs</title><rect x="125" y="232" opacity="0.8" width="84" height="27" stroke="black" stroke-dasharray="" fill="lightblue"></rect><g transform="translate(125,257)"><text fill="black" x="0" y="0" font-size="10" transform="nil">python</text></g></a><a href="https://emacsconf.org/2025/talks/llm" title="Emacs, editors, and LLM driven workflows" data-slug="llm"><title> 1:00- 1:25 Emacs, editors, and LLM driven workflows</title><rect x="125" y="369" opacity="0.8" width="84" height="34" stroke="black" stroke-dasharray="" fill="peachpuff"></rect><g transform="translate(125,401)"><text fill="black" x="0" y="0" font-size="10" transform="nil">llm</text></g></a><a href="https://emacsconf.org/2025/talks/private-ai" title="Emacs and private AI: a great match" data-slug="private-ai"><title> 1:45- 2:05 Emacs and private AI: a great match</title><rect x="125" y="431" opacity="0.8" width="84" height="27" stroke="black" stroke-dasharray="" fill="gray"></rect><g transform="translate(125,456)"><text fill="black" x="0" y="0" font-size="10" transform="nil">private-ai</text></g></a><a href="https://emacsconf.org/2025/talks/commonlisp" title="Common Lisp images communicating like-a-human through shared Emacs slime and eev" data-slug="commonlisp"><title> 2:25- 2:55 Common Lisp images communicating like-a-human through shared Emacs slime and eev</title><rect x="125" y="486" opacity="0.8" width="84" height="41" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect><g transform="translate(125,525)"><text fill="black" x="0" y="0" font-size="10" transform="nil">commonlisp</text></g></a><a href="https://emacsconf.org/2025/talks/graphics" title="Modern Emacs/Elisp hardware/software accelerated graphics" data-slug="graphics"><title> 3:05- 3:30 Modern Emacs/Elisp hardware/software accelerated graphics</title><rect x="125" y="540" opacity="0.8" width="84" height="34" stroke="black" stroke-dasharray="" fill="gray"></rect><g transform="translate(125,572)"><text fill="black" x="0" y="0" font-size="10" transform="nil">graphics</text></g></a><g transform="translate(3,40)"><line stroke="darkgray" x1="40" y1="0" x2="210" y2="0"></line><text fill="black" x="0" y="0" font-size="10" dy=".4em">9 AM</text></g><g transform="translate(3,122)"><line stroke="darkgray" x1="40" y1="0" x2="210" y2="0"></line><text fill="black" x="0" y="0" font-size="10" dy=".4em">10 AM</text></g><g transform="translate(3,204)"><line stroke="darkgray" x1="40" y1="0" x2="210" y2="0"></line><text fill="black" x="0" y="0" font-size="10" dy=".4em">11 AM</text></g><g transform="translate(3,287)"><line stroke="darkgray" x1="40" y1="0" x2="210" y2="0"></line><text fill="black" x="0" y="0" font-size="10" dy=".4em">12 PM</text></g><g transform="translate(3,369)"><line stroke="darkgray" x1="40" y1="0" x2="210" y2="0"></line><text fill="black" x="0" y="0" font-size="10" dy=".4em">1 PM</text></g><g transform="translate(3,451)"><line stroke="darkgray" x1="40" y1="0" x2="210" y2="0"></line><text fill="black" x="0" y="0" font-size="10" dy=".4em">2 PM</text></g><g transform="translate(3,534)"><line stroke="darkgray" x1="40" y1="0" x2="210" y2="0"></line><text fill="black" x="0" y="0" font-size="10" dy=".4em">3 PM</text></g><g transform="translate(3,616)"><line stroke="darkgray" x1="40" y1="0" x2="210" y2="0"></line><text fill="black" x="0" y="0" font-size="10" dy=".4em">4 PM</text></g><g transform="translate(3,698)"><line stroke="darkgray" x1="40" y1="0" x2="210" y2="0"></line><text fill="black" x="0" y="0" font-size="10" dy=".4em">5 PM</text></g></g><g transform="translate(250,0)"><title>Schedule for Sunday</title><rect width="250" height="700" x="0" y="0" fill="white"></rect><text font-size="10" fill="black" y="30" x="3">Sunday</text><a href="https://emacsconf.org/2025/talks/sun-open" title="Sunday opening remarks" data-slug="sun-open"><title> 9:00- 9:10 Sunday opening remarks</title><rect x="40" y="40" opacity="0.8" width="84" height="13" stroke="black" stroke-dasharray="5,5,5" fill="gray"></rect><g transform="translate(40,51)"><text fill="black" x="0" y="0" font-size="10" transform="nil">sun-open</text></g></a><a href="https://emacsconf.org/2025/talks/modern" title="Some problems of modernizing Emacs" data-slug="modern"><title> 9:10- 9:30 Some problems of modernizing Emacs</title><rect x="40" y="53" opacity="0.8" width="84" height="27" stroke="black" stroke-dasharray="5,5,5" fill="gray"></rect><g transform="translate(40,78)"><text fill="black" x="0" y="0" font-size="10" transform="nil">modern</text></g></a><a href="https://emacsconf.org/2025/talks/reader" title="An introduction to the Emacs Reader" data-slug="reader"><title> 9:40-10:15 An introduction to the Emacs Reader</title><rect x="40" y="94" opacity="0.8" width="84" height="48" stroke="black" stroke-dasharray="" fill="gray"></rect><g transform="translate(40,140)"><text fill="black" x="0" y="0" font-size="10" transform="nil">reader</text></g></a><a href="https://emacsconf.org/2025/talks/weights" title="Weightlifting tracking with Emacs on Android" data-slug="weights"><title>10:35-10:45 Weightlifting tracking with Emacs on Android</title><rect x="40" y="170" opacity="0.8" width="84" height="13" stroke="black" stroke-dasharray="" fill="lightblue"></rect><g transform="translate(40,181)"><text fill="black" x="0" y="0" font-size="10" transform="nil">weights</text></g></a><a href="https://emacsconf.org/2025/talks/completion" title="corfu+yasnippet: Easier than I thought" data-slug="completion"><title>11:05-11:25 corfu+yasnippet: Easier than I thought</title><rect x="40" y="211" opacity="0.8" width="84" height="27" stroke="black" stroke-dasharray="" fill="peachpuff"></rect><g transform="translate(40,236)"><text fill="black" x="0" y="0" font-size="10" transform="nil">completion</text></g></a><a href="https://emacsconf.org/2025/talks/zettelkasten" title="Zettelkasten for regular Emacs hackers" data-slug="zettelkasten"><title> 1:00- 1:25 Zettelkasten for regular Emacs hackers</title><rect x="40" y="369" opacity="0.8" width="84" height="34" stroke="black" stroke-dasharray="" fill="peachpuff"></rect><g transform="translate(40,401)"><text fill="black" x="0" y="0" font-size="10" transform="nil">zettelkasten</text></g></a><a href="https://emacsconf.org/2025/talks/hyperboleqa" title="Questions and answers to help you fly with Hyperbole" data-slug="hyperboleqa"><title> 1:45- 2:15 Questions and answers to help you fly with Hyperbole</title><rect x="40" y="431" opacity="0.8" width="84" height="41" stroke="black" stroke-dasharray="" fill="peachpuff"></rect><g transform="translate(40,470)"><text fill="black" x="0" y="0" font-size="10" transform="nil">hyperboleqa</text></g></a><a href="https://emacsconf.org/2025/talks/gardening" title="Gardening in Emacs: A Windows user's tale of tending, tweaking, and triumph" data-slug="gardening"><title> 2:15- 2:35 Gardening in Emacs: A Windows user's tale of tending, tweaking, and triumph</title><rect x="40" y="472" opacity="0.8" width="84" height="27" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect><g transform="translate(40,497)"><text fill="black" x="0" y="0" font-size="10" transform="nil">gardening</text></g></a><a href="https://emacsconf.org/2025/talks/bookclub-tapas" title="Bookclub tapas" data-slug="bookclub-tapas"><title> 2:45- 3:20 Bookclub tapas</title><rect x="40" y="513" opacity="0.8" width="84" height="48" stroke="black" stroke-dasharray="" fill="peachpuff"></rect><g transform="translate(40,559)"><text fill="black" x="0" y="0" font-size="10" transform="nil">bookclub-tapas</text></g></a><a href="https://emacsconf.org/2025/talks/sun-close" title="Sunday closing remarks" data-slug="sun-close"><title> 3:40- 3:50 Sunday closing remarks</title><rect x="40" y="589" opacity="0.8" width="84" height="13" stroke="black" stroke-dasharray="" fill="gray"></rect><g transform="translate(40,600)"><text fill="black" x="0" y="0" font-size="10" transform="nil">sun-close</text></g></a><g transform="translate(3,40)"><line stroke="darkgray" x1="40" y1="0" x2="210" y2="0"></line><text fill="black" x="0" y="0" font-size="10" dy=".4em">9 AM</text></g><g transform="translate(3,122)"><line stroke="darkgray" x1="40" y1="0" x2="210" y2="0"></line><text fill="black" x="0" y="0" font-size="10" dy=".4em">10 AM</text></g><g transform="translate(3,204)"><line stroke="darkgray" x1="40" y1="0" x2="210" y2="0"></line><text fill="black" x="0" y="0" font-size="10" dy=".4em">11 AM</text></g><g transform="translate(3,287)"><line stroke="darkgray" x1="40" y1="0" x2="210" y2="0"></line><text fill="black" x="0" y="0" font-size="10" dy=".4em">12 PM</text></g><g transform="translate(3,369)"><line stroke="darkgray" x1="40" y1="0" x2="210" y2="0"></line><text fill="black" x="0" y="0" font-size="10" dy=".4em">1 PM</text></g><g transform="translate(3,451)"><line stroke="darkgray" x1="40" y1="0" x2="210" y2="0"></line><text fill="black" x="0" y="0" font-size="10" dy=".4em">2 PM</text></g><g transform="translate(3,534)"><line stroke="darkgray" x1="40" y1="0" x2="210" y2="0"></line><text fill="black" x="0" y="0" font-size="10" dy=".4em">3 PM</text></g><g transform="translate(3,616)"><line stroke="darkgray" x1="40" y1="0" x2="210" y2="0"></line><text fill="black" x="0" y="0" font-size="10" dy=".4em">4 PM</text></g><g transform="translate(3,698)"><line stroke="darkgray" x1="40" y1="0" x2="210" y2="0"></line><text fill="black" x="0" y="0" font-size="10" dy=".4em">5 PM</text></g></g></svg> \ No newline at end of file
+<svg width="500" height="700" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><title>Graphical view of the schedule</title><g transform="translate(0,0)"><title>Schedule for Saturday</title><rect width="250" height="700" x="0" y="0" fill="white"></rect><text font-size="10" fill="black" y="30" x="3">Saturday</text><a href="https://emacsconf.org/2025/talks/sat-open" title="Saturday opening remarks" data-slug="sat-open"><title> 9:00- 9:10 Saturday opening remarks</title><rect x="40" y="40" opacity="0.8" width="84" height="13" stroke="black" stroke-dasharray="5,5,5" fill="gray"></rect><g transform="translate(40,51)"><text fill="black" x="0" y="0" font-size="10" transform="nil">sat-open</text></g></a><a href="https://emacsconf.org/2025/talks/org-babel" title="Making Org-Babel reactive" data-slug="org-babel"><title> 9:10- 9:20 Making Org-Babel reactive</title><rect x="40" y="53" opacity="0.8" width="84" height="13" stroke="black" stroke-dasharray="5,5,5" fill="lightblue"></rect><g transform="translate(40,64)"><text fill="black" x="0" y="0" font-size="10" transform="nil">org-babel</text></g></a><a href="https://emacsconf.org/2025/talks/reference" title="Emacs as a fully-fledged reference manager" data-slug="reference"><title> 9:30- 9:55 Emacs as a fully-fledged reference manager</title><rect x="40" y="81" opacity="0.8" width="84" height="34" stroke="black" stroke-dasharray="" fill="gray"></rect><g transform="translate(40,113)"><text fill="black" x="0" y="0" font-size="10" transform="nil">reference</text></g></a><a href="https://emacsconf.org/2025/talks/gmail" title="org-gmail: A deep integration of Gmail into your Org Mode" data-slug="gmail"><title>10:15-10:40 org-gmail: A deep integration of Gmail into your Org Mode</title><rect x="40" y="142" opacity="0.8" width="84" height="34" stroke="black" stroke-dasharray="" fill="lightblue"></rect><g transform="translate(40,174)"><text fill="black" x="0" y="0" font-size="10" transform="nil">gmail</text></g></a><a href="https://emacsconf.org/2025/talks/gnus" title="Reading and writing emails in GNU Emacs with Gnus" data-slug="gnus"><title>11:00-11:25 Reading and writing emails in GNU Emacs with Gnus</title><rect x="40" y="204" opacity="0.8" width="84" height="34" stroke="black" stroke-dasharray="" fill="gray"></rect><g transform="translate(40,236)"><text fill="black" x="0" y="0" font-size="10" transform="nil">gnus</text></g></a><a href="https://emacsconf.org/2025/talks/latex" title="LaTeX export in org-mode: the overhaul" data-slug="latex"><title>11:45-12:05 LaTeX export in org-mode: the overhaul</title><rect x="40" y="266" opacity="0.8" width="84" height="27" stroke="black" stroke-dasharray="" fill="peachpuff"></rect><g transform="translate(40,291)"><text fill="black" x="0" y="0" font-size="10" transform="nil">latex</text></g></a><a href="https://emacsconf.org/2025/talks/calc" title="Basic Calc functionality for engineering or electronics" data-slug="calc"><title> 1:00- 1:25 Basic Calc functionality for engineering or electronics</title><rect x="40" y="369" opacity="0.8" width="84" height="34" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect><g transform="translate(40,401)"><text fill="black" x="0" y="0" font-size="10" transform="nil">calc</text></g></a><a href="https://emacsconf.org/2025/talks/blee-lcnt" title="Blee-LCNT: An Emacs-centered content production and self-publication framework" data-slug="blee-lcnt"><title> 1:35- 2:15 Blee-LCNT: An Emacs-centered content production and self-publication framework</title><rect x="40" y="417" opacity="0.8" width="84" height="54" stroke="black" stroke-dasharray="" fill="gray"></rect><g transform="translate(40,469)"><text fill="black" x="0" y="0" font-size="10" transform="nil">blee-lcnt</text></g></a><a href="https://emacsconf.org/2025/talks/greader" title="GNU Emacs Greader (Gnamù Reader) mode is the best Emacs mode in existence" data-slug="greader"><title> 2:35- 2:40 GNU Emacs Greader (Gnamù Reader) mode is the best Emacs mode in existence</title><rect x="40" y="499" opacity="0.8" width="84" height="6" stroke="black" stroke-dasharray="5,5,5" fill="gray"></rect><g transform="translate(40,503)"><text fill="black" x="0" y="0" font-size="10" transform="nil">greader</text></g></a><a href="https://emacsconf.org/2025/talks/open-mic" title="Open session" data-slug="open-mic"><title> 2:50- 3:40 Open session</title><rect x="40" y="520" opacity="0.8" width="84" height="68" stroke="black" stroke-dasharray="" fill="gray"></rect><g transform="translate(40,586)"><text fill="black" x="0" y="0" font-size="10" transform="nil">open-mic</text></g></a><a href="https://emacsconf.org/2025/talks/sat-close" title="Saturday closing remarks / open session" data-slug="sat-close"><title> 4:00- 4:10 Saturday closing remarks / open session</title><rect x="40" y="616" opacity="0.8" width="84" height="13" stroke="black" stroke-dasharray="" fill="gray"></rect><g transform="translate(40,627)"><text fill="black" x="0" y="0" font-size="10" transform="nil">sat-close</text></g></a><a href="https://emacsconf.org/2025/talks/schemacs" title="One year progress update Schemacs (formerly Gypsum)" data-slug="schemacs"><title> 9:30- 9:55 One year progress update Schemacs (formerly Gypsum)</title><rect x="125" y="81" opacity="0.8" width="84" height="34" stroke="black" stroke-dasharray="" fill="lightblue"></rect><g transform="translate(125,113)"><text fill="black" x="0" y="0" font-size="10" transform="nil">schemacs</text></g></a><a href="https://emacsconf.org/2025/talks/juicemacs" title="Juicemacs: exploring speculative JIT compilation for ELisp in Java" data-slug="juicemacs"><title>10:15-10:35 Juicemacs: exploring speculative JIT compilation for ELisp in Java</title><rect x="125" y="142" opacity="0.8" width="84" height="27" stroke="black" stroke-dasharray="5,5,5" fill="lightblue"></rect><g transform="translate(125,167)"><text fill="black" x="0" y="0" font-size="10" transform="nil">juicemacs</text></g></a><a href="https://emacsconf.org/2025/talks/swanky" title="Swanky Python: Interactive development for Python" data-slug="swanky"><title>10:45-11:10 Swanky Python: Interactive development for Python</title><rect x="125" y="184" opacity="0.8" width="84" height="34" stroke="black" stroke-dasharray="5,5,5" fill="gray"></rect><g transform="translate(125,216)"><text fill="black" x="0" y="0" font-size="10" transform="nil">swanky</text></g></a><a href="https://emacsconf.org/2025/talks/python" title="Interactive Python programming in Emacs" data-slug="python"><title>11:20-11:40 Interactive Python programming in Emacs</title><rect x="125" y="232" opacity="0.8" width="84" height="27" stroke="black" stroke-dasharray="" fill="lightblue"></rect><g transform="translate(125,257)"><text fill="black" x="0" y="0" font-size="10" transform="nil">python</text></g></a><a href="https://emacsconf.org/2025/talks/llm" title="Emacs, editors, and LLM driven workflows" data-slug="llm"><title> 1:00- 1:25 Emacs, editors, and LLM driven workflows</title><rect x="125" y="369" opacity="0.8" width="84" height="34" stroke="black" stroke-dasharray="" fill="peachpuff"></rect><g transform="translate(125,401)"><text fill="black" x="0" y="0" font-size="10" transform="nil">llm</text></g></a><a href="https://emacsconf.org/2025/talks/private-ai" title="Emacs and private AI: a great match" data-slug="private-ai"><title> 1:45- 2:05 Emacs and private AI: a great match</title><rect x="125" y="431" opacity="0.8" width="84" height="27" stroke="black" stroke-dasharray="" fill="gray"></rect><g transform="translate(125,456)"><text fill="black" x="0" y="0" font-size="10" transform="nil">private-ai</text></g></a><a href="https://emacsconf.org/2025/talks/commonlisp" title="Common Lisp images communicating like-a-human through shared Emacs slime and eev" data-slug="commonlisp"><title> 2:25- 2:55 Common Lisp images communicating like-a-human through shared Emacs slime and eev</title><rect x="125" y="486" opacity="0.8" width="84" height="41" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect><g transform="translate(125,525)"><text fill="black" x="0" y="0" font-size="10" transform="nil">commonlisp</text></g></a><a href="https://emacsconf.org/2025/talks/graphics" title="Modern Emacs/Elisp hardware/software accelerated graphics" data-slug="graphics"><title> 3:05- 3:30 Modern Emacs/Elisp hardware/software accelerated graphics</title><rect x="125" y="540" opacity="0.8" width="84" height="34" stroke="black" stroke-dasharray="" fill="gray"></rect><g transform="translate(125,572)"><text fill="black" x="0" y="0" font-size="10" transform="nil">graphics</text></g></a><g transform="translate(3,40)"><line stroke="darkgray" x1="40" y1="0" x2="210" y2="0"></line><text fill="black" x="0" y="0" font-size="10" dy=".4em">9 AM</text></g><g transform="translate(3,122)"><line stroke="darkgray" x1="40" y1="0" x2="210" y2="0"></line><text fill="black" x="0" y="0" font-size="10" dy=".4em">10 AM</text></g><g transform="translate(3,204)"><line stroke="darkgray" x1="40" y1="0" x2="210" y2="0"></line><text fill="black" x="0" y="0" font-size="10" dy=".4em">11 AM</text></g><g transform="translate(3,287)"><line stroke="darkgray" x1="40" y1="0" x2="210" y2="0"></line><text fill="black" x="0" y="0" font-size="10" dy=".4em">12 PM</text></g><g transform="translate(3,369)"><line stroke="darkgray" x1="40" y1="0" x2="210" y2="0"></line><text fill="black" x="0" y="0" font-size="10" dy=".4em">1 PM</text></g><g transform="translate(3,451)"><line stroke="darkgray" x1="40" y1="0" x2="210" y2="0"></line><text fill="black" x="0" y="0" font-size="10" dy=".4em">2 PM</text></g><g transform="translate(3,534)"><line stroke="darkgray" x1="40" y1="0" x2="210" y2="0"></line><text fill="black" x="0" y="0" font-size="10" dy=".4em">3 PM</text></g><g transform="translate(3,616)"><line stroke="darkgray" x1="40" y1="0" x2="210" y2="0"></line><text fill="black" x="0" y="0" font-size="10" dy=".4em">4 PM</text></g><g transform="translate(3,698)"><line stroke="darkgray" x1="40" y1="0" x2="210" y2="0"></line><text fill="black" x="0" y="0" font-size="10" dy=".4em">5 PM</text></g></g><g transform="translate(250,0)"><title>Schedule for Sunday</title><rect width="250" height="700" x="0" y="0" fill="white"></rect><text font-size="10" fill="black" y="30" x="3">Sunday</text><a href="https://emacsconf.org/2025/talks/sun-open" title="Sunday opening remarks" data-slug="sun-open"><title> 9:00- 9:10 Sunday opening remarks</title><rect x="40" y="40" opacity="0.8" width="84" height="13" stroke="black" stroke-dasharray="5,5,5" fill="gray"></rect><g transform="translate(40,51)"><text fill="black" x="0" y="0" font-size="10" transform="nil">sun-open</text></g></a><a href="https://emacsconf.org/2025/talks/modern" title="Some problems of modernizing Emacs" data-slug="modern"><title> 9:10- 9:30 Some problems of modernizing Emacs</title><rect x="40" y="53" opacity="0.8" width="84" height="27" stroke="black" stroke-dasharray="5,5,5" fill="gray"></rect><g transform="translate(40,78)"><text fill="black" x="0" y="0" font-size="10" transform="nil">modern</text></g></a><a href="https://emacsconf.org/2025/talks/reader" title="An introduction to the Emacs Reader" data-slug="reader"><title> 9:40-10:15 An introduction to the Emacs Reader</title><rect x="40" y="94" opacity="0.8" width="84" height="48" stroke="black" stroke-dasharray="" fill="gray"></rect><g transform="translate(40,140)"><text fill="black" x="0" y="0" font-size="10" transform="nil">reader</text></g></a><a href="https://emacsconf.org/2025/talks/weights" title="Weightlifting tracking with Emacs on Android" data-slug="weights"><title>10:35-10:45 Weightlifting tracking with Emacs on Android</title><rect x="40" y="170" opacity="0.8" width="84" height="13" stroke="black" stroke-dasharray="" fill="lightblue"></rect><g transform="translate(40,181)"><text fill="black" x="0" y="0" font-size="10" transform="nil">weights</text></g></a><a href="https://emacsconf.org/2025/talks/completion" title="corfu+yasnippet: Easier than I thought" data-slug="completion"><title>11:05-11:25 corfu+yasnippet: Easier than I thought</title><rect x="40" y="211" opacity="0.8" width="84" height="27" stroke="black" stroke-dasharray="" fill="peachpuff"></rect><g transform="translate(40,236)"><text fill="black" x="0" y="0" font-size="10" transform="nil">completion</text></g></a><a href="https://emacsconf.org/2025/talks/zettelkasten" title="Zettelkasten for regular Emacs hackers" data-slug="zettelkasten"><title> 1:00- 1:25 Zettelkasten for regular Emacs hackers</title><rect x="40" y="369" opacity="0.8" width="84" height="34" stroke="black" stroke-dasharray="" fill="peachpuff"></rect><g transform="translate(40,401)"><text fill="black" x="0" y="0" font-size="10" transform="nil">zettelkasten</text></g></a><a href="https://emacsconf.org/2025/talks/hyperboleqa" title="Questions and answers to help you fly with Hyperbole" data-slug="hyperboleqa"><title> 1:45- 2:15 Questions and answers to help you fly with Hyperbole</title><rect x="40" y="431" opacity="0.8" width="84" height="41" stroke="black" stroke-dasharray="" fill="peachpuff"></rect><g transform="translate(40,470)"><text fill="black" x="0" y="0" font-size="10" transform="nil">hyperboleqa</text></g></a><a href="https://emacsconf.org/2025/talks/gardening" title="Gardening in Emacs: A Windows user's tale of tending, tweaking, and triumph" data-slug="gardening"><title> 2:15- 2:35 Gardening in Emacs: A Windows user's tale of tending, tweaking, and triumph</title><rect x="40" y="472" opacity="0.8" width="84" height="27" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect><g transform="translate(40,497)"><text fill="black" x="0" y="0" font-size="10" transform="nil">gardening</text></g></a><a href="https://emacsconf.org/2025/talks/bookclub-tapas" title="Bookclub tapas" data-slug="bookclub-tapas"><title> 2:45- 3:20 Bookclub tapas</title><rect x="40" y="513" opacity="0.8" width="84" height="48" stroke="black" stroke-dasharray="" fill="peachpuff"></rect><g transform="translate(40,559)"><text fill="black" x="0" y="0" font-size="10" transform="nil">bookclub-tapas</text></g></a><a href="https://emacsconf.org/2025/talks/sun-close" title="Sunday closing remarks" data-slug="sun-close"><title> 3:40- 3:50 Sunday closing remarks</title><rect x="40" y="589" opacity="0.8" width="84" height="13" stroke="black" stroke-dasharray="" fill="gray"></rect><g transform="translate(40,600)"><text fill="black" x="0" y="0" font-size="10" transform="nil">sun-close</text></g></a><g transform="translate(3,40)"><line stroke="darkgray" x1="40" y1="0" x2="210" y2="0"></line><text fill="black" x="0" y="0" font-size="10" dy=".4em">9 AM</text></g><g transform="translate(3,122)"><line stroke="darkgray" x1="40" y1="0" x2="210" y2="0"></line><text fill="black" x="0" y="0" font-size="10" dy=".4em">10 AM</text></g><g transform="translate(3,204)"><line stroke="darkgray" x1="40" y1="0" x2="210" y2="0"></line><text fill="black" x="0" y="0" font-size="10" dy=".4em">11 AM</text></g><g transform="translate(3,287)"><line stroke="darkgray" x1="40" y1="0" x2="210" y2="0"></line><text fill="black" x="0" y="0" font-size="10" dy=".4em">12 PM</text></g><g transform="translate(3,369)"><line stroke="darkgray" x1="40" y1="0" x2="210" y2="0"></line><text fill="black" x="0" y="0" font-size="10" dy=".4em">1 PM</text></g><g transform="translate(3,451)"><line stroke="darkgray" x1="40" y1="0" x2="210" y2="0"></line><text fill="black" x="0" y="0" font-size="10" dy=".4em">2 PM</text></g><g transform="translate(3,534)"><line stroke="darkgray" x1="40" y1="0" x2="210" y2="0"></line><text fill="black" x="0" y="0" font-size="10" dy=".4em">3 PM</text></g><g transform="translate(3,616)"><line stroke="darkgray" x1="40" y1="0" x2="210" y2="0"></line><text fill="black" x="0" y="0" font-size="10" dy=".4em">4 PM</text></g><g transform="translate(3,698)"><line stroke="darkgray" x1="40" y1="0" x2="210" y2="0"></line><text fill="black" x="0" y="0" font-size="10" dy=".4em">5 PM</text></g></g></svg> \ No newline at end of file
diff --git a/2025/schedule-details.md b/2025/schedule-details.md
index 75b554af..e0089efe 100644
--- a/2025/schedule-details.md
+++ b/2025/schedule-details.md
@@ -17,13 +17,13 @@ Jump to: <a href="#date-2025-12-06">Sat Dec 6</a> - <a href="#date-2025-12-07">S
[[!template id=sched time="""25""" q-and-a="""<a href="https://media.emacsconf.org/2025/current/bbb-reference.html">BBB</a>""" pad="""https://pad.emacsconf.org/2025-reference""" startutc="""2025-12-06T14:30:00+0000""" endutc="""2025-12-06T14:55:00+0000""" start="""9:30""" end="""9:55""" title="""Emacs as a fully-fledged reference manager""" url="""/2025/talks/reference""" speakers="""Vidianos Giannitsis""" track="""General""" watch="""https://emacsconf.org/2025/watch/gen""" slug="""reference""" note="""captioned, video posted, video: 20:14"""]]
[[!template id=sched time="""25""" q-and-a="""<a href="https://media.emacsconf.org/2025/current/bbb-gmail.html">BBB</a>""" pad="""https://pad.emacsconf.org/2025-gmail""" startutc="""2025-12-06T15:15:00+0000""" endutc="""2025-12-06T15:40:00+0000""" start="""10:15""" end="""10:40""" title="""org-gmail: A deep integration of Gmail into your Org Mode""" url="""/2025/talks/gmail""" speakers="""Bala Ramadurai""" track="""General""" watch="""https://emacsconf.org/2025/watch/gen""" slug="""gmail""" note="""captioned, video posted, video: 23:04"""]]
[[!template id=sched time="""20""" q-and-a="""<a href="https://pad.emacsconf.org/2025-juicemacs">Etherpad</a>""" startutc="""2025-12-06T15:15:00+0000""" endutc="""2025-12-06T15:35:00+0000""" start="""10:15""" end="""10:35""" title="""Juicemacs: exploring speculative JIT compilation for ELisp in Java""" url="""/2025/talks/juicemacs""" speakers="""Kana""" track="""Development""" watch="""https://emacsconf.org/2025/watch/dev""" slug="""juicemacs""" note="""captioned, video posted, video: 19:10"""]]
-[[!template id=sched time="""25""" q-and-a="""none""" pad="""https://pad.emacsconf.org/2025-swanky""" startutc="""2025-12-06T15:45:00+0000""" endutc="""2025-12-06T16:10:00+0000""" start="""10:45""" end="""11:10""" title="""Swanky Python: Interactive development for Python""" url="""/2025/talks/swanky""" speakers="""Scott Zimmermann""" track="""Development""" watch="""https://emacsconf.org/2025/watch/dev""" slug="""swanky""" note="""captioned, video: 21:03"""]]
-[[!template id=sched time="""25""" q-and-a="""<a href="https://media.emacsconf.org/2025/current/bbb-gnus.html">BBB</a>""" pad="""https://pad.emacsconf.org/2025-gnus""" startutc="""2025-12-06T15:50:00+0000""" endutc="""2025-12-06T16:15:00+0000""" start="""10:50""" end="""11:15""" title="""Reading and writing emails in GNU Emacs with Gnus""" url="""/2025/talks/gnus""" speakers="""Amin Bandali""" track="""General""" watch="""https://emacsconf.org/2025/watch/gen""" slug="""gnus""" note="""captioned, video: 21:37"""]]
-[[!template id=sched time="""20""" q-and-a="""<a href="https://media.emacsconf.org/2025/current/bbb-python.html">BBB</a>""" pad="""https://pad.emacsconf.org/2025-python""" startutc="""2025-12-06T16:20:00+0000""" endutc="""2025-12-06T16:40:00+0000""" start="""11:20""" end="""11:40""" title="""Interactive Python programming in Emacs""" url="""/2025/talks/python""" speakers="""David Vujic""" track="""Development""" watch="""https://emacsconf.org/2025/watch/dev""" slug="""python""" note="""captioned, video: 19:52"""]]
+[[!template id=sched time="""25""" q-and-a="""none""" pad="""https://pad.emacsconf.org/2025-swanky""" startutc="""2025-12-06T15:45:00+0000""" endutc="""2025-12-06T16:10:00+0000""" start="""10:45""" end="""11:10""" title="""Swanky Python: Interactive development for Python""" url="""/2025/talks/swanky""" speakers="""Scott Zimmermann""" track="""Development""" watch="""https://emacsconf.org/2025/watch/dev""" slug="""swanky""" note="""captioned, video posted, video: 21:03"""]]
+[[!template id=sched time="""25""" q-and-a="""<a href="https://media.emacsconf.org/2025/current/bbb-gnus.html">BBB</a>""" pad="""https://pad.emacsconf.org/2025-gnus""" startutc="""2025-12-06T15:50:00+0000""" endutc="""2025-12-06T16:15:00+0000""" start="""10:50""" end="""11:15""" title="""Reading and writing emails in GNU Emacs with Gnus""" url="""/2025/talks/gnus""" speakers="""Amin Bandali""" track="""General""" watch="""https://emacsconf.org/2025/watch/gen""" slug="""gnus""" note="""captioned, video posted, video: 21:37"""]]
+[[!template id=sched time="""20""" q-and-a="""<a href="https://media.emacsconf.org/2025/current/bbb-python.html">BBB</a>""" pad="""https://pad.emacsconf.org/2025-python""" startutc="""2025-12-06T16:20:00+0000""" endutc="""2025-12-06T16:40:00+0000""" start="""11:20""" end="""11:40""" title="""Interactive Python programming in Emacs""" url="""/2025/talks/python""" speakers="""David Vujic""" track="""Development""" watch="""https://emacsconf.org/2025/watch/dev""" slug="""python""" note="""captioned, video posted, video: 19:52"""]]
[[!template id=sched time="""20""" q-and-a="""<a href="https://media.emacsconf.org/2025/current/bbb-latex.html">BBB</a>""" pad="""https://pad.emacsconf.org/2025-latex""" startutc="""2025-12-06T16:25:00+0000""" endutc="""2025-12-06T16:45:00+0000""" start="""11:25""" end="""11:45""" title="""LaTeX export in org-mode: the overhaul""" url="""/2025/talks/latex""" speakers="""Pedro A. Aranda Gutiérrez""" track="""General""" watch="""https://emacsconf.org/2025/watch/gen""" slug="""latex""" note=""""""]]
-[[!template id=sched time="""25""" q-and-a="""<a href="https://chat.emacsconf.org/?join=emacsconf,emacsconf-gen">#emacsconf-gen, speaker nick: lispmacs or lispmacs[work]</a>""" pad="""https://pad.emacsconf.org/2025-calc""" startutc="""2025-12-06T18:00:00+0000""" endutc="""2025-12-06T18:25:00+0000""" start="""1:00""" end="""1:25""" title="""Basic Calc functionality for engineering or electronics""" url="""/2025/talks/calc""" speakers="""Christopher Howard""" track="""General""" watch="""https://emacsconf.org/2025/watch/gen""" slug="""calc""" note="""captioned, video: 23:35"""]]
-[[!template id=sched time="""25""" q-and-a="""none""" pad="""https://pad.emacsconf.org/2025-llm""" startutc="""2025-12-06T18:00:00+0000""" endutc="""2025-12-06T18:25:00+0000""" start="""1:00""" end="""1:25""" title="""Emacs, editors, and LLM driven workflows""" url="""/2025/talks/llm""" speakers="""Andrew Hyatt""" track="""Development""" watch="""https://emacsconf.org/2025/watch/dev""" slug="""llm""" note="""captioned, video: 20:04"""]]
-[[!template id=sched time="""40""" q-and-a="""<a href="https://media.emacsconf.org/2025/current/bbb-blee-lcnt.html">BBB</a>""" pad="""https://pad.emacsconf.org/2025-blee-lcnt""" startutc="""2025-12-06T18:35:00+0000""" endutc="""2025-12-06T19:15:00+0000""" start="""1:35""" end="""2:15""" title="""Blee-LCNT: An Emacs-centered content production and self-publication framework""" url="""/2025/talks/blee-lcnt""" speakers="""Mohsen BANAN""" track="""General""" watch="""https://emacsconf.org/2025/watch/gen""" slug="""blee-lcnt""" note="""captioned, video: 36:41"""]]
+[[!template id=sched time="""25""" q-and-a="""<a href="https://chat.emacsconf.org/?join=emacsconf,emacsconf-gen">#emacsconf-gen, speaker nick: lispmacs or lispmacs[work]</a>""" pad="""https://pad.emacsconf.org/2025-calc""" startutc="""2025-12-06T18:00:00+0000""" endutc="""2025-12-06T18:25:00+0000""" start="""1:00""" end="""1:25""" title="""Basic Calc functionality for engineering or electronics""" url="""/2025/talks/calc""" speakers="""Christopher Howard""" track="""General""" watch="""https://emacsconf.org/2025/watch/gen""" slug="""calc""" note="""captioned, video posted, video: 23:35"""]]
+[[!template id=sched time="""25""" q-and-a="""<a href="https://media.emacsconf.org/2025/current/bbb-llm.html">BBB</a>""" pad="""https://pad.emacsconf.org/2025-llm""" startutc="""2025-12-06T18:00:00+0000""" endutc="""2025-12-06T18:25:00+0000""" start="""1:00""" end="""1:25""" title="""Emacs, editors, and LLM driven workflows""" url="""/2025/talks/llm""" speakers="""Andrew Hyatt""" track="""Development""" watch="""https://emacsconf.org/2025/watch/dev""" slug="""llm""" note="""captioned, video posted, video: 20:04"""]]
+[[!template id=sched time="""40""" q-and-a="""<a href="https://media.emacsconf.org/2025/current/bbb-blee-lcnt.html">BBB</a>""" pad="""https://pad.emacsconf.org/2025-blee-lcnt""" startutc="""2025-12-06T18:35:00+0000""" endutc="""2025-12-06T19:15:00+0000""" start="""1:35""" end="""2:15""" title="""Blee-LCNT: An Emacs-centered content production and self-publication framework""" url="""/2025/talks/blee-lcnt""" speakers="""Mohsen BANAN""" track="""General""" watch="""https://emacsconf.org/2025/watch/gen""" slug="""blee-lcnt""" note="""captioned, video posted, video: 36:41"""]]
[[!template id=sched time="""20""" q-and-a="""<a href="https://media.emacsconf.org/2025/current/bbb-private-ai.html">BBB</a>""" pad="""https://pad.emacsconf.org/2025-private-ai""" startutc="""2025-12-06T18:45:00+0000""" endutc="""2025-12-06T19:05:00+0000""" start="""1:45""" end="""2:05""" title="""Emacs and private AI: a great match""" url="""/2025/talks/private-ai""" speakers="""Aaron Grothe""" track="""Development""" watch="""https://emacsconf.org/2025/watch/dev""" slug="""private-ai""" note=""""""]]
[[!template id=sched time="""30""" q-and-a="""<a href="https://chat.emacsconf.org/?join=emacsconf,emacsconf-dev">#emacsconf-dev, speaker nick: screwlisp</a>""" pad="""https://pad.emacsconf.org/2025-commonlisp""" startutc="""2025-12-06T19:25:00+0000""" endutc="""2025-12-06T19:55:00+0000""" start="""2:25""" end="""2:55""" title="""Common Lisp images communicating like-a-human through shared Emacs slime and eev""" url="""/2025/talks/commonlisp""" speakers="""screwlisp""" track="""Development""" watch="""https://emacsconf.org/2025/watch/dev""" slug="""commonlisp""" note="""video: 25:56"""]]
[[!template id=sched time="""5""" q-and-a="""<a href="https://chat.emacsconf.org/?join=emacsconf,emacsconf-gen">#emacsconf-gen, speaker nick: cow_2001</a>""" pad="""https://pad.emacsconf.org/2025-greader""" startutc="""2025-12-06T19:35:00+0000""" endutc="""2025-12-06T19:40:00+0000""" start="""2:35""" end="""2:40""" title="""GNU Emacs Greader (Gnamù Reader) mode is the best Emacs mode in existence""" url="""/2025/talks/greader""" speakers="""Yuval Langer""" track="""General""" watch="""https://emacsconf.org/2025/watch/gen""" slug="""greader""" note="""video: 04:08"""]]
diff --git a/2025/talks/weights.md b/2025/talks/weights.md
index 06701453..49c5db8b 100644
--- a/2025/talks/weights.md
+++ b/2025/talks/weights.md
@@ -11,6 +11,8 @@ Zachary Romero - <https://zacromero.com/>, <mailto:zacromero@posteo.com>
[[!inline pages="internal(2025/info/weights-before)" raw="yes"]]
+The package covered in the talk can be found at <https://github.com/zkry/org-fit>
+
Emacs on Android opens up a world of new possibilities for replacing
proprietary software with free alternatives. One such use case is
using Emacs and org-mode to replace the popular weightlifting tracking
diff --git a/2025/watch/dev.md b/2025/watch/dev.md
index 476051ee..934fd97b 100644
--- a/2025/watch/dev.md
+++ b/2025/watch/dev.md
@@ -13,6 +13,7 @@ For better performance, we recommend watching <a href="https://live0.emacsconf.o
<li>mpv https://live0.emacsconf.org/dev.webm</li>
<li>vlc https://live0.emacsconf.org/dev.webm</li>
<li>ffplay https://live0.emacsconf.org/dev.webm</li>
+<li>You can also watch it in VLC by choosing menu - Media - Open Network Stream and putting in https://live0.emacsconf.org/dev.webm</li>
</ul>
If you have limited bandwidth, you can watch the low-res stream <a href="https://live0.emacsconf.org/dev-480p.webm">https://live0.emacsconf.org/dev-480p.webm</a>.
@@ -32,7 +33,7 @@ If you don't have a streaming media player, you might be able to watch using the
<li>Solid lines: Q&A will be through a BigBlueButton room (you can ask questions there or through IRC/Etherpad)</li>
<li>Dashed lines: Q&A will be over IRC or the Etherpad, or the speaker will follow up afterwards</li></ul>
<div>Times are in Eastern Standard Time (America/Toronto, GMT-5). If you have Javascript enabled, clicking on talk pages should include times in your computer's local time setting.</div>
-<div><svg width="800" height="300" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <title> Graphical view of the schedule</title> <g transform="translate(0,0)"> <title> Schedule for Saturday</title> <rect width="800" height="150" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Saturday</text> <a href="https://emacsconf.org/2025/talks/sat-open" title="Saturday opening remarks" data-slug="sat-open"> <title> 9:00- 9:10 Saturday opening remarks</title> <rect x="0" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(13,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sat-open</text></g></a> <a href="https://emacsconf.org/2025/talks/org-babel" title="Making Org-Babel reactive" data-slug="org-babel"> <title> 9:10- 9:20 Making Org-Babel reactive</title> <rect x="15" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(28,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> org-babel</text></g></a> <a href="https://emacsconf.org/2025/talks/reference" title="Emacs as a fully-fledged reference manager" data-slug="reference"> <title> 9:30- 9:55 Emacs as a fully-fledged reference manager</title> <rect x="47" y="15" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(84,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> reference</text></g></a> <a href="https://emacsconf.org/2025/talks/gmail" title="org-gmail: A deep integration of Gmail into your Org Mode" data-slug="gmail"> <title> 10:15-10:40 org-gmail: A deep integration of Gmail into your Org Mode</title> <rect x="117" y="15" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(154,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> gmail</text></g></a> <a href="https://emacsconf.org/2025/talks/gnus" title="Reading and writing emails in GNU Emacs with Gnus" data-slug="gnus"> <title> 10:50-11:15 Reading and writing emails in GNU Emacs with Gnus</title> <rect x="172" y="15" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(209,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> gnus</text></g></a> <a href="https://emacsconf.org/2025/talks/latex" title="LaTeX export in org-mode: the overhaul" data-slug="latex"> <title> 11:25-11:45 LaTeX export in org-mode: the overhaul</title> <rect x="227" y="15" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(256,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> latex</text></g></a> <a href="https://emacsconf.org/2025/talks/calc" title="Basic Calc functionality for engineering or electronics" data-slug="calc"> <title> 1:00- 1:25 Basic Calc functionality for engineering or electronics</title> <rect x="376" y="15" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(413,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> calc</text></g></a> <a href="https://emacsconf.org/2025/talks/blee-lcnt" title="Blee-LCNT: An Emacs-centered content production and self-publication framework" data-slug="blee-lcnt"> <title> 1:35- 2:15 Blee-LCNT: An Emacs-centered content production and self-publication framework</title> <rect x="431" y="15" opacity="0.8" width="62" 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)"> blee-lcnt</text></g></a> <a href="https://emacsconf.org/2025/talks/greader" title="GNU Emacs Greader (Gnamù Reader) mode is the best Emacs mode in existence" data-slug="greader"> <title> 2:35- 2:40 GNU Emacs Greader (Gnamù Reader) mode is the best Emacs mode in existence</title> <rect x="525" y="15" opacity="0.8" width="7" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(530,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> greader</text></g></a> <a href="https://emacsconf.org/2025/talks/open-mic" title="Open session" data-slug="open-mic"> <title> 2:50- 3:40 Open session</title> <rect x="549" y="15" opacity="0.8" width="78" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(625,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> open-mic</text></g></a> <a href="https://emacsconf.org/2025/talks/sat-close" title="Saturday closing remarks / open session" data-slug="sat-close"> <title> 4:00- 4:10 Saturday closing remarks / open session</title> <rect x="658" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(671,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sat-close</text></g></a> <a href="https://emacsconf.org/2025/talks/schemacs" title="One year progress update Schemacs (formerly Gypsum)" data-slug="schemacs"> <title> 9:30- 9:55 One year progress update Schemacs (formerly Gypsum)</title> <rect x="47" y="75" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(84,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> schemacs</text></g></a> <a href="https://emacsconf.org/2025/talks/juicemacs" title="Juicemacs: exploring speculative JIT compilation for ELisp in Java" data-slug="juicemacs"> <title> 10:15-10:35 Juicemacs: exploring speculative JIT compilation for ELisp in Java</title> <rect x="117" y="75" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(146,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> juicemacs</text></g></a> <a href="https://emacsconf.org/2025/talks/swanky" title="Swanky Python: Interactive development for Python" data-slug="swanky"> <title> 10:45-11:10 Swanky Python: Interactive development for Python</title> <rect x="164" y="75" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(201,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> swanky</text></g></a> <a href="https://emacsconf.org/2025/talks/python" title="Interactive Python programming in Emacs" data-slug="python"> <title> 11:20-11:40 Interactive Python programming in Emacs</title> <rect x="219" y="75" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(248,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> python</text></g></a> <a href="https://emacsconf.org/2025/talks/llm" title="Emacs, editors, and LLM driven workflows" data-slug="llm"> <title> 1:00- 1:25 Emacs, editors, and LLM driven workflows</title> <rect x="376" y="75" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(413,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> llm</text></g></a> <a href="https://emacsconf.org/2025/talks/private-ai" title="Emacs and private AI: a great match" data-slug="private-ai"> <title> 1:45- 2:05 Emacs and private AI: a great match</title> <rect x="447" y="75" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(476,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> private-ai</text></g></a> <a href="https://emacsconf.org/2025/talks/commonlisp" title="Common Lisp images communicating like-a-human through shared Emacs slime and eev" data-slug="commonlisp"> <title> 2:25- 2:55 Common Lisp images communicating like-a-human through shared Emacs slime and eev</title> <rect x="509" y="75" opacity="0.8" width="47" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(554,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> commonlisp</text></g></a> <a href="https://emacsconf.org/2025/talks/graphics" title="Modern Emacs/Elisp hardware/software accelerated graphics" data-slug="graphics"> <title> 3:05- 3:30 Modern Emacs/Elisp hardware/software accelerated graphics</title> <rect x="572" y="75" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(609,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> graphics</text></g></a> <g transform="translate(0,3)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="140" font-size="10" text-anchor="left"> 9 AM</text></g> <g transform="translate(94,3)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="140" font-size="10" text-anchor="left"> 10 AM</text></g> <g transform="translate(188,3)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="140" font-size="10" text-anchor="left"> 11 AM</text></g> <g transform="translate(282,3)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="140" font-size="10" text-anchor="left"> 12 PM</text></g> <g transform="translate(376,3)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="140" font-size="10" text-anchor="left"> 1 PM</text></g> <g transform="translate(470,3)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="140" font-size="10" text-anchor="left"> 2 PM</text></g> <g transform="translate(564,3)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="140" font-size="10" text-anchor="left"> 3 PM</text></g> <g transform="translate(658,3)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="140" font-size="10" text-anchor="left"> 4 PM</text></g> <g transform="translate(752,3)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="140" font-size="10" text-anchor="left"> 5 PM</text></g></g> <g transform="translate(0,150)"> <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="https://emacsconf.org/2025/talks/sun-open" title="Sunday opening remarks" data-slug="sun-open"> <title> 9:00- 9:10 Sunday opening remarks</title> <rect x="0" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(13,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sun-open</text></g></a> <a href="https://emacsconf.org/2025/talks/modern" title="Some problems of modernizing Emacs" data-slug="modern"> <title> 9:10- 9:30 Some problems of modernizing Emacs</title> <rect x="15" y="15" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(44,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> modern</text></g></a> <a href="https://emacsconf.org/2025/talks/reader" title="An introduction to the Emacs Reader" data-slug="reader"> <title> 9:40-10:15 An introduction to the Emacs Reader</title> <rect x="62" y="15" opacity="0.8" width="54" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(114,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> reader</text></g></a> <a href="https://emacsconf.org/2025/talks/weights" title="Weightlifting tracking with Emacs on Android" data-slug="weights"> <title> 10:35-10:45 Weightlifting tracking with Emacs on Android</title> <rect x="149" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(162,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> weights</text></g></a> <a href="https://emacsconf.org/2025/talks/completion" title="corfu+yasnippet: Easier than I thought" data-slug="completion"> <title> 11:05-11:25 corfu+yasnippet: Easier than I thought</title> <rect x="196" y="15" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(225,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> completion</text></g></a> <a href="https://emacsconf.org/2025/talks/zettelkasten" title="Zettelkasten for regular Emacs hackers" data-slug="zettelkasten"> <title> 1:00- 1:25 Zettelkasten for regular Emacs hackers</title> <rect x="376" y="15" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(413,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> zettelkasten</text></g></a> <a href="https://emacsconf.org/2025/talks/hyperboleqa" title="Questions and answers to help you fly with Hyperbole" data-slug="hyperboleqa"> <title> 1:45- 2:15 Questions and answers to help you fly with Hyperbole</title> <rect x="447" y="15" opacity="0.8" width="47" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(492,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> hyperboleqa</text></g></a> <a href="https://emacsconf.org/2025/talks/gardening" title="Gardening in Emacs: A Windows user's tale of tending, tweaking, and triumph" data-slug="gardening"> <title> 2:15- 2:35 Gardening in Emacs: A Windows user's tale of tending, tweaking, and triumph</title> <rect x="494" y="15" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(523,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> gardening</text></g></a> <a href="https://emacsconf.org/2025/talks/bookclub-tapas" title="Bookclub tapas" data-slug="bookclub-tapas"> <title> 2:45- 3:20 Bookclub tapas</title> <rect x="541" y="15" opacity="0.8" width="54" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(593,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> bookclub-tapas</text></g></a> <a href="https://emacsconf.org/2025/talks/sun-close" title="Sunday closing remarks" data-slug="sun-close"> <title> 3:40- 3:50 Sunday closing remarks</title> <rect x="627" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(640,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sun-close</text></g></a> <g transform="translate(0,3)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="140" font-size="10" text-anchor="left"> 9 AM</text></g> <g transform="translate(94,3)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="140" font-size="10" text-anchor="left"> 10 AM</text></g> <g transform="translate(188,3)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="140" font-size="10" text-anchor="left"> 11 AM</text></g> <g transform="translate(282,3)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="140" font-size="10" text-anchor="left"> 12 PM</text></g> <g transform="translate(376,3)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="140" font-size="10" text-anchor="left"> 1 PM</text></g> <g transform="translate(470,3)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="140" font-size="10" text-anchor="left"> 2 PM</text></g> <g transform="translate(564,3)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="140" font-size="10" text-anchor="left"> 3 PM</text></g> <g transform="translate(658,3)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="140" font-size="10" text-anchor="left"> 4 PM</text></g> <g transform="translate(752,3)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="140" font-size="10" text-anchor="left"> 5 PM</text></g></g></svg></div>
+<div><svg width="800" height="300" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><title>Graphical view of the schedule</title><g transform="translate(0,0)"><title>Schedule for Saturday</title><rect width="800" height="150" x="0" y="0" fill="white"></rect><text font-size="10" fill="black" y="12" x="3">Saturday</text><a href="https://emacsconf.org/2025/talks/sat-open" title="Saturday opening remarks" data-slug="sat-open"><title> 9:00- 9:10 Saturday opening remarks</title><rect x="0" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect><g transform="translate(13,73)"><text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)">sat-open</text></g></a><a href="https://emacsconf.org/2025/talks/org-babel" title="Making Org-Babel reactive" data-slug="org-babel"><title> 9:10- 9:20 Making Org-Babel reactive</title><rect x="15" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect><g transform="translate(28,73)"><text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)">org-babel</text></g></a><a href="https://emacsconf.org/2025/talks/reference" title="Emacs as a fully-fledged reference manager" data-slug="reference"><title> 9:30- 9:55 Emacs as a fully-fledged reference manager</title><rect x="47" y="15" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect><g transform="translate(84,73)"><text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)">reference</text></g></a><a href="https://emacsconf.org/2025/talks/gmail" title="org-gmail: A deep integration of Gmail into your Org Mode" data-slug="gmail"><title>10:15-10:40 org-gmail: A deep integration of Gmail into your Org Mode</title><rect x="117" y="15" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect><g transform="translate(154,73)"><text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)">gmail</text></g></a><a href="https://emacsconf.org/2025/talks/gnus" title="Reading and writing emails in GNU Emacs with Gnus" data-slug="gnus"><title>10:50-11:15 Reading and writing emails in GNU Emacs with Gnus</title><rect x="172" y="15" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect><g transform="translate(209,73)"><text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)">gnus</text></g></a><a href="https://emacsconf.org/2025/talks/latex" title="LaTeX export in org-mode: the overhaul" data-slug="latex"><title>11:25-11:45 LaTeX export in org-mode: the overhaul</title><rect x="227" y="15" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect><g transform="translate(256,73)"><text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)">latex</text></g></a><a href="https://emacsconf.org/2025/talks/calc" title="Basic Calc functionality for engineering or electronics" data-slug="calc"><title> 1:00- 1:25 Basic Calc functionality for engineering or electronics</title><rect x="376" y="15" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect><g transform="translate(413,73)"><text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)">calc</text></g></a><a href="https://emacsconf.org/2025/talks/blee-lcnt" title="Blee-LCNT: An Emacs-centered content production and self-publication framework" data-slug="blee-lcnt"><title> 1:35- 2:15 Blee-LCNT: An Emacs-centered content production and self-publication framework</title><rect x="431" y="15" opacity="0.8" width="62" 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)">blee-lcnt</text></g></a><a href="https://emacsconf.org/2025/talks/greader" title="GNU Emacs Greader (Gnamù Reader) mode is the best Emacs mode in existence" data-slug="greader"><title> 2:35- 2:40 GNU Emacs Greader (Gnamù Reader) mode is the best Emacs mode in existence</title><rect x="525" y="15" opacity="0.8" width="7" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect><g transform="translate(530,73)"><text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)">greader</text></g></a><a href="https://emacsconf.org/2025/talks/open-mic" title="Open session" data-slug="open-mic"><title> 2:50- 3:40 Open session</title><rect x="549" y="15" opacity="0.8" width="78" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect><g transform="translate(625,73)"><text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)">open-mic</text></g></a><a href="https://emacsconf.org/2025/talks/sat-close" title="Saturday closing remarks / open session" data-slug="sat-close"><title> 4:00- 4:10 Saturday closing remarks / open session</title><rect x="658" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect><g transform="translate(671,73)"><text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)">sat-close</text></g></a><a href="https://emacsconf.org/2025/talks/schemacs" title="One year progress update Schemacs (formerly Gypsum)" data-slug="schemacs"><title> 9:30- 9:55 One year progress update Schemacs (formerly Gypsum)</title><rect x="47" y="75" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect><g transform="translate(84,133)"><text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)">schemacs</text></g></a><a href="https://emacsconf.org/2025/talks/juicemacs" title="Juicemacs: exploring speculative JIT compilation for ELisp in Java" data-slug="juicemacs"><title>10:15-10:35 Juicemacs: exploring speculative JIT compilation for ELisp in Java</title><rect x="117" y="75" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect><g transform="translate(146,133)"><text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)">juicemacs</text></g></a><a href="https://emacsconf.org/2025/talks/swanky" title="Swanky Python: Interactive development for Python" data-slug="swanky"><title>10:45-11:10 Swanky Python: Interactive development for Python</title><rect x="164" y="75" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect><g transform="translate(201,133)"><text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)">swanky</text></g></a><a href="https://emacsconf.org/2025/talks/python" title="Interactive Python programming in Emacs" data-slug="python"><title>11:20-11:40 Interactive Python programming in Emacs</title><rect x="219" y="75" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect><g transform="translate(248,133)"><text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)">python</text></g></a><a href="https://emacsconf.org/2025/talks/llm" title="Emacs, editors, and LLM driven workflows" data-slug="llm"><title> 1:00- 1:25 Emacs, editors, and LLM driven workflows</title><rect x="376" y="75" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect><g transform="translate(413,133)"><text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)">llm</text></g></a><a href="https://emacsconf.org/2025/talks/private-ai" title="Emacs and private AI: a great match" data-slug="private-ai"><title> 1:45- 2:05 Emacs and private AI: a great match</title><rect x="447" y="75" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect><g transform="translate(476,133)"><text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)">private-ai</text></g></a><a href="https://emacsconf.org/2025/talks/commonlisp" title="Common Lisp images communicating like-a-human through shared Emacs slime and eev" data-slug="commonlisp"><title> 2:25- 2:55 Common Lisp images communicating like-a-human through shared Emacs slime and eev</title><rect x="509" y="75" opacity="0.8" width="47" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect><g transform="translate(554,133)"><text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)">commonlisp</text></g></a><a href="https://emacsconf.org/2025/talks/graphics" title="Modern Emacs/Elisp hardware/software accelerated graphics" data-slug="graphics"><title> 3:05- 3:30 Modern Emacs/Elisp hardware/software accelerated graphics</title><rect x="572" y="75" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect><g transform="translate(609,133)"><text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)">graphics</text></g></a><g transform="translate(0,3)"><line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line><text fill="black" x="0" y="140" font-size="10" text-anchor="left">9 AM</text></g><g transform="translate(94,3)"><line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line><text fill="black" x="0" y="140" font-size="10" text-anchor="left">10 AM</text></g><g transform="translate(188,3)"><line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line><text fill="black" x="0" y="140" font-size="10" text-anchor="left">11 AM</text></g><g transform="translate(282,3)"><line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line><text fill="black" x="0" y="140" font-size="10" text-anchor="left">12 PM</text></g><g transform="translate(376,3)"><line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line><text fill="black" x="0" y="140" font-size="10" text-anchor="left">1 PM</text></g><g transform="translate(470,3)"><line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line><text fill="black" x="0" y="140" font-size="10" text-anchor="left">2 PM</text></g><g transform="translate(564,3)"><line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line><text fill="black" x="0" y="140" font-size="10" text-anchor="left">3 PM</text></g><g transform="translate(658,3)"><line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line><text fill="black" x="0" y="140" font-size="10" text-anchor="left">4 PM</text></g><g transform="translate(752,3)"><line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line><text fill="black" x="0" y="140" font-size="10" text-anchor="left">5 PM</text></g></g><g transform="translate(0,150)"><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="https://emacsconf.org/2025/talks/sun-open" title="Sunday opening remarks" data-slug="sun-open"><title> 9:00- 9:10 Sunday opening remarks</title><rect x="0" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect><g transform="translate(13,73)"><text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)">sun-open</text></g></a><a href="https://emacsconf.org/2025/talks/modern" title="Some problems of modernizing Emacs" data-slug="modern"><title> 9:10- 9:30 Some problems of modernizing Emacs</title><rect x="15" y="15" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect><g transform="translate(44,73)"><text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)">modern</text></g></a><a href="https://emacsconf.org/2025/talks/reader" title="An introduction to the Emacs Reader" data-slug="reader"><title> 9:40-10:15 An introduction to the Emacs Reader</title><rect x="62" y="15" opacity="0.8" width="54" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect><g transform="translate(114,73)"><text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)">reader</text></g></a><a href="https://emacsconf.org/2025/talks/weights" title="Weightlifting tracking with Emacs on Android" data-slug="weights"><title>10:35-10:45 Weightlifting tracking with Emacs on Android</title><rect x="149" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect><g transform="translate(162,73)"><text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)">weights</text></g></a><a href="https://emacsconf.org/2025/talks/completion" title="corfu+yasnippet: Easier than I thought" data-slug="completion"><title>11:05-11:25 corfu+yasnippet: Easier than I thought</title><rect x="196" y="15" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect><g transform="translate(225,73)"><text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)">completion</text></g></a><a href="https://emacsconf.org/2025/talks/zettelkasten" title="Zettelkasten for regular Emacs hackers" data-slug="zettelkasten"><title> 1:00- 1:25 Zettelkasten for regular Emacs hackers</title><rect x="376" y="15" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect><g transform="translate(413,73)"><text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)">zettelkasten</text></g></a><a href="https://emacsconf.org/2025/talks/hyperboleqa" title="Questions and answers to help you fly with Hyperbole" data-slug="hyperboleqa"><title> 1:45- 2:15 Questions and answers to help you fly with Hyperbole</title><rect x="447" y="15" opacity="0.8" width="47" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect><g transform="translate(492,73)"><text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)">hyperboleqa</text></g></a><a href="https://emacsconf.org/2025/talks/gardening" title="Gardening in Emacs: A Windows user's tale of tending, tweaking, and triumph" data-slug="gardening"><title> 2:15- 2:35 Gardening in Emacs: A Windows user's tale of tending, tweaking, and triumph</title><rect x="494" y="15" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect><g transform="translate(523,73)"><text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)">gardening</text></g></a><a href="https://emacsconf.org/2025/talks/bookclub-tapas" title="Bookclub tapas" data-slug="bookclub-tapas"><title> 2:45- 3:20 Bookclub tapas</title><rect x="541" y="15" opacity="0.8" width="54" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect><g transform="translate(593,73)"><text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)">bookclub-tapas</text></g></a><a href="https://emacsconf.org/2025/talks/sun-close" title="Sunday closing remarks" data-slug="sun-close"><title> 3:40- 3:50 Sunday closing remarks</title><rect x="627" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect><g transform="translate(640,73)"><text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)">sun-close</text></g></a><g transform="translate(0,3)"><line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line><text fill="black" x="0" y="140" font-size="10" text-anchor="left">9 AM</text></g><g transform="translate(94,3)"><line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line><text fill="black" x="0" y="140" font-size="10" text-anchor="left">10 AM</text></g><g transform="translate(188,3)"><line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line><text fill="black" x="0" y="140" font-size="10" text-anchor="left">11 AM</text></g><g transform="translate(282,3)"><line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line><text fill="black" x="0" y="140" font-size="10" text-anchor="left">12 PM</text></g><g transform="translate(376,3)"><line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line><text fill="black" x="0" y="140" font-size="10" text-anchor="left">1 PM</text></g><g transform="translate(470,3)"><line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line><text fill="black" x="0" y="140" font-size="10" text-anchor="left">2 PM</text></g><g transform="translate(564,3)"><line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line><text fill="black" x="0" y="140" font-size="10" text-anchor="left">3 PM</text></g><g transform="translate(658,3)"><line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line><text fill="black" x="0" y="140" font-size="10" text-anchor="left">4 PM</text></g><g transform="translate(752,3)"><line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line><text fill="black" x="0" y="140" font-size="10" text-anchor="left">5 PM</text></g></g></svg></div>
<div><h1>Saturday, Dec 6, 2025</h1>
<div data-start="2025-12-06T14:30:00+0000" data-end="2025-12-06T14:55:00+0000" class="sched-entry track-Development">
<div class="sched-meta"><span class="sched-time"><span class="sched-start">9:30</span> - <span class="sched-end">9:55</span></span> <span class="sched-track Development">Development</span> <span class="sched-pad"> <a href="https://pad.emacsconf.org/2025-schemacs">Etherpad</a></span>; <span class="sched-q-and-a">Q&amp;A: <a href="https://media.emacsconf.org/2025/current/bbb-schemacs.html">BBB</a></span>; <span class="sched-slug">id:schemacs</span></div>
diff --git a/2025/watch/gen.md b/2025/watch/gen.md
index 03b786ef..73152da1 100644
--- a/2025/watch/gen.md
+++ b/2025/watch/gen.md
@@ -13,6 +13,7 @@ For better performance, we recommend watching <a href="https://live0.emacsconf.o
<li>mpv https://live0.emacsconf.org/gen.webm</li>
<li>vlc https://live0.emacsconf.org/gen.webm</li>
<li>ffplay https://live0.emacsconf.org/gen.webm</li>
+<li>You can also watch it in VLC by choosing menu - Media - Open Network Stream and putting in https://live0.emacsconf.org/gen.webm</li>
</ul>
If you have limited bandwidth, you can watch the low-res stream <a href="https://live0.emacsconf.org/gen-480p.webm">https://live0.emacsconf.org/gen-480p.webm</a>.
@@ -32,7 +33,7 @@ If you don't have a streaming media player, you might be able to watch using the
<li>Solid lines: Q&A will be through a BigBlueButton room (you can ask questions there or through IRC/Etherpad)</li>
<li>Dashed lines: Q&A will be over IRC or the Etherpad, or the speaker will follow up afterwards</li></ul>
<div>Times are in Eastern Standard Time (America/Toronto, GMT-5). If you have Javascript enabled, clicking on talk pages should include times in your computer's local time setting.</div>
-<div><svg width="800" height="300" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <title> Graphical view of the schedule</title> <g transform="translate(0,0)"> <title> Schedule for Saturday</title> <rect width="800" height="150" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Saturday</text> <a href="https://emacsconf.org/2025/talks/sat-open" title="Saturday opening remarks" data-slug="sat-open"> <title> 9:00- 9:10 Saturday opening remarks</title> <rect x="0" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(13,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sat-open</text></g></a> <a href="https://emacsconf.org/2025/talks/org-babel" title="Making Org-Babel reactive" data-slug="org-babel"> <title> 9:10- 9:20 Making Org-Babel reactive</title> <rect x="15" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(28,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> org-babel</text></g></a> <a href="https://emacsconf.org/2025/talks/reference" title="Emacs as a fully-fledged reference manager" data-slug="reference"> <title> 9:30- 9:55 Emacs as a fully-fledged reference manager</title> <rect x="47" y="15" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(84,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> reference</text></g></a> <a href="https://emacsconf.org/2025/talks/gmail" title="org-gmail: A deep integration of Gmail into your Org Mode" data-slug="gmail"> <title> 10:15-10:40 org-gmail: A deep integration of Gmail into your Org Mode</title> <rect x="117" y="15" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(154,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> gmail</text></g></a> <a href="https://emacsconf.org/2025/talks/gnus" title="Reading and writing emails in GNU Emacs with Gnus" data-slug="gnus"> <title> 10:50-11:15 Reading and writing emails in GNU Emacs with Gnus</title> <rect x="172" y="15" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(209,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> gnus</text></g></a> <a href="https://emacsconf.org/2025/talks/latex" title="LaTeX export in org-mode: the overhaul" data-slug="latex"> <title> 11:25-11:45 LaTeX export in org-mode: the overhaul</title> <rect x="227" y="15" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(256,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> latex</text></g></a> <a href="https://emacsconf.org/2025/talks/calc" title="Basic Calc functionality for engineering or electronics" data-slug="calc"> <title> 1:00- 1:25 Basic Calc functionality for engineering or electronics</title> <rect x="376" y="15" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(413,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> calc</text></g></a> <a href="https://emacsconf.org/2025/talks/blee-lcnt" title="Blee-LCNT: An Emacs-centered content production and self-publication framework" data-slug="blee-lcnt"> <title> 1:35- 2:15 Blee-LCNT: An Emacs-centered content production and self-publication framework</title> <rect x="431" y="15" opacity="0.8" width="62" 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)"> blee-lcnt</text></g></a> <a href="https://emacsconf.org/2025/talks/greader" title="GNU Emacs Greader (Gnamù Reader) mode is the best Emacs mode in existence" data-slug="greader"> <title> 2:35- 2:40 GNU Emacs Greader (Gnamù Reader) mode is the best Emacs mode in existence</title> <rect x="525" y="15" opacity="0.8" width="7" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(530,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> greader</text></g></a> <a href="https://emacsconf.org/2025/talks/open-mic" title="Open session" data-slug="open-mic"> <title> 2:50- 3:40 Open session</title> <rect x="549" y="15" opacity="0.8" width="78" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(625,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> open-mic</text></g></a> <a href="https://emacsconf.org/2025/talks/sat-close" title="Saturday closing remarks / open session" data-slug="sat-close"> <title> 4:00- 4:10 Saturday closing remarks / open session</title> <rect x="658" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(671,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sat-close</text></g></a> <a href="https://emacsconf.org/2025/talks/schemacs" title="One year progress update Schemacs (formerly Gypsum)" data-slug="schemacs"> <title> 9:30- 9:55 One year progress update Schemacs (formerly Gypsum)</title> <rect x="47" y="75" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(84,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> schemacs</text></g></a> <a href="https://emacsconf.org/2025/talks/juicemacs" title="Juicemacs: exploring speculative JIT compilation for ELisp in Java" data-slug="juicemacs"> <title> 10:15-10:35 Juicemacs: exploring speculative JIT compilation for ELisp in Java</title> <rect x="117" y="75" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(146,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> juicemacs</text></g></a> <a href="https://emacsconf.org/2025/talks/swanky" title="Swanky Python: Interactive development for Python" data-slug="swanky"> <title> 10:45-11:10 Swanky Python: Interactive development for Python</title> <rect x="164" y="75" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(201,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> swanky</text></g></a> <a href="https://emacsconf.org/2025/talks/python" title="Interactive Python programming in Emacs" data-slug="python"> <title> 11:20-11:40 Interactive Python programming in Emacs</title> <rect x="219" y="75" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(248,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> python</text></g></a> <a href="https://emacsconf.org/2025/talks/llm" title="Emacs, editors, and LLM driven workflows" data-slug="llm"> <title> 1:00- 1:25 Emacs, editors, and LLM driven workflows</title> <rect x="376" y="75" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(413,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> llm</text></g></a> <a href="https://emacsconf.org/2025/talks/private-ai" title="Emacs and private AI: a great match" data-slug="private-ai"> <title> 1:45- 2:05 Emacs and private AI: a great match</title> <rect x="447" y="75" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(476,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> private-ai</text></g></a> <a href="https://emacsconf.org/2025/talks/commonlisp" title="Common Lisp images communicating like-a-human through shared Emacs slime and eev" data-slug="commonlisp"> <title> 2:25- 2:55 Common Lisp images communicating like-a-human through shared Emacs slime and eev</title> <rect x="509" y="75" opacity="0.8" width="47" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(554,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> commonlisp</text></g></a> <a href="https://emacsconf.org/2025/talks/graphics" title="Modern Emacs/Elisp hardware/software accelerated graphics" data-slug="graphics"> <title> 3:05- 3:30 Modern Emacs/Elisp hardware/software accelerated graphics</title> <rect x="572" y="75" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(609,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> graphics</text></g></a> <g transform="translate(0,3)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="140" font-size="10" text-anchor="left"> 9 AM</text></g> <g transform="translate(94,3)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="140" font-size="10" text-anchor="left"> 10 AM</text></g> <g transform="translate(188,3)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="140" font-size="10" text-anchor="left"> 11 AM</text></g> <g transform="translate(282,3)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="140" font-size="10" text-anchor="left"> 12 PM</text></g> <g transform="translate(376,3)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="140" font-size="10" text-anchor="left"> 1 PM</text></g> <g transform="translate(470,3)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="140" font-size="10" text-anchor="left"> 2 PM</text></g> <g transform="translate(564,3)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="140" font-size="10" text-anchor="left"> 3 PM</text></g> <g transform="translate(658,3)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="140" font-size="10" text-anchor="left"> 4 PM</text></g> <g transform="translate(752,3)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="140" font-size="10" text-anchor="left"> 5 PM</text></g></g> <g transform="translate(0,150)"> <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="https://emacsconf.org/2025/talks/sun-open" title="Sunday opening remarks" data-slug="sun-open"> <title> 9:00- 9:10 Sunday opening remarks</title> <rect x="0" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(13,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sun-open</text></g></a> <a href="https://emacsconf.org/2025/talks/modern" title="Some problems of modernizing Emacs" data-slug="modern"> <title> 9:10- 9:30 Some problems of modernizing Emacs</title> <rect x="15" y="15" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(44,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> modern</text></g></a> <a href="https://emacsconf.org/2025/talks/reader" title="An introduction to the Emacs Reader" data-slug="reader"> <title> 9:40-10:15 An introduction to the Emacs Reader</title> <rect x="62" y="15" opacity="0.8" width="54" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(114,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> reader</text></g></a> <a href="https://emacsconf.org/2025/talks/weights" title="Weightlifting tracking with Emacs on Android" data-slug="weights"> <title> 10:35-10:45 Weightlifting tracking with Emacs on Android</title> <rect x="149" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(162,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> weights</text></g></a> <a href="https://emacsconf.org/2025/talks/completion" title="corfu+yasnippet: Easier than I thought" data-slug="completion"> <title> 11:05-11:25 corfu+yasnippet: Easier than I thought</title> <rect x="196" y="15" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(225,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> completion</text></g></a> <a href="https://emacsconf.org/2025/talks/zettelkasten" title="Zettelkasten for regular Emacs hackers" data-slug="zettelkasten"> <title> 1:00- 1:25 Zettelkasten for regular Emacs hackers</title> <rect x="376" y="15" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(413,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> zettelkasten</text></g></a> <a href="https://emacsconf.org/2025/talks/hyperboleqa" title="Questions and answers to help you fly with Hyperbole" data-slug="hyperboleqa"> <title> 1:45- 2:15 Questions and answers to help you fly with Hyperbole</title> <rect x="447" y="15" opacity="0.8" width="47" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(492,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> hyperboleqa</text></g></a> <a href="https://emacsconf.org/2025/talks/gardening" title="Gardening in Emacs: A Windows user's tale of tending, tweaking, and triumph" data-slug="gardening"> <title> 2:15- 2:35 Gardening in Emacs: A Windows user's tale of tending, tweaking, and triumph</title> <rect x="494" y="15" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(523,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> gardening</text></g></a> <a href="https://emacsconf.org/2025/talks/bookclub-tapas" title="Bookclub tapas" data-slug="bookclub-tapas"> <title> 2:45- 3:20 Bookclub tapas</title> <rect x="541" y="15" opacity="0.8" width="54" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(593,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> bookclub-tapas</text></g></a> <a href="https://emacsconf.org/2025/talks/sun-close" title="Sunday closing remarks" data-slug="sun-close"> <title> 3:40- 3:50 Sunday closing remarks</title> <rect x="627" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(640,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sun-close</text></g></a> <g transform="translate(0,3)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="140" font-size="10" text-anchor="left"> 9 AM</text></g> <g transform="translate(94,3)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="140" font-size="10" text-anchor="left"> 10 AM</text></g> <g transform="translate(188,3)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="140" font-size="10" text-anchor="left"> 11 AM</text></g> <g transform="translate(282,3)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="140" font-size="10" text-anchor="left"> 12 PM</text></g> <g transform="translate(376,3)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="140" font-size="10" text-anchor="left"> 1 PM</text></g> <g transform="translate(470,3)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="140" font-size="10" text-anchor="left"> 2 PM</text></g> <g transform="translate(564,3)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="140" font-size="10" text-anchor="left"> 3 PM</text></g> <g transform="translate(658,3)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="140" font-size="10" text-anchor="left"> 4 PM</text></g> <g transform="translate(752,3)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="140" font-size="10" text-anchor="left"> 5 PM</text></g></g></svg></div>
+<div><svg width="800" height="300" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><title>Graphical view of the schedule</title><g transform="translate(0,0)"><title>Schedule for Saturday</title><rect width="800" height="150" x="0" y="0" fill="white"></rect><text font-size="10" fill="black" y="12" x="3">Saturday</text><a href="https://emacsconf.org/2025/talks/sat-open" title="Saturday opening remarks" data-slug="sat-open"><title> 9:00- 9:10 Saturday opening remarks</title><rect x="0" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect><g transform="translate(13,73)"><text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)">sat-open</text></g></a><a href="https://emacsconf.org/2025/talks/org-babel" title="Making Org-Babel reactive" data-slug="org-babel"><title> 9:10- 9:20 Making Org-Babel reactive</title><rect x="15" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect><g transform="translate(28,73)"><text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)">org-babel</text></g></a><a href="https://emacsconf.org/2025/talks/reference" title="Emacs as a fully-fledged reference manager" data-slug="reference"><title> 9:30- 9:55 Emacs as a fully-fledged reference manager</title><rect x="47" y="15" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect><g transform="translate(84,73)"><text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)">reference</text></g></a><a href="https://emacsconf.org/2025/talks/gmail" title="org-gmail: A deep integration of Gmail into your Org Mode" data-slug="gmail"><title>10:15-10:40 org-gmail: A deep integration of Gmail into your Org Mode</title><rect x="117" y="15" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect><g transform="translate(154,73)"><text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)">gmail</text></g></a><a href="https://emacsconf.org/2025/talks/gnus" title="Reading and writing emails in GNU Emacs with Gnus" data-slug="gnus"><title>10:50-11:15 Reading and writing emails in GNU Emacs with Gnus</title><rect x="172" y="15" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect><g transform="translate(209,73)"><text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)">gnus</text></g></a><a href="https://emacsconf.org/2025/talks/latex" title="LaTeX export in org-mode: the overhaul" data-slug="latex"><title>11:25-11:45 LaTeX export in org-mode: the overhaul</title><rect x="227" y="15" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect><g transform="translate(256,73)"><text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)">latex</text></g></a><a href="https://emacsconf.org/2025/talks/calc" title="Basic Calc functionality for engineering or electronics" data-slug="calc"><title> 1:00- 1:25 Basic Calc functionality for engineering or electronics</title><rect x="376" y="15" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect><g transform="translate(413,73)"><text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)">calc</text></g></a><a href="https://emacsconf.org/2025/talks/blee-lcnt" title="Blee-LCNT: An Emacs-centered content production and self-publication framework" data-slug="blee-lcnt"><title> 1:35- 2:15 Blee-LCNT: An Emacs-centered content production and self-publication framework</title><rect x="431" y="15" opacity="0.8" width="62" 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)">blee-lcnt</text></g></a><a href="https://emacsconf.org/2025/talks/greader" title="GNU Emacs Greader (Gnamù Reader) mode is the best Emacs mode in existence" data-slug="greader"><title> 2:35- 2:40 GNU Emacs Greader (Gnamù Reader) mode is the best Emacs mode in existence</title><rect x="525" y="15" opacity="0.8" width="7" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect><g transform="translate(530,73)"><text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)">greader</text></g></a><a href="https://emacsconf.org/2025/talks/open-mic" title="Open session" data-slug="open-mic"><title> 2:50- 3:40 Open session</title><rect x="549" y="15" opacity="0.8" width="78" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect><g transform="translate(625,73)"><text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)">open-mic</text></g></a><a href="https://emacsconf.org/2025/talks/sat-close" title="Saturday closing remarks / open session" data-slug="sat-close"><title> 4:00- 4:10 Saturday closing remarks / open session</title><rect x="658" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect><g transform="translate(671,73)"><text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)">sat-close</text></g></a><a href="https://emacsconf.org/2025/talks/schemacs" title="One year progress update Schemacs (formerly Gypsum)" data-slug="schemacs"><title> 9:30- 9:55 One year progress update Schemacs (formerly Gypsum)</title><rect x="47" y="75" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect><g transform="translate(84,133)"><text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)">schemacs</text></g></a><a href="https://emacsconf.org/2025/talks/juicemacs" title="Juicemacs: exploring speculative JIT compilation for ELisp in Java" data-slug="juicemacs"><title>10:15-10:35 Juicemacs: exploring speculative JIT compilation for ELisp in Java</title><rect x="117" y="75" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect><g transform="translate(146,133)"><text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)">juicemacs</text></g></a><a href="https://emacsconf.org/2025/talks/swanky" title="Swanky Python: Interactive development for Python" data-slug="swanky"><title>10:45-11:10 Swanky Python: Interactive development for Python</title><rect x="164" y="75" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect><g transform="translate(201,133)"><text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)">swanky</text></g></a><a href="https://emacsconf.org/2025/talks/python" title="Interactive Python programming in Emacs" data-slug="python"><title>11:20-11:40 Interactive Python programming in Emacs</title><rect x="219" y="75" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect><g transform="translate(248,133)"><text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)">python</text></g></a><a href="https://emacsconf.org/2025/talks/llm" title="Emacs, editors, and LLM driven workflows" data-slug="llm"><title> 1:00- 1:25 Emacs, editors, and LLM driven workflows</title><rect x="376" y="75" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect><g transform="translate(413,133)"><text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)">llm</text></g></a><a href="https://emacsconf.org/2025/talks/private-ai" title="Emacs and private AI: a great match" data-slug="private-ai"><title> 1:45- 2:05 Emacs and private AI: a great match</title><rect x="447" y="75" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect><g transform="translate(476,133)"><text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)">private-ai</text></g></a><a href="https://emacsconf.org/2025/talks/commonlisp" title="Common Lisp images communicating like-a-human through shared Emacs slime and eev" data-slug="commonlisp"><title> 2:25- 2:55 Common Lisp images communicating like-a-human through shared Emacs slime and eev</title><rect x="509" y="75" opacity="0.8" width="47" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect><g transform="translate(554,133)"><text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)">commonlisp</text></g></a><a href="https://emacsconf.org/2025/talks/graphics" title="Modern Emacs/Elisp hardware/software accelerated graphics" data-slug="graphics"><title> 3:05- 3:30 Modern Emacs/Elisp hardware/software accelerated graphics</title><rect x="572" y="75" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect><g transform="translate(609,133)"><text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)">graphics</text></g></a><g transform="translate(0,3)"><line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line><text fill="black" x="0" y="140" font-size="10" text-anchor="left">9 AM</text></g><g transform="translate(94,3)"><line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line><text fill="black" x="0" y="140" font-size="10" text-anchor="left">10 AM</text></g><g transform="translate(188,3)"><line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line><text fill="black" x="0" y="140" font-size="10" text-anchor="left">11 AM</text></g><g transform="translate(282,3)"><line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line><text fill="black" x="0" y="140" font-size="10" text-anchor="left">12 PM</text></g><g transform="translate(376,3)"><line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line><text fill="black" x="0" y="140" font-size="10" text-anchor="left">1 PM</text></g><g transform="translate(470,3)"><line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line><text fill="black" x="0" y="140" font-size="10" text-anchor="left">2 PM</text></g><g transform="translate(564,3)"><line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line><text fill="black" x="0" y="140" font-size="10" text-anchor="left">3 PM</text></g><g transform="translate(658,3)"><line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line><text fill="black" x="0" y="140" font-size="10" text-anchor="left">4 PM</text></g><g transform="translate(752,3)"><line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line><text fill="black" x="0" y="140" font-size="10" text-anchor="left">5 PM</text></g></g><g transform="translate(0,150)"><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="https://emacsconf.org/2025/talks/sun-open" title="Sunday opening remarks" data-slug="sun-open"><title> 9:00- 9:10 Sunday opening remarks</title><rect x="0" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect><g transform="translate(13,73)"><text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)">sun-open</text></g></a><a href="https://emacsconf.org/2025/talks/modern" title="Some problems of modernizing Emacs" data-slug="modern"><title> 9:10- 9:30 Some problems of modernizing Emacs</title><rect x="15" y="15" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect><g transform="translate(44,73)"><text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)">modern</text></g></a><a href="https://emacsconf.org/2025/talks/reader" title="An introduction to the Emacs Reader" data-slug="reader"><title> 9:40-10:15 An introduction to the Emacs Reader</title><rect x="62" y="15" opacity="0.8" width="54" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect><g transform="translate(114,73)"><text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)">reader</text></g></a><a href="https://emacsconf.org/2025/talks/weights" title="Weightlifting tracking with Emacs on Android" data-slug="weights"><title>10:35-10:45 Weightlifting tracking with Emacs on Android</title><rect x="149" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect><g transform="translate(162,73)"><text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)">weights</text></g></a><a href="https://emacsconf.org/2025/talks/completion" title="corfu+yasnippet: Easier than I thought" data-slug="completion"><title>11:05-11:25 corfu+yasnippet: Easier than I thought</title><rect x="196" y="15" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect><g transform="translate(225,73)"><text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)">completion</text></g></a><a href="https://emacsconf.org/2025/talks/zettelkasten" title="Zettelkasten for regular Emacs hackers" data-slug="zettelkasten"><title> 1:00- 1:25 Zettelkasten for regular Emacs hackers</title><rect x="376" y="15" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect><g transform="translate(413,73)"><text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)">zettelkasten</text></g></a><a href="https://emacsconf.org/2025/talks/hyperboleqa" title="Questions and answers to help you fly with Hyperbole" data-slug="hyperboleqa"><title> 1:45- 2:15 Questions and answers to help you fly with Hyperbole</title><rect x="447" y="15" opacity="0.8" width="47" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect><g transform="translate(492,73)"><text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)">hyperboleqa</text></g></a><a href="https://emacsconf.org/2025/talks/gardening" title="Gardening in Emacs: A Windows user's tale of tending, tweaking, and triumph" data-slug="gardening"><title> 2:15- 2:35 Gardening in Emacs: A Windows user's tale of tending, tweaking, and triumph</title><rect x="494" y="15" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect><g transform="translate(523,73)"><text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)">gardening</text></g></a><a href="https://emacsconf.org/2025/talks/bookclub-tapas" title="Bookclub tapas" data-slug="bookclub-tapas"><title> 2:45- 3:20 Bookclub tapas</title><rect x="541" y="15" opacity="0.8" width="54" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect><g transform="translate(593,73)"><text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)">bookclub-tapas</text></g></a><a href="https://emacsconf.org/2025/talks/sun-close" title="Sunday closing remarks" data-slug="sun-close"><title> 3:40- 3:50 Sunday closing remarks</title><rect x="627" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect><g transform="translate(640,73)"><text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)">sun-close</text></g></a><g transform="translate(0,3)"><line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line><text fill="black" x="0" y="140" font-size="10" text-anchor="left">9 AM</text></g><g transform="translate(94,3)"><line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line><text fill="black" x="0" y="140" font-size="10" text-anchor="left">10 AM</text></g><g transform="translate(188,3)"><line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line><text fill="black" x="0" y="140" font-size="10" text-anchor="left">11 AM</text></g><g transform="translate(282,3)"><line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line><text fill="black" x="0" y="140" font-size="10" text-anchor="left">12 PM</text></g><g transform="translate(376,3)"><line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line><text fill="black" x="0" y="140" font-size="10" text-anchor="left">1 PM</text></g><g transform="translate(470,3)"><line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line><text fill="black" x="0" y="140" font-size="10" text-anchor="left">2 PM</text></g><g transform="translate(564,3)"><line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line><text fill="black" x="0" y="140" font-size="10" text-anchor="left">3 PM</text></g><g transform="translate(658,3)"><line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line><text fill="black" x="0" y="140" font-size="10" text-anchor="left">4 PM</text></g><g transform="translate(752,3)"><line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line><text fill="black" x="0" y="140" font-size="10" text-anchor="left">5 PM</text></g></g></svg></div>
<div><h1>Saturday, Dec 6, 2025</h1>
<div data-start="2025-12-06T14:00:00+0000" data-end="2025-12-06T14:10:00+0000" class="sched-entry track-General">
<div class="sched-meta"><span class="sched-time"><span class="sched-start">9:00</span> - <span class="sched-end">9:10</span></span> <span class="sched-track General">General</span> <span class="sched-pad"> <a href="https://pad.emacsconf.org/2025-sat-open">Etherpad</a></span>; <span class="sched-q-and-a">Q&amp;A: <a href="https://pad.emacsconf.org/2025-sat-open">Etherpad</a></span>; <span class="sched-slug">id:sat-open</span></div>
diff --git a/2025/watch/info.md b/2025/watch/info.md
index 8eefd6d9..557b1dfd 100644
--- a/2025/watch/info.md
+++ b/2025/watch/info.md
@@ -8,4 +8,4 @@ mpv https://live0.emacsconf.org/dev.webm
<tr><td><div class="sched-track General"><a href="https://live.emacsconf.org/2025/watch/gen/">General</a></div></td><td><a href="https://live.emacsconf.org/2025/watch/gen-480p/">General (low-res)</a></td><td><a href="https://chat.emacsconf.org/?join=emacsconf,emacsconf-org,emacsconf-accessible,emacsconf-dev,emacsconf-gen">emacsconf-gen</a></td><td><a href="https://live0.emacsconf.org/gen.webm">https://live0.emacsconf.org/gen.webm</a></td><td><a href="https://live0.emacsconf.org/gen-480p.webm">gen-480p.webm</a></tr>
<tr><td><div class="sched-track Development"><a href="https://live.emacsconf.org/2025/watch/dev/">Development</a></div></td><td><a href="https://live.emacsconf.org/2025/watch/dev-480p/">Development (low-res)</a></td><td><a href="https://chat.emacsconf.org/?join=emacsconf,emacsconf-org,emacsconf-accessible,emacsconf-gen,emacsconf-dev">emacsconf-dev</a></td><td><a href="https://live0.emacsconf.org/dev.webm">https://live0.emacsconf.org/dev.webm</a></td><td><a href="https://live0.emacsconf.org/dev-480p.webm">dev-480p.webm</a></tr></table>
-<svg width="800" height="300" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <title> Graphical view of the schedule</title> <g transform="translate(0,0)"> <title> Schedule for Saturday</title> <rect width="800" height="150" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Saturday</text> <a href="https://emacsconf.org/2025/talks/sat-open" title="Saturday opening remarks" data-slug="sat-open"> <title> 9:00- 9:10 Saturday opening remarks</title> <rect x="0" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(13,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sat-open</text></g></a> <a href="https://emacsconf.org/2025/talks/org-babel" title="Making Org-Babel reactive" data-slug="org-babel"> <title> 9:10- 9:20 Making Org-Babel reactive</title> <rect x="15" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(28,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> org-babel</text></g></a> <a href="https://emacsconf.org/2025/talks/reference" title="Emacs as a fully-fledged reference manager" data-slug="reference"> <title> 9:30- 9:55 Emacs as a fully-fledged reference manager</title> <rect x="47" y="15" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(84,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> reference</text></g></a> <a href="https://emacsconf.org/2025/talks/gmail" title="org-gmail: A deep integration of Gmail into your Org Mode" data-slug="gmail"> <title> 10:15-10:40 org-gmail: A deep integration of Gmail into your Org Mode</title> <rect x="117" y="15" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(154,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> gmail</text></g></a> <a href="https://emacsconf.org/2025/talks/gnus" title="Reading and writing emails in GNU Emacs with Gnus" data-slug="gnus"> <title> 10:50-11:15 Reading and writing emails in GNU Emacs with Gnus</title> <rect x="172" y="15" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(209,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> gnus</text></g></a> <a href="https://emacsconf.org/2025/talks/latex" title="LaTeX export in org-mode: the overhaul" data-slug="latex"> <title> 11:25-11:45 LaTeX export in org-mode: the overhaul</title> <rect x="227" y="15" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(256,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> latex</text></g></a> <a href="https://emacsconf.org/2025/talks/calc" title="Basic Calc functionality for engineering or electronics" data-slug="calc"> <title> 1:00- 1:25 Basic Calc functionality for engineering or electronics</title> <rect x="376" y="15" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(413,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> calc</text></g></a> <a href="https://emacsconf.org/2025/talks/blee-lcnt" title="Blee-LCNT: An Emacs-centered content production and self-publication framework" data-slug="blee-lcnt"> <title> 1:35- 2:15 Blee-LCNT: An Emacs-centered content production and self-publication framework</title> <rect x="431" y="15" opacity="0.8" width="62" 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)"> blee-lcnt</text></g></a> <a href="https://emacsconf.org/2025/talks/greader" title="GNU Emacs Greader (Gnamù Reader) mode is the best Emacs mode in existence" data-slug="greader"> <title> 2:35- 2:40 GNU Emacs Greader (Gnamù Reader) mode is the best Emacs mode in existence</title> <rect x="525" y="15" opacity="0.8" width="7" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(530,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> greader</text></g></a> <a href="https://emacsconf.org/2025/talks/open-mic" title="Open session" data-slug="open-mic"> <title> 2:50- 3:40 Open session</title> <rect x="549" y="15" opacity="0.8" width="78" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(625,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> open-mic</text></g></a> <a href="https://emacsconf.org/2025/talks/sat-close" title="Saturday closing remarks / open session" data-slug="sat-close"> <title> 4:00- 4:10 Saturday closing remarks / open session</title> <rect x="658" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(671,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sat-close</text></g></a> <a href="https://emacsconf.org/2025/talks/schemacs" title="One year progress update Schemacs (formerly Gypsum)" data-slug="schemacs"> <title> 9:30- 9:55 One year progress update Schemacs (formerly Gypsum)</title> <rect x="47" y="75" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(84,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> schemacs</text></g></a> <a href="https://emacsconf.org/2025/talks/juicemacs" title="Juicemacs: exploring speculative JIT compilation for ELisp in Java" data-slug="juicemacs"> <title> 10:15-10:35 Juicemacs: exploring speculative JIT compilation for ELisp in Java</title> <rect x="117" y="75" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(146,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> juicemacs</text></g></a> <a href="https://emacsconf.org/2025/talks/swanky" title="Swanky Python: Interactive development for Python" data-slug="swanky"> <title> 10:45-11:10 Swanky Python: Interactive development for Python</title> <rect x="164" y="75" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(201,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> swanky</text></g></a> <a href="https://emacsconf.org/2025/talks/python" title="Interactive Python programming in Emacs" data-slug="python"> <title> 11:20-11:40 Interactive Python programming in Emacs</title> <rect x="219" y="75" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(248,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> python</text></g></a> <a href="https://emacsconf.org/2025/talks/llm" title="Emacs, editors, and LLM driven workflows" data-slug="llm"> <title> 1:00- 1:25 Emacs, editors, and LLM driven workflows</title> <rect x="376" y="75" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(413,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> llm</text></g></a> <a href="https://emacsconf.org/2025/talks/private-ai" title="Emacs and private AI: a great match" data-slug="private-ai"> <title> 1:45- 2:05 Emacs and private AI: a great match</title> <rect x="447" y="75" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(476,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> private-ai</text></g></a> <a href="https://emacsconf.org/2025/talks/commonlisp" title="Common Lisp images communicating like-a-human through shared Emacs slime and eev" data-slug="commonlisp"> <title> 2:25- 2:55 Common Lisp images communicating like-a-human through shared Emacs slime and eev</title> <rect x="509" y="75" opacity="0.8" width="47" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(554,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> commonlisp</text></g></a> <a href="https://emacsconf.org/2025/talks/graphics" title="Modern Emacs/Elisp hardware/software accelerated graphics" data-slug="graphics"> <title> 3:05- 3:30 Modern Emacs/Elisp hardware/software accelerated graphics</title> <rect x="572" y="75" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(609,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> graphics</text></g></a> <g transform="translate(0,3)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="140" font-size="10" text-anchor="left"> 9 AM</text></g> <g transform="translate(94,3)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="140" font-size="10" text-anchor="left"> 10 AM</text></g> <g transform="translate(188,3)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="140" font-size="10" text-anchor="left"> 11 AM</text></g> <g transform="translate(282,3)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="140" font-size="10" text-anchor="left"> 12 PM</text></g> <g transform="translate(376,3)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="140" font-size="10" text-anchor="left"> 1 PM</text></g> <g transform="translate(470,3)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="140" font-size="10" text-anchor="left"> 2 PM</text></g> <g transform="translate(564,3)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="140" font-size="10" text-anchor="left"> 3 PM</text></g> <g transform="translate(658,3)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="140" font-size="10" text-anchor="left"> 4 PM</text></g> <g transform="translate(752,3)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="140" font-size="10" text-anchor="left"> 5 PM</text></g></g> <g transform="translate(0,150)"> <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="https://emacsconf.org/2025/talks/sun-open" title="Sunday opening remarks" data-slug="sun-open"> <title> 9:00- 9:10 Sunday opening remarks</title> <rect x="0" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(13,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sun-open</text></g></a> <a href="https://emacsconf.org/2025/talks/modern" title="Some problems of modernizing Emacs" data-slug="modern"> <title> 9:10- 9:30 Some problems of modernizing Emacs</title> <rect x="15" y="15" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(44,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> modern</text></g></a> <a href="https://emacsconf.org/2025/talks/reader" title="An introduction to the Emacs Reader" data-slug="reader"> <title> 9:40-10:15 An introduction to the Emacs Reader</title> <rect x="62" y="15" opacity="0.8" width="54" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(114,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> reader</text></g></a> <a href="https://emacsconf.org/2025/talks/weights" title="Weightlifting tracking with Emacs on Android" data-slug="weights"> <title> 10:35-10:45 Weightlifting tracking with Emacs on Android</title> <rect x="149" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(162,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> weights</text></g></a> <a href="https://emacsconf.org/2025/talks/completion" title="corfu+yasnippet: Easier than I thought" data-slug="completion"> <title> 11:05-11:25 corfu+yasnippet: Easier than I thought</title> <rect x="196" y="15" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(225,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> completion</text></g></a> <a href="https://emacsconf.org/2025/talks/zettelkasten" title="Zettelkasten for regular Emacs hackers" data-slug="zettelkasten"> <title> 1:00- 1:25 Zettelkasten for regular Emacs hackers</title> <rect x="376" y="15" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(413,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> zettelkasten</text></g></a> <a href="https://emacsconf.org/2025/talks/hyperboleqa" title="Questions and answers to help you fly with Hyperbole" data-slug="hyperboleqa"> <title> 1:45- 2:15 Questions and answers to help you fly with Hyperbole</title> <rect x="447" y="15" opacity="0.8" width="47" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(492,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> hyperboleqa</text></g></a> <a href="https://emacsconf.org/2025/talks/gardening" title="Gardening in Emacs: A Windows user's tale of tending, tweaking, and triumph" data-slug="gardening"> <title> 2:15- 2:35 Gardening in Emacs: A Windows user's tale of tending, tweaking, and triumph</title> <rect x="494" y="15" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(523,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> gardening</text></g></a> <a href="https://emacsconf.org/2025/talks/bookclub-tapas" title="Bookclub tapas" data-slug="bookclub-tapas"> <title> 2:45- 3:20 Bookclub tapas</title> <rect x="541" y="15" opacity="0.8" width="54" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(593,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> bookclub-tapas</text></g></a> <a href="https://emacsconf.org/2025/talks/sun-close" title="Sunday closing remarks" data-slug="sun-close"> <title> 3:40- 3:50 Sunday closing remarks</title> <rect x="627" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(640,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sun-close</text></g></a> <g transform="translate(0,3)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="140" font-size="10" text-anchor="left"> 9 AM</text></g> <g transform="translate(94,3)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="140" font-size="10" text-anchor="left"> 10 AM</text></g> <g transform="translate(188,3)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="140" font-size="10" text-anchor="left"> 11 AM</text></g> <g transform="translate(282,3)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="140" font-size="10" text-anchor="left"> 12 PM</text></g> <g transform="translate(376,3)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="140" font-size="10" text-anchor="left"> 1 PM</text></g> <g transform="translate(470,3)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="140" font-size="10" text-anchor="left"> 2 PM</text></g> <g transform="translate(564,3)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="140" font-size="10" text-anchor="left"> 3 PM</text></g> <g transform="translate(658,3)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="140" font-size="10" text-anchor="left"> 4 PM</text></g> <g transform="translate(752,3)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="140" font-size="10" text-anchor="left"> 5 PM</text></g></g></svg> \ No newline at end of file
+<svg width="800" height="300" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><title>Graphical view of the schedule</title><g transform="translate(0,0)"><title>Schedule for Saturday</title><rect width="800" height="150" x="0" y="0" fill="white"></rect><text font-size="10" fill="black" y="12" x="3">Saturday</text><a href="https://emacsconf.org/2025/talks/sat-open" title="Saturday opening remarks" data-slug="sat-open"><title> 9:00- 9:10 Saturday opening remarks</title><rect x="0" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect><g transform="translate(13,73)"><text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)">sat-open</text></g></a><a href="https://emacsconf.org/2025/talks/org-babel" title="Making Org-Babel reactive" data-slug="org-babel"><title> 9:10- 9:20 Making Org-Babel reactive</title><rect x="15" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect><g transform="translate(28,73)"><text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)">org-babel</text></g></a><a href="https://emacsconf.org/2025/talks/reference" title="Emacs as a fully-fledged reference manager" data-slug="reference"><title> 9:30- 9:55 Emacs as a fully-fledged reference manager</title><rect x="47" y="15" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect><g transform="translate(84,73)"><text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)">reference</text></g></a><a href="https://emacsconf.org/2025/talks/gmail" title="org-gmail: A deep integration of Gmail into your Org Mode" data-slug="gmail"><title>10:15-10:40 org-gmail: A deep integration of Gmail into your Org Mode</title><rect x="117" y="15" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect><g transform="translate(154,73)"><text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)">gmail</text></g></a><a href="https://emacsconf.org/2025/talks/gnus" title="Reading and writing emails in GNU Emacs with Gnus" data-slug="gnus"><title>10:50-11:15 Reading and writing emails in GNU Emacs with Gnus</title><rect x="172" y="15" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect><g transform="translate(209,73)"><text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)">gnus</text></g></a><a href="https://emacsconf.org/2025/talks/latex" title="LaTeX export in org-mode: the overhaul" data-slug="latex"><title>11:25-11:45 LaTeX export in org-mode: the overhaul</title><rect x="227" y="15" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect><g transform="translate(256,73)"><text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)">latex</text></g></a><a href="https://emacsconf.org/2025/talks/calc" title="Basic Calc functionality for engineering or electronics" data-slug="calc"><title> 1:00- 1:25 Basic Calc functionality for engineering or electronics</title><rect x="376" y="15" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect><g transform="translate(413,73)"><text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)">calc</text></g></a><a href="https://emacsconf.org/2025/talks/blee-lcnt" title="Blee-LCNT: An Emacs-centered content production and self-publication framework" data-slug="blee-lcnt"><title> 1:35- 2:15 Blee-LCNT: An Emacs-centered content production and self-publication framework</title><rect x="431" y="15" opacity="0.8" width="62" 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)">blee-lcnt</text></g></a><a href="https://emacsconf.org/2025/talks/greader" title="GNU Emacs Greader (Gnamù Reader) mode is the best Emacs mode in existence" data-slug="greader"><title> 2:35- 2:40 GNU Emacs Greader (Gnamù Reader) mode is the best Emacs mode in existence</title><rect x="525" y="15" opacity="0.8" width="7" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect><g transform="translate(530,73)"><text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)">greader</text></g></a><a href="https://emacsconf.org/2025/talks/open-mic" title="Open session" data-slug="open-mic"><title> 2:50- 3:40 Open session</title><rect x="549" y="15" opacity="0.8" width="78" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect><g transform="translate(625,73)"><text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)">open-mic</text></g></a><a href="https://emacsconf.org/2025/talks/sat-close" title="Saturday closing remarks / open session" data-slug="sat-close"><title> 4:00- 4:10 Saturday closing remarks / open session</title><rect x="658" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect><g transform="translate(671,73)"><text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)">sat-close</text></g></a><a href="https://emacsconf.org/2025/talks/schemacs" title="One year progress update Schemacs (formerly Gypsum)" data-slug="schemacs"><title> 9:30- 9:55 One year progress update Schemacs (formerly Gypsum)</title><rect x="47" y="75" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect><g transform="translate(84,133)"><text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)">schemacs</text></g></a><a href="https://emacsconf.org/2025/talks/juicemacs" title="Juicemacs: exploring speculative JIT compilation for ELisp in Java" data-slug="juicemacs"><title>10:15-10:35 Juicemacs: exploring speculative JIT compilation for ELisp in Java</title><rect x="117" y="75" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect><g transform="translate(146,133)"><text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)">juicemacs</text></g></a><a href="https://emacsconf.org/2025/talks/swanky" title="Swanky Python: Interactive development for Python" data-slug="swanky"><title>10:45-11:10 Swanky Python: Interactive development for Python</title><rect x="164" y="75" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect><g transform="translate(201,133)"><text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)">swanky</text></g></a><a href="https://emacsconf.org/2025/talks/python" title="Interactive Python programming in Emacs" data-slug="python"><title>11:20-11:40 Interactive Python programming in Emacs</title><rect x="219" y="75" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect><g transform="translate(248,133)"><text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)">python</text></g></a><a href="https://emacsconf.org/2025/talks/llm" title="Emacs, editors, and LLM driven workflows" data-slug="llm"><title> 1:00- 1:25 Emacs, editors, and LLM driven workflows</title><rect x="376" y="75" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect><g transform="translate(413,133)"><text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)">llm</text></g></a><a href="https://emacsconf.org/2025/talks/private-ai" title="Emacs and private AI: a great match" data-slug="private-ai"><title> 1:45- 2:05 Emacs and private AI: a great match</title><rect x="447" y="75" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect><g transform="translate(476,133)"><text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)">private-ai</text></g></a><a href="https://emacsconf.org/2025/talks/commonlisp" title="Common Lisp images communicating like-a-human through shared Emacs slime and eev" data-slug="commonlisp"><title> 2:25- 2:55 Common Lisp images communicating like-a-human through shared Emacs slime and eev</title><rect x="509" y="75" opacity="0.8" width="47" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect><g transform="translate(554,133)"><text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)">commonlisp</text></g></a><a href="https://emacsconf.org/2025/talks/graphics" title="Modern Emacs/Elisp hardware/software accelerated graphics" data-slug="graphics"><title> 3:05- 3:30 Modern Emacs/Elisp hardware/software accelerated graphics</title><rect x="572" y="75" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect><g transform="translate(609,133)"><text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)">graphics</text></g></a><g transform="translate(0,3)"><line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line><text fill="black" x="0" y="140" font-size="10" text-anchor="left">9 AM</text></g><g transform="translate(94,3)"><line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line><text fill="black" x="0" y="140" font-size="10" text-anchor="left">10 AM</text></g><g transform="translate(188,3)"><line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line><text fill="black" x="0" y="140" font-size="10" text-anchor="left">11 AM</text></g><g transform="translate(282,3)"><line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line><text fill="black" x="0" y="140" font-size="10" text-anchor="left">12 PM</text></g><g transform="translate(376,3)"><line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line><text fill="black" x="0" y="140" font-size="10" text-anchor="left">1 PM</text></g><g transform="translate(470,3)"><line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line><text fill="black" x="0" y="140" font-size="10" text-anchor="left">2 PM</text></g><g transform="translate(564,3)"><line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line><text fill="black" x="0" y="140" font-size="10" text-anchor="left">3 PM</text></g><g transform="translate(658,3)"><line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line><text fill="black" x="0" y="140" font-size="10" text-anchor="left">4 PM</text></g><g transform="translate(752,3)"><line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line><text fill="black" x="0" y="140" font-size="10" text-anchor="left">5 PM</text></g></g><g transform="translate(0,150)"><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="https://emacsconf.org/2025/talks/sun-open" title="Sunday opening remarks" data-slug="sun-open"><title> 9:00- 9:10 Sunday opening remarks</title><rect x="0" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect><g transform="translate(13,73)"><text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)">sun-open</text></g></a><a href="https://emacsconf.org/2025/talks/modern" title="Some problems of modernizing Emacs" data-slug="modern"><title> 9:10- 9:30 Some problems of modernizing Emacs</title><rect x="15" y="15" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect><g transform="translate(44,73)"><text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)">modern</text></g></a><a href="https://emacsconf.org/2025/talks/reader" title="An introduction to the Emacs Reader" data-slug="reader"><title> 9:40-10:15 An introduction to the Emacs Reader</title><rect x="62" y="15" opacity="0.8" width="54" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect><g transform="translate(114,73)"><text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)">reader</text></g></a><a href="https://emacsconf.org/2025/talks/weights" title="Weightlifting tracking with Emacs on Android" data-slug="weights"><title>10:35-10:45 Weightlifting tracking with Emacs on Android</title><rect x="149" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect><g transform="translate(162,73)"><text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)">weights</text></g></a><a href="https://emacsconf.org/2025/talks/completion" title="corfu+yasnippet: Easier than I thought" data-slug="completion"><title>11:05-11:25 corfu+yasnippet: Easier than I thought</title><rect x="196" y="15" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect><g transform="translate(225,73)"><text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)">completion</text></g></a><a href="https://emacsconf.org/2025/talks/zettelkasten" title="Zettelkasten for regular Emacs hackers" data-slug="zettelkasten"><title> 1:00- 1:25 Zettelkasten for regular Emacs hackers</title><rect x="376" y="15" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect><g transform="translate(413,73)"><text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)">zettelkasten</text></g></a><a href="https://emacsconf.org/2025/talks/hyperboleqa" title="Questions and answers to help you fly with Hyperbole" data-slug="hyperboleqa"><title> 1:45- 2:15 Questions and answers to help you fly with Hyperbole</title><rect x="447" y="15" opacity="0.8" width="47" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect><g transform="translate(492,73)"><text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)">hyperboleqa</text></g></a><a href="https://emacsconf.org/2025/talks/gardening" title="Gardening in Emacs: A Windows user's tale of tending, tweaking, and triumph" data-slug="gardening"><title> 2:15- 2:35 Gardening in Emacs: A Windows user's tale of tending, tweaking, and triumph</title><rect x="494" y="15" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect><g transform="translate(523,73)"><text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)">gardening</text></g></a><a href="https://emacsconf.org/2025/talks/bookclub-tapas" title="Bookclub tapas" data-slug="bookclub-tapas"><title> 2:45- 3:20 Bookclub tapas</title><rect x="541" y="15" opacity="0.8" width="54" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect><g transform="translate(593,73)"><text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)">bookclub-tapas</text></g></a><a href="https://emacsconf.org/2025/talks/sun-close" title="Sunday closing remarks" data-slug="sun-close"><title> 3:40- 3:50 Sunday closing remarks</title><rect x="627" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect><g transform="translate(640,73)"><text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)">sun-close</text></g></a><g transform="translate(0,3)"><line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line><text fill="black" x="0" y="140" font-size="10" text-anchor="left">9 AM</text></g><g transform="translate(94,3)"><line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line><text fill="black" x="0" y="140" font-size="10" text-anchor="left">10 AM</text></g><g transform="translate(188,3)"><line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line><text fill="black" x="0" y="140" font-size="10" text-anchor="left">11 AM</text></g><g transform="translate(282,3)"><line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line><text fill="black" x="0" y="140" font-size="10" text-anchor="left">12 PM</text></g><g transform="translate(376,3)"><line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line><text fill="black" x="0" y="140" font-size="10" text-anchor="left">1 PM</text></g><g transform="translate(470,3)"><line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line><text fill="black" x="0" y="140" font-size="10" text-anchor="left">2 PM</text></g><g transform="translate(564,3)"><line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line><text fill="black" x="0" y="140" font-size="10" text-anchor="left">3 PM</text></g><g transform="translate(658,3)"><line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line><text fill="black" x="0" y="140" font-size="10" text-anchor="left">4 PM</text></g><g transform="translate(752,3)"><line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line><text fill="black" x="0" y="140" font-size="10" text-anchor="left">5 PM</text></g></g></svg> \ No newline at end of file
diff --git a/organizers-notebook/index.org b/organizers-notebook/index.org
index 0488a9b3..f6297e3e 100644
--- a/organizers-notebook/index.org
+++ b/organizers-notebook/index.org
@@ -1167,6 +1167,8 @@ On front:
- To start: sudo systemctl start thelounge
- To stop: sudo systemctl stop thelounge
+backup:
+sudo -u thelounge /usr/bin/thelounge start
*** DONE Ask libera.chat to increase IRC limits
CLOSED: [2025-11-12 Wed 13:50]
@@ -1649,7 +1651,7 @@ Manual steps:
- ~mpv --profile=full https://live0.emacsconf.org/gen.webm~
- Change the channel topic to note that discussion can be in the other channel
-** When a system is down
+** When a system is down - status page
:PROPERTIES:
:CUSTOM_ID: other-process-notes-when-a-system-is-down
:END: