summaryrefslogtreecommitdiffstats
path: root/organizers-notebook.md
diff options
context:
space:
mode:
Diffstat (limited to 'organizers-notebook.md')
-rw-r--r--organizers-notebook.md1025
1 files changed, 1021 insertions, 4 deletions
diff --git a/organizers-notebook.md b/organizers-notebook.md
index f5d6206b..5041f2e0 100644
--- a/organizers-notebook.md
+++ b/organizers-notebook.md
@@ -20,11 +20,48 @@ This document is the general organizers' notebook that can be used as a starting
- [Create the public organizers’ notebook in the wiki](#starting-up-the-conference-planning-process-create-the-public-organizers-notebook-in-the-wiki)
- [Phases and lessons learned](#phases-and-lessons-learned)
- [Draft CFP](#phases-and-lessons-learned-draft-cfp)
- - [Process proposals](#orge2fe34a)
- - [Accept proposals](#orgac059dd)
+ - [Announce](#phases-and-lessons-learned-announce)
+ - [Process proposals](#phases-and-lessons-learned-process-proposals)
+ - [Accept proposals](#phases-and-lessons-learned-accept-proposals)
- [Draft schedule](#draft-schedule)
+ - [Set up backstage and upload](#phases-and-lessons-learned-set-up-backstage-and-upload)
+ - [Post the schedule](#phases-and-lessons-learned-post-the-schedule)
+ - [Process uploaded files](#phases-and-lessons-learned-process-uploaded-files)
+ - [Generate assets](#phases-and-lessons-learned-generate-assets)
+ - [Prepare the infrastructure](#phases-and-lessons-learned-prepare-the-infrastructure)
+ - [Getting ready for captions](#phases-and-lessons-learned-getting-ready-for-captions)
+ - [Getting ready for the conference](#pre-conf)
+ - [During the conference](#conf)
+ - [After the conference](#phases-and-lessons-learned-after-the-conference)
+- [General infrastructure](#general-infrastructure)
+ - [Linode instance sizes](#general-infrastructure-linode-instance-sizes)
+ - [File uploads](#upload)
+ - [Icecast](#icecast)
+ - [Watching pages](#watch)
+ - [VNC](#vnc)
+ - [Streaming with OBS](#obs)
+ - [Shell scripts](#general-infrastructure-shell-scripts)
+ - [Backstage](#backstage)
+ - [IRC web client](#general-infrastructure-irc-web-client)
+ - [Etherpad](#general-infrastructure-etherpad)
+ - [Publishing media to the server and to the wiki](#media)
+ - [Automated IRC announcements](#general-infrastructure-automated-irc-announcements)
+ - [BigBlueButton](#bbb)
+ - [Manual IRC announcements](#general-infrastructure-manual-irc-announcements)
+ - [Low-res stream](#general-infrastructure-low-res-stream)
+ - [Upload talks to YouTube](#general-infrastructure-upload-talks-to-youtube)
+ - [Restream to YouTube](#general-infrastructure-restream-to-youtube)
- [Other process notes](#other)
- [Adding another user to BBB](#bbb-user)
+ - [When a talk is added after the schedule has already been drafted](#other-process-notes-when-a-talk-is-added-after-the-schedule-has-already-been-drafted)
+ - [When a talk is cancelled](#cancel-talk)
+ - [When a talk changes title](#other-process-notes-when-a-talk-changes-title)
+ - [When a talk Q&A changes method](#change-talk-qa)
+ - [To play the other stream](#other-process-notes-to-play-the-other-stream)
+ - [When a system is down](#other-process-notes-when-a-system-is-down)
+ - [When we need to bring on a last-minute volunteer](#other-process-notes-when-we-need-to-bring-on-a-last-minute-volunteer)
+ - [Checking people in](#other-process-notes-checking-people-in)
+ - [Ansible](#other-process-notes-ansible)
<a id="starting-up-the-conference-planning-process"></a>
@@ -125,7 +162,33 @@ Put inside double square brackets: `!template id=pagedraft`
- Put the speaker introduction right after the talk description for easier web page copying.
-<a id="orge2fe34a"></a>
+<a id="phases-and-lessons-learned-announce"></a>
+
+## Announce
+
+- Post CFP to emacsconf-discuss, reddit.com/r/emacs, and in Emacs News
+- Submit to <https://foss.events/>
+
+
+### Promote the conference
+
+Submit to <https://foss.events/>
+
+Maybe it would be good to get in touch with podcasts like
+
+- [System Crafters](https://systemcrafters.net/)
+- [This Week in Linux](https://www.youtube.com/playlist?list=PLbFVcOQ-YH_LRP687N0YeN78YZmBp5wqF)
+- [Linux Unplugged](https://linuxunplugged.com/)
+- [Ask Noah](http://asknoahshow.com/)
+- [Linux After Dark](https://linuxafterdark.net/)
+- [Lispy Gopher Show](https://anonradio.net/)
+
+etc to give a heads up on EmacsConf before it
+happens and also mention to them when videos are
+available to spark more interest.
+
+
+<a id="phases-and-lessons-learned-process-proposals"></a>
## Process proposals
@@ -154,7 +217,7 @@ When proposals come in:
PUBLIC\_EMAIL
-<a id="orgac059dd"></a>
+<a id="phases-and-lessons-learned-accept-proposals"></a>
## Accept proposals
@@ -187,6 +250,855 @@ For each talk:
- Add missing items to plan
+<a id="phases-and-lessons-learned-set-up-backstage-and-upload"></a>
+
+## Set up backstage and upload
+
+See <a href="https://git.emacsconf.org/emacsconf-ansible/tree/README.org">README.org</a>.
+
+Lessons learned:
+
+- Next year, let&rsquo;s get upload.emacsconf.org in place as the domain name so that people don&rsquo;t try to FTP files to it.
+
+
+<a id="phases-and-lessons-learned-post-the-schedule"></a>
+
+## Post the schedule
+
+- <elisp:(setq emacsconf-publishing-phase 'schedule)>
+- <elisp:emacsconf-publish-info-pages>
+- <elisp:emacsconf-publish-schedule-org-files>
+- <elisp:emacsconf-ical-generate-all>
+- Update talks.md to refer to watch.md as well
+
+
+<a id="phases-and-lessons-learned-process-uploaded-files"></a>
+
+## Process uploaded files
+
+Basic setup:
+
+1. Set up the media server and symlinks: <a href="https://git.emacsconf.org/emacsconf-ansible/tree/README.org">README.org</a> (Media).
+2. Set up the prerec processing areas on res: <a href="https://git.emacsconf.org/emacsconf-ansible/tree/README.org">README.org</a> (Processing prerecs).
+3. Set up the caption processor on res: <a href="https://git.emacsconf.org/emacsconf-ansible/tree/README.org">README.org</a> (Captioning).
+
+Process:
+
+1. Review uploaded files with <elisp:emacsconf-upload-dired>
+2. Open the JSON for the file you want to process and use <elisp:emacsconf-upload-copy-from-json> .
+ If more than one file uses the same extension, provide a suffix to disambiguate them.
+3. On res:
+ 1. Create a directory ~/current/files/$slug.
+ 2. Copy the uploaded file from ~/cache as `$video_slug--original.$extension`, or use `rename-original.sh $slug $file`.
+ 3. Call `process-prerec.sh $file`.
+4. When the screens are finished, do locally:
+ 1. update-cache on my computer.
+ 2. <elisp:emacsconf-publish-cache-video-data> or <elisp:emacsconf-cache-all-video-data>
+ 3. <elisp:emacsconf-publish-backstage-index>
+
+
+<a id="phases-and-lessons-learned-generate-assets"></a>
+
+## Generate assets
+
+
+### In-between pages
+
+- Make the $year/assets/in-between directory and copy the template.svg from the previous year.
+- <elisp:emacsconf-stream-generate-in-between-pages>
+
+
+### Intros
+
+- In an empty VTT file, <elisp:emacsconf-subed-intro-subtitles>
+- Record the audio and get captions
+- Splice together into a file that will be processed with subed-record-compile-video.
+
+
+<a id="phases-and-lessons-learned-prepare-the-infrastructure"></a>
+
+## Prepare the infrastructure
+
+Checklist:
+
+- [ ] IRC
+ - [ ] Manual announcements
+ - [ ] Automated announcements
+- [ ] Web conference
+- [ ] Streaming assets
+ - [ ] Overlays
+ - [ ] Intros
+- [ ] OBS
+- [ ] VNC
+- [ ] Publishing to the wiki
+- [ ] Publishing to the media server
+- [ ] Etherpad
+- [ ] Mumble
+- [ ] Icecast
+
+
+<a id="phases-and-lessons-learned-getting-ready-for-captions"></a>
+
+## Getting ready for captions
+
+Onboarding:
+
+- Add captioner to conf.org with the `:caption:` tag, under a Volunteers heading with the `volunteer` tag. Make sure the `EMAIL` property is set.
+- Add captioner to emacsconf-org mailing list.
+- Send backstage information <elisp:emacsconf-mail-backstage-info-to-volunteer> . (Can be sent to all captioning volunteers with <elisp:emacsconf-mail-backstage-info-to-captioning-volunteers>)
+
+
+<a id="pre-conf"></a>
+
+## Getting ready for the conference
+
+<elisp:emacsconf-pad-prepopulate-shift-hyperlists>
+
+
+### TODO Send check-in details, schedule update, etc.
+
+
+### Two days before the conference
+
+Go through the :tminustwo: tags.
+
+
+### One day before the conference
+
+Go through the :tminusone: tags.
+
+- Set `emacsconf-publishing-phase` to `conference`.
+- Set emacsconf-publish-include-pads to t and republish the info pages.
+
+
+<a id="conf"></a>
+
+## During the conference
+
+<elisp:emacsconf-pad-open-shift-hyperlist>
+
+
+<a id="phases-and-lessons-learned-after-the-conference"></a>
+
+## After the conference
+
+
+### Capture stats
+
+2024 stats
+
+Saturday:
+gen: 177 peak + 14 peak lowres
+dev: 226 peak + 79 peak lowres
+
+Sunday:
+gen: 89 peak + 10 peak lowres
+
+meet peak 409% CPU (100% is 1 CPU), average 69.4%
+front peak 70.66% CPU (100% is 1 CPU)
+live peak 552% CPU (100% is 1 CPU) average 144%
+res peak 81.54% total CPU (each OBS ~250%), mem 7GB used
+
+so far we have used 1.2TB of transfer this month
+
+
+### Back up the data
+
+
+#### Icecast
+
+rsync -avze ssh live:&rsquo;/data/emacsconf-2024-\*&rsquo; media:~/2024
+
+rsync -avze ssh live:&rsquo;/data/emacsconf-2024-\*&rsquo; .
+
+
+#### BigBlueButton
+
+rsync -avze ssh root@bbb:/var/bigbluebutton/ bigbluebutton/
+
+ssh root@66.175.208.243 &rsquo;dd if=/dev/sda bs=5M &rsquo; | dd of=bbb-img-2024-12-08.img status=progress
+
+The img can be loaded with
+sudo losetup &#x2013;find &#x2013;show bbb-img-2024-12-08.img
+sudo mount /dev/loop10 test
+cd test
+
+
+##### Reviewing all the Q&A durations and chat messages
+
+ (let ((default-directory "/home/sacha/proj/emacsconf/2024/backups/bigbluebutton/published/video"))
+ (mapconcat
+ (lambda (dir)
+ (let ((chat (xml-parse-file
+ (expand-file-name "video.xml" dir)))
+ (metadata (xml-parse-file
+ (expand-file-name "metadata.xml" dir))))
+ (concat
+ "- "
+ (dom-text (car (dom-by-tag metadata 'meetingName))) " ("
+ (format-seconds "%.2h:%z%.2m:%.2s"
+ (/ (string-to-number (dom-text (dom-by-tag metadata 'duration)))
+ 1000))
+ ")"
+ "\n"
+ (if (dom-by-tag chat 'chattimeline)
+ (mapconcat (lambda (node)
+ (concat " - " (dom-attr node 'name) ": "
+ (dom-attr node 'message) "\n"))
+ (dom-by-tag chat 'chattimeline)
+ "")
+ "")
+ "")
+ )
+ )
+ (directory-files "." nil "-"))
+ )
+
+- Copy IRC logs to cache and therefore to backstage: (ex: 2024-12-07-emacsconf-gen.txt)
+
+
+### Combine the IRC logs and the pads, and add them to the wiki
+
+(did we e-mail the speakers before or after?)
+
+
+### Process the Q&A recordings and live presentations
+
+- Save answers videos as &#x2013;answers.webm.
+- From the pad file: emacsconf-extract-copy-pad-to-wiki
+- update cache
+- Set `QA_PUBLIC` property to t as each Q&A gets processed.
+- change status to `TO_INDEX_QA`
+- emacsconf-publish-media-files-on-change
+- emacsconf-publish-info-pages-for-talk
+
+Indexing
+
+- emacsconf-extract-insert-note-with-question-heading
+- emacsconf-subed-make-chapter-file-based-on-comments
+- change status to `TO_CAPTION_QA`
+
+Also copy the YouTube comments and IRC comments
+emacsconf-extract-irc-anonymize-log
+
+
+### Send thank-you emails to the speakers
+
+
+### Notify emacs-discuss that the Q&A is up
+
+<https://lists.gnu.org/archive/html/emacsconf-discuss/2024-12/msg00000.html>
+
+ Hello, everyone!
+
+ https://emacsconf.org/2024/talks and https://media.emacsconf.org/2024
+ should have the talks and Q&A sessions now, hooray, including chapter
+ indices for the Q&A. I've also copied over notes from Etherpad and IRC
+ on the talk pages, and I've e-mailed them to the speakers so they can
+ update the wiki directly or send in additional answers.
+
+ BigBlueButton audio mixing is kinda iffy, so I'm holding off on
+ uploading the Q&A videos (and the live talk for secrets) to
+ YouTube/Toobnix until Leo and other volunteers have a listen to see
+ whether the audio needs to be tweaked, and maybe even to do some kind of
+ normalization. Unfortunately, recordings with separate audio tracks per
+ participant aren't available--it would be cool to figure that out next
+ year--so some talks might need some manual processing. (Please feel free
+ to volunteer if that's up your alley!) In the meantime, you can check
+ out the Q&A videos from the talk pages on the wiki. Please let us know
+ if there's anything that needs tweaking.
+
+ Enjoy!
+
+ Sacha
+
+
+### Write a report
+
+Sample: <https://emacsconf.org/2023/report/>
+
+
+### Send thank-you emails to the volunteers
+
+emacsconf-mail-template-ask-volunteer-for-mailing-address
+
+
+### Process the lessons learned
+
+
+<a id="general-infrastructure"></a>
+
+# General infrastructure
+
+
+<a id="general-infrastructure-linode-instance-sizes"></a>
+
+## Linode instance sizes
+
+
+### Production
+
+- front0 shared Linode 32GB
+- live0 shared Linode 64GB
+- meet Dedicated CPU 16GB
+
+
+### Dormant
+
+Resize disk to 25GB, copying large files to media if needed
+
+- nanode front0
+- nanode live0
+- delete meet after downloading all the recordings, or resize down to nanode
+
+
+<a id="upload"></a>
+
+## File uploads
+
+[psi-4ward/psitransfer: Simple open source self-hosted file sharing solution](https://github.com/psi-4ward/psitransfer)
+
+Before the conference:
+
+1. Set `upload_enabled` to `true` in `prod-vars.yml` and run `ansible-playbook -i inventory.yml prod-playbook.yml --tags upload`.
+2. Confirm that <https://upload.emacsconf.org> has the upload interface and works with the password.
+3. Use `emacsconf-mail-template-to-all-groups` and `emacsconf-mail-upload-and-backstage-info` to e-mail the upload information to all speakers.
+
+After the conference:
+
+1. Set `upload_enabled` to `false` in `prod-vars.yml` and run `ansible-playbook -i inventory.yml prod-playbook.yml --tags upload`.
+2. Confirm that <https://upload.emacsconf.org> shows the in-between page.
+
+
+<a id="icecast"></a>
+
+## Icecast
+
+Success: You can use [OBS+VNC to record](#obs-instructions), and the results can be viewed by mpv.
+
+- [X] Gen
+- [X] Dev
+
+Also, recordings are available in /data.
+
+New year:
+
+1. Reprovision with
+
+ ansible-playbook -i inventory.yml prod-playbook.yml --tags stream
+
+ so that the year is updated in the configuration.
+2. SSH to live0.emacsconf.org and run `/etc/init.d/emacsconf stop`. Confirm that icecast has stopped with `ps | grep emacsconf`; if not, kill the process.
+ Start it again with `/etc/init.d/emacsconf start`
+3. To test, you can use FFmpeg like this for the gen stream:
+
+ ffmpeg -y -f lavfi -i testsrc=size=1280x720:rate=10 -i background-music.opus \
+ -c:v libvpx -b:v 500K -crf 25 -b:a 128k \
+ -content_type video/webm "icecast://emacsconf:$EMACSCONF_ICECAST_SOURCE_PASSWORD@live0.emacsconf.org:8001/gen.webm"
+
+ For dev:
+
+ ffmpeg -y -f lavfi -i testsrc=size=1280x720:rate=10 -i background-music.opus \
+ -c:v libvpx -b:v 500K -crf 25 -b:a 128k \
+ -content_type video/webm "icecast://emacsconf:$EMACSCONF_ICECAST_SOURCE_PASSWORD@live0.emacsconf.org:8001/dev.webm"
+
+ and then view it with
+
+ mpv https://live0.emacsconf.org/gen.webm
+
+
+<a id="watch"></a>
+
+## Watching pages
+
+Success: You can watch at <https://live.emacsconf.org>.
+
+- [X] <https://live.emacsconf.org> goes to the current year&rsquo;s page.
+- [X] gen stream works in the browser
+- [X] dev stream works in the browser
+- [X] Schedule is correct
+
+New year:
+
+1. ansible-playbook -i inventory.yml prod-playbook.yml &#x2013;tags live
+2. Republish with <elisp:emacsconf-publish-watch-pages>.
+3. Update front:/var/www/live.emacsconf.org.
+
+Set up test streams (see ffmpeg instructions from [Icecast](#icecast)) and then:
+
+
+<a id="vnc"></a>
+
+## VNC
+
+We use VNC to connect to the X servers on res.emacsconf.org so that we can stream from it.
+
+Success:
+
+- [X] Confirm that you can connect to emacsconf-gen via VNC
+- [X] Confirm that you can connect to emacsconf-dev via VNC
+
+Setting up
+
+- <elisp:emacsconf-publish-res-index>
+
+
+<a id="vnc-instructions"></a>
+
+### Instructions
+
+NOTE: VNC+OBS doesn&rsquo;t work well if you have a window manager that
+automatically resizes windows, like i3. Please configure your window
+manager so that the VNC window is not resized.
+
+1. Install a VNC viewer on your system (ex: tigervnc-viewer).
+
+2. Set up your local environment:
+ - gen: `export TRACK=gen; export TRACK_PORT=5905; export SSH_PORT=46668`
+ - dev: `export TRACK=dev; export TRACK_PORT=5906; export SSH_PORT=46668`
+
+3. Copy the password:
+
+ scp emacsconf-$TRACK@res.emacsconf.org:~/.vnc/passwd vnc-passwd-$TRACK -p $SSH\_PORT
+
+4. Forward your local ports and connect via VNC viewer to the
+ appropriate forwarded port from your laptop:
+
+ ssh emacsconf-$TRACK@res.emacsconf.org -N -L $TRACK_PORT:127.0.0.1:$TRACK_PORT -p $SSH_PORT &
+ sleep 5 # Give it time to establish the tunnels
+ xvncviewer 127.0.0.1:$TRACK_PORT -shared -geometry 1280x720 -passwd vnc-passwd-$TRACK &
+
+If you get the following error:
+
+ channel 2: open failed: connect failed: Connection refused
+ CConn: End of stream
+ CConn: The connection was dropped by the server before the session could
+ be established.
+
+then the VNC server hasn&rsquo;t started yet. You can start it with
+
+ ssh emacsconf-$TRACK@res.emacsconf.org -p $SSH_PORT /home/emacsconf-$TRACK/bin/track-vnc
+
+and then connect with:
+
+ xvncviewer 127.0.0.1:$TRACK_PORT -shared -geometry 1280x720 -passwd vnc-passwd-$TRACK &
+
+
+<a id="obs"></a>
+
+## Streaming with OBS
+
+Success: Confirm that you can stream
+
+- [X] gen
+- [X] dev
+
+New year: reprovision with
+
+ ansible-playbook -i inventory.yml prod-playbook.yml --tags obs
+
+so that the year is updated in the shell scripts.
+
+
+<a id="obs-instructions"></a>
+
+### Instructions
+
+1. [Connect to the VNC session for the track.](#vnc-instructions)
+
+2. Start **recording** (not streaming). If you don&rsquo;t see OBS when you connect, it&rsquo;s probably on workspace 2, so you can switch with Alt-2. If you still don&rsquo;t see it there, you can open a terminal with Alt-Enter and then run `track-obs`. After you start recording, confirm that it is now broadcasting to the stream.
+
+3. Verify with MPV on your local system:
+
+ mpv https://live0.emacsconf.org/$TRACK.webm &
+
+
+### Icecast
+
+Success: You can use [OBS+VNC to record](#obs-instructions), and the results can be viewed by mpv.
+
+- [ ] gen
+- [ ] dev
+
+New year: reprovision with
+
+ ansible-playbook -i inventory.yml prod-playbook.yml --tags stream
+
+so that the year is updated in the configuration.
+
+This is on live.emacsconf.org and can be restarted with `/etc/init.d/emacsconf restart`.
+
+
+<a id="general-infrastructure-shell-scripts"></a>
+
+## Shell scripts
+
+Success: From the commandline, hosts can:
+
+- [X] play just the intro: intro $SLUG
+- [X] play a file without an intro: play $SLUG
+- [X] play a file with an intro: play-with-intro $SLUG (hmm, this didn&rsquo;t show the subtitles)
+ ah, it&rsquo;s because the intros need to be in the cache dir?
+- [X] open the Q&A for a talk: handle-qa $SLUG
+ - [X] open the pad: pad $SLUG
+ - [X] open BBB: bbb $SLUG
+- [ ] do the whole thing: handle-session $SLUG
+- [ ] rebroadcast the other stream:
+ - rebroadcast gen
+ - rebroadcast dev
+- [ ] control background music: music, stop-music
+
+Setup:
+
+- OBS must be streaming from the stream you&rsquo;re testing. [Streaming with OBS](#obs)
+- You may want to generate test assets and copy them over to the assets/stream directory.
+- Generate all the overlays and copy them to assets/overlays
+- Set up the assets/music directory
+
+
+<a id="backstage"></a>
+
+## Backstage
+
+Update this with <elisp:emacsconf-publish-backstage-index>
+
+Explanation of files:
+
+<table>
+
+
+<colgroup>
+<col class="org-left">
+
+<col class="org-left">
+</colgroup>
+<tbody>
+<tr>
+<td class="org-left">&#x2013;original.mp4/mov/webm</td>
+<td class="org-left">original file as uploaded by the speaker</td>
+</tr>
+
+<tr>
+<td class="org-left">&#x2013;silence.mp4/mov/webm</td>
+<td class="org-left">silence sample if uploaded by speaker</td>
+</tr>
+
+<tr>
+<td class="org-left">&#x2013;reencoded.webm</td>
+<td class="org-left">converted to .webm format and compressed</td>
+</tr>
+
+<tr>
+<td class="org-left">&#x2013;reencoded.opus</td>
+<td class="org-left">audio only</td>
+</tr>
+
+<tr>
+<td class="org-left">&#x2013;normalized.opus</td>
+<td class="org-left">normalized audio</td>
+</tr>
+
+<tr>
+<td class="org-left">&#x2013;reencoded.vtt</td>
+<td class="org-left">WhisperX captions, WebVTT format</td>
+</tr>
+
+<tr>
+<td class="org-left">&#x2013;reencoded.json</td>
+<td class="org-left">WhisperX word data</td>
+</tr>
+
+<tr>
+<td class="org-left">&#x2013;reencoded.srt</td>
+<td class="org-left">WhisperX captions, SRT format</td>
+</tr>
+
+<tr>
+<td class="org-left">&#x2013;reencoded.txt</td>
+<td class="org-left">WhisperX captions, plain text</td>
+</tr>
+
+<tr>
+<td class="org-left">&#x2013;main.vtt</td>
+<td class="org-left">edited captions</td>
+</tr>
+
+<tr>
+<td class="org-left">&#x2013;main&#x2013;chapters.vtt</td>
+<td class="org-left">chapter markers</td>
+</tr>
+
+<tr>
+<td class="org-left">&#x2013;main.txt</td>
+<td class="org-left">captions as text (optional)</td>
+</tr>
+
+<tr>
+<td class="org-left">&#x2013;main.webm</td>
+<td class="org-left">version for streaming based on the most recent resources</td>
+</tr>
+</tbody>
+</table>
+
+Other files might also have been uploaded by the speaker, such as slides or notes.
+
+
+<a id="general-infrastructure-irc-web-client"></a>
+
+## IRC web client
+
+Success:
+
+- [X] You can join from <https://chat.emacsconf.org>
+- [X] You can join from <https://live.emacsconf.org> and the channels end up as the latest ones
+
+Remember to schedule a task to ask libera.chat to increase the number of users it will accept from chat.emacsconf.org to avoid connection exhaustion errors.
+
+Message I&rsquo;ve posted to support@libera.chat:
+
+Thank you for running libera.chat. We&rsquo;re looking forward to using IRC
+(#emacsconf-gen, #emacsconf-dev) for the discussions for the upcoming
+EmacsConf (Dec 7-8, <https://emacsconf.org>). In the past, we&rsquo;ve needed to
+coordinate with Libera staff to increase the number of connections
+allowed from chat.emacsconf.org during conference days in order to avoid
+connection exhaustion errors. Is that something we can plan now or would
+you like me to bring it up a few days before the conference?
+
+
+<a id="general-infrastructure-etherpad"></a>
+
+## Etherpad
+
+Success:
+
+- [X] pad.emacsconf.org redirects to this year&rsquo;s entry
+- [X] Each talk has its own Etherpad
+
+Lessons learned:
+
+- After 2024: Added pronouns and pronunciation to the pad template since that&rsquo;s what the hosts will be looking at
+
+
+<a id="media"></a>
+
+## Publishing media to the server and to the wiki
+
+Start of year:
+
+1. Set `media_protect_root` to true in Ansible `group_vars/all.yml`.
+2. `ansible-playbook -i inventory.yml prod-playbook.yml --tags media`
+3. Generate the index with `emacsconf-publish-update-media`
+
+Confirm by setting a submitted talk to `PLAYING` and testing with
+<elisp:emacsconf-publish-media-files-on-change> . The public media
+directory should have the files and the entry should be in the index.
+Switching it back to `TO_STREAM` and calling
+<elisp:emacsconf-publish-media-files-on-change> should remove it.
+
+
+### TODO Switch public media to unprotected root before the conference :tminustwo:
+
+1. Clear public media directory.
+2. Set `media_protect_root` to false in Ansible `group_vars/all.yml`.
+3. `ansible-playbook -i inventory.yml prod-playbook.yml --tags media`
+
+You can generate the index with `emacsconf-publish-update-media`.
+
+
+<a id="general-infrastructure-automated-irc-announcements"></a>
+
+## Automated IRC announcements
+
+Success:
+
+- [ ] When a talk starts playing, it is announced in the relevant channel
+
+
+<a id="bbb"></a>
+
+## BigBlueButton
+
+ssh orga@media.emacsconf.org &ldquo;~/bin/bbb-before sat-open&rdquo;
+<https://media.emacsconf.org/2024/current/bbb-sat-open.html>
+
+ssh orga@media.emacsconf.org &ldquo;~/bin/bbb-open sat-open&rdquo;
+
+After restarting, and in case of &ldquo;Firefox can’t establish a connection to the server at wss://bbb.emacsverse.org/graphql.&rdquo;
+
+ssh root@bbb
+cd greenlight-v3
+docker compose restart
+
+Sizes:
+
+- dormant: 1 GB nanode
+- testing: 4 core 8 GB shared CPU
+- production: 8 core 16 GB dedicated CPU (roughly half CPU load for 107 simultaneous users, 2024)
+
+
+### Installing BigBlueButton
+
+1. Create the instance.
+ - Linode 4core 8GB shared CPU
+ - Image: Ubuntu 22.04
+2. Update the DNS for bbb.emacsverse.org with its IP address.
+3. Download the BBB installer and make it executable.
+4. ufw allow 16384:32768/udp
+5. Run the BBB installer: `./bbb-install.sh -v jammy-300 -s bbb.emacsverse.org -e emacsconf@sachachua.com -g`
+6. `sudo apt install bbb-playback-video` and then follow the instructions at [Server Customization | BigBlueButton](https://docs.bigbluebutton.org/3.0/administration/customize/#install-additional-recording-processing-formats) .
+ - /usr/local/bigbluebutton/core/scripts/bigbluebutton.yml:
+
+ steps:
+ archive: 'sanity'
+ sanity: 'captions'
+ captions:
+ - 'process:presentation'
+ - 'process:video'
+ 'process:presentation': 'publish:presentation'
+ 'process:video': 'publish:video'
+ - systemctl restart bbb-rap-resque-worker.service
+7. docker exec -it greenlight-v3 bundle exec rake admin:create[&rsquo;name&rsquo;,&rsquo;email&rsquo;,&rsquo;password&rsquo;]
+
+
+### System audio limitations
+
+Sharing system audio by changing the audio device to &ldquo;Built-in Audio Analog Stereo&rdquo; is very choppy, only gets captured in the recording if I&rsquo;m using Firefox (not Chrome) AND there&rsquo;s at least one listener, and doesn&rsquo;t allow simultaneous narration from the speaker.
+
+Using pulseaudio to change the app&rsquo;s recording device to the audio monitor results in smoother audio (because it&rsquo;s pretending to be the microphone), but still doesn&rsquo;t allow simultaneous narration from the speaker.
+
+Combining microphone + system audio into a new virtual microphone source is probably more complicated than we want to walk speakers through.
+
+BBB says sharing system audio works only if you use Chrome on Mac OS X or Microsoft Windows (<https://support.bigbluebutton.org/hc/en-us/articles/1500005315642-Can-I-play-a-video-using-screen-sharing>). I tested it on Linux and sharing system audio is not an option. If you happen to know of any more elegant way to do this, I&rsquo;d love to hear it.
+
+Related: <https://github.com/bigbluebutton/bigbluebutton/issues/8632>
+
+
+### Creating talk BBB rooms
+
+- `docker exec -it greenlight-v3 /bin/bash`
+- `bundle exec rails console`
+- `user_id = User.find_by_email("sacha@sachachua.com").id`
+
+ (mapconcat (lambda (group)
+ (format
+ "Room.create(user_id: user_id, name: \"%s - %s\")\n"
+ (plist-get (cadr group) :speakers)
+ (string-join (mapcar (lambda (talk) (plist-get talk :slug))
+ (cdr group)))))
+ (emacsconf-mail-groups (emacsconf-active-talks (emacsconf-get-talk-info)))
+ "")
+
+- <elisp:emacsconf-publish-bbb-static-redirects>
+
+Print out the room IDs with
+
+ Room.all.each { |x| puts x.friendly_id + " " + x.name }; nil
+
+It&rsquo;s possible to change the friendly\_id and then use `x.save!`.
+
+
+### Setting up moderator access codes
+
+
+### Backing up BBB :backup:
+
+rsync -avze ssh root@bbb:/var/bigbluebutton/ bigbluebutton/
+
+ssh root@bbb &rsquo;tar zcvf - /var/bigbluebutton /etc/bigbluebutton /root/greenlight-v3 /usr/local/bigbluebutton /usr/share/bbb-web&rsquo; > bbb-backup-$(date &ldquo;+%Y-%m-%d&rdquo;).tar.gz
+
+ssh root@bbb &rsquo;dd if=/dev/sda bs=5M &rsquo; | dd of=bbb-img-$(date &ldquo;+%Y-%m-%d&rdquo;).img status=progress
+
+
+### Spinning BBB up again
+
+<span class="timestamp-wrapper"><span class="timestamp">[2025-01-22 Wed] </span></span> &#x2026; actually, this ran into some issues with the certificate, so I&rsquo;m just going to do a reinstall.
+
+Previous notes
+
+1. Create a Nanode.
+2. Update the DNS for bbb.emacsverse.org with its IP address. (dns.he.net)
+3. Reboot into Rescue mode. In Lish:
+
+ passwd # set interactively
+ sed -i -e 's/#PasswordAuthentication yes/PasswordAuthentication yes/g' /etc/ssh/sshd_config
+ echo 'PermitRootLogin yes' >> /etc/ssh/sshd_config
+ service ssh start
+4. From the backup directory:
+ gunzip -c bbb-img-2024-12-08.img.gz | ssh root@bbb.emacsconf.org &ldquo;dd of=/dev/sda bs=4M status=progress oflag=direct iflag=fullblock&rdquo;
+5. After I resized to 4core 8GB RAM, I couldn&rsquo;t log in with SSH, so I used the Linode shell. `sshd -t` said no host keys available. Fix:
+
+ ssh-keygen -A
+ service ssh --full-restart
+6. ./bbb-install.sh -v jammy-300 -s bbb.emacsverse.org -e emacsconf@sachachua.com
+
+Resources:
+
+- <https://overto.eu/posts/gunzip-into-dd/>
+- <https://www.linode.com/community/questions/20386/how-do-i-ssh-to-linode-from-the-finnix-boot-in-order-to-copy-my-local-vm-over-to>
+- <https://github.com/bigbluebutton/bigbluebutton/issues/9485>
+
+
+<a id="general-infrastructure-manual-irc-announcements"></a>
+
+## Manual IRC announcements
+
+Success:
+
+- [X] You can /opall, /conftopic, and /broadcast
+
+
+<a id="general-infrastructure-low-res-stream"></a>
+
+## Low-res stream
+
+Should be automatic, handled by Icecast
+backup on live:
+
+- /usr/local/bin/emacsconf-lowres-gen-on-connect
+- /usr/local/bin/emacsconf-lowres-dev-on-connect
+
+
+<a id="general-infrastructure-upload-talks-to-youtube"></a>
+
+## Upload talks to YouTube
+
+[Channel videos](https://studio.youtube.com/channel/UCwuyodzTl_KdEKNuJmeo99A/videos/upload?filter=%5B%5D&sort=%7B%22columnType%22%3A%22date%22%2C%22sortOrder%22%3A%22DESCENDING%22%7D)
+
+ (seq-keep
+ (lambda (o)
+ (when (and (string= (plist-get o :status) "TO_STREAM")
+ (not (plist-get o :youtube)))
+ (list
+ (plist-get o :slug)
+ (org-link-make-string
+ (concat "copy:"
+ )
+ "video file")
+ (org-link-make-string
+ (format "elisp:(emacsconf-publish-video-description \"%s\" t)"
+ (plist-get o :slug))
+ "desc")
+ (if (emacsconf-talk-file o "--main.vtt")
+ (org-link-make-string
+ (concat "copy:"
+ (emacsconf-talk-file o "--main.vtt"))
+ "sub file")
+ "")
+ (org-link-make-string
+ (concat "elisp:(emacsconf-set-property-from-slug \""
+ (plist-get o :slug)
+ "\" \"YOUTUBE\" (read-string \"YouTube URL: \"))"
+ )
+ "save")
+ (plist-get o :scheduled))))
+ (emacsconf-publish-prepare-for-display (emacsconf-get-talk-info)))
+
+
+<a id="general-infrastructure-restream-to-youtube"></a>
+
+## Restream to YouTube
+
+
<a id="other"></a>
# Other process notes
@@ -199,3 +1111,108 @@ For each talk:
ssh bbb.emacsverse.org
docker exec -it greenlight-v2 bundle exec rake user:create["USERNAME","EMAIL","PASSWORD","user"]
+
+<a id="other-process-notes-when-a-talk-is-added-after-the-schedule-has-already-been-drafted"></a>
+
+## When a talk is added after the schedule has already been drafted
+
+- [X] Add the talk to conf.org
+- [X] Add the talk ID to the draft schedule
+- [X] Run the draft schedule block
+- [X] <elisp:emacsconf-schedule-update-from-info>
+- [X] <elisp:emacsconf-publish-talks-json-to-files>
+- [X] Generate pads with `ansible-playbook -i inventory.yml prod-playbook.yml --tags pad`
+- [X] <elisp:emacsconf-set-file-prefixes>
+- [X] <elisp:emacsconf-update-schedule>
+- [X] <elisp:emacsconf-stream-generate-overlays>
+- [X] <elisp:emacsconf-stream-generate-test-videos>
+- [X] `rsync -avze ssh ~/proj/emacsconf/2024/assets/ res:/data/emacsconf/shared/2024/assets/`
+- [X] Send the upload instructions
+- [X] Generate the intro text
+- [ ] Record the intro
+
+
+<a id="cancel-talk"></a>
+
+## When a talk is cancelled
+
+1. Update the status to CANCELLED. Update that specific talk with <elisp:emacsconf-publish-info-pages-for-talk>.
+2. Rejig the schedule if needed, and update with <elisp:emacsconf-schedule-update-from-info>
+3. Update the published schedule with <elisp:emacsconf-update-schedule> and push the wiki.
+4. Regenerate the intros (before, after). <elisp:emacsconf-stream-generate-in-between-pages>, then use <elisp:subed-record-compile-video> in the intros file.
+5. Resync the cache directory.
+6. Consider updating the screenshots for sat-open and sun-open.
+
+
+<a id="other-process-notes-when-a-talk-changes-title"></a>
+
+## When a talk changes title
+
+1. Update the title in conf.org.
+2. Delete the FILE\_PREFIX property.
+3. Call <elisp:emacsconf-set-file-prefix-if-needed>.
+4. Rename existing files with <elisp:emacsconf-update-file-prefixes>.
+5. Update the intro VTT file with the new title.
+6. Update the wiki page for the talk.
+7. Regenerate the in-between images with <elisp:emacsconf-stream-generate-in-between-pages>
+8. Rerecord and recompile the intro, and recompile the intro for the talk after it.
+9. <elisp:emacsconf-update-schedule>
+10. <elisp:emacsconf-pad-prepopulate-hyperlists>
+
+
+<a id="change-talk-qa"></a>
+
+## When a talk Q&A changes method
+
+1. Update the talk property.
+2. Update the schedule with <elisp:emacsconf-update-schedule>
+3. Regenerate the intros (before, after). <elisp:emacsconf-stream-generate-in-between-pages>, then use <elisp:subed-record-compile-video> in the intros file.
+4. Sync the new intros to the /data/emacsconf/shared/$YEAR/assets/intros directory.
+5. Regenerate the pads: <elisp:emacsconf-pad-prepopulate-all-talks>
+6. Regenerate talks.json: <elisp:emacsconf-publish-talks-json-to-files>
+
+
+<a id="other-process-notes-to-play-the-other-stream"></a>
+
+## To play the other stream
+
+- mpv &#x2013;profile=full <https://live0.emacsconf.org/gen.webm>
+- Change the channel topic to note that discussion can be in the other channel
+
+
+<a id="other-process-notes-when-a-system-is-down"></a>
+
+## When a system is down
+
+Let people know in #emacsconf and #emacsconf-org
+
+Update the status page:
+
+<file://ssh:orga@front0.emacsconf.org:/var/www/status.emacsconf.org/index.html>
+
+/broadcast <message> may also be helpful
+
+
+<a id="other-process-notes-when-we-need-to-bring-on-a-last-minute-volunteer"></a>
+
+## When we need to bring on a last-minute volunteer
+
+/backstage nick
+
+will give them the backstage credentials and links to the index
+
+
+<a id="other-process-notes-checking-people-in"></a>
+
+## Checking people in
+
+/checkin nick
+/room nick (should be automatic if live, but there just in case)
+
+
+<a id="other-process-notes-ansible"></a>
+
+## Ansible
+
+ git clone git@git.emacsconf.org:pub/emacsconf-ansible
+