Categories: emacsconf

View topic page - RSS - Atom - Subscribe via email

EmacsConf 2024 notes

Posted: - Modified: | emacs, emacsconf

The videos have been uploaded, thank-you notes have been sent, and the kiddo has decided to play a little Minecraft on her own, so now I get to write some quick notes on EmacsConf 2024.

Stats

Talks 31
Hours 10.7
Q&A web conferences 21
Hours 7.8
  • Saturday:
    • gen: 177 peak + 14 peak lowres
    • dev: 226 peak + 79 peak lowres
  • Sunday:
    • gen: 89 peak + 10 peak lowres

Server configuration:

meet 16GB 8core dedicated peak 409% CPU (100% is 1 CPU), average 69.4%
front 32GB 8core shared peak 70.66% CPU (100% is 1 CPU)
live 64GB 16core shared peak 552% CPU (100% is 1 CPU) average 144%
res 46GB 12core peak 81.54% total CPU (100% is 12 CPUs); each OBS ~250%), mem 7GB used
media 3GB 1core  

YouTube livestream stats:

Shift Peak Avg
Gen Sat AM 46 28
Gen Sat PM 24 16
Dev Sat AM 15 7
Dev Sat PM 20 12
Gen Sun AM 28 17
Gen Sun PM 26 18

Timeline

Call for proposals [2024-06-30 Sun]
CFP deadline [2024-09-20 Fri]
Speaker notifications [2024-09-27 Fri]
Publish schedule [2024-10-25 Fri]
Video target date [2024-11-08 Fri]
EmacsConf [2024-12-07 Sat]-[2024-12-07 Sat]

We did early acceptances again this year. That was nice. I wasn't sure about committing longer periods of time early in the scheduling process, so I usually tried to nudge people to plan a 20-minute video with the option of possibly doing more, and I okayed longer talks once we figured out what the schedule looked like.

There were 82 days between the call for proposals and the CFP deadline, another 49 days from that to the video target date, and 29 days between the video target date and EmacsConf. It felt like there was a good amount of time for proposals and videos. Six videos came in before or on the target date. The rest trickled in afterwards, which was fine because we wanted to keep things low-pressure for the speakers. We had enough capacity to process and caption the videos as they came in.

Data

We continued to use an Org file to store the talk information. It would be great to add some validation functions:

  • Check permissions and ownership for files
  • Check case sensitivity for Q&A type detection
  • Check BBB redirect pages to make sure they exist
  • Check transcripts for ` because that messes up formatting; consider escaping for the wiki
  • Check files are public and readable
  • Check captioned by comment vs caption status vs captioner

Speakers uploaded their files via PsiTransfer again. I didn't get around to setting up the FTP server. I should probably rename ftp-upload.emacsconf.org to upload.emacsconf.org so that people don't get confused.

Communication

As usual, we announced the EmacsConf call for proposals on emacs-tangents, Emacs News, emacsconf-discuss, emacsconf-org, https://reddit.com/r/emacs. System Crafters, Irreal, and Emacs APAC, mentioned it, and people also posted about EmacsConf on Mastodon, X, BlueSky, and Facebook. @len@toot.si suggested submitting EmacsConf to https://foss.events, so I did. There was some other EmacsConf-related discussions in r/emacs. 200ok and Ardeo organized an in-person meetup in Switzerland, and emacs.si got together in Ljubljana.

For communicating with speakers and volunteers, I used lots of mail merge ((link (:standard-properties [6840 nil nil nil 6870 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil (paragraph (:standard-properties [6765 6765 6765 7077 7078 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil (section (:standard-properties [5183 5183 5183 7779 7779 0 nil section nil nil nil 5183 7779 nil posts.org<2> nil nil (headline (:standard-properties [5166 5166 5183 7779 7779 0 (:title) nil nil nil nil 5248 7777 2 posts.org<2> nil nil (org-data (:standard-properties [1 1 1 261287 261287 0 nil org-data nil nil nil 3 261287 nil posts.org<2> nil nil nil] :path /home/sacha/sync/orgzly/posts.org :CATEGORY posts) (section (:standard-properties [1307 1307 1307 1964 1964 0 nil first-section nil nil nil 1307 1964 nil posts.org<2> nil nil #12]) (special-block (:standard-properties [1307 1307 1322 1669 1683 1 nil top-comment nil nil nil nil nil nil posts.org<2> nil nil #13] :type update :parameters nil) (plain-list (:standard-properties [1322 1322 1322 1669 1669 0 nil nil nil nil nil nil nil nil posts.org<2> nil ((1322 0 - nil nil nil 1487) (1487 0 - nil nil nil 1547) (1547 0 - nil nil nil 1669)) #14] :type unordered) (item (:standard-properties [1322 1322 1324 1487 1487 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((1322 0 - nil nil nil 1487) (1487 0 - nil nil nil 1547) (1547 0 - nil nil nil 1669)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [1324 1324 1324 1487 1487 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) (timestamp (:standard-properties [1324 nil nil nil 1336 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #17] :type inactive :range-type nil :raw-value [2025-01-10] :year-start 2025 :month-start 1 :day-start 10 :hour-start nil :minute-start nil :year-end 2025 :month-end 1 :day-end 10 :hour-end nil :minute-end nil)) : (link (:standard-properties [1338 nil 1387 1412 1415 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #17] :type https :type-explicit-p t :path //news.ycombinator.com/item?id=42531217 :format bracket :raw-link https://news.ycombinator.com/item?id=42531217 :application nil :search-option nil) Discussion on Hacker News) ( (link (:standard-properties [1416 nil 1452 1483 1485 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #17] :type https :type-explicit-p t :path //ditzes.com/item/42531217 :format bracket :raw-link https://ditzes.com/item/42531217 :application nil :search-option nil) comments in chronological order) ) )) (item (:standard-properties [1487 1487 1489 1547 1547 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((1322 0 - nil nil nil 1487) (1487 0 - nil nil nil 1547) (1547 0 - nil nil nil 1669)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [1489 1489 1489 1547 1547 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) (timestamp (:standard-properties [1489 nil nil nil 1501 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #17] :type inactive :range-type nil :raw-value [2025-01-02] :year-start 2025 :month-start 1 :day-start 2 :hour-start nil :minute-start nil :year-end 2025 :month-end 1 :day-end 2 :hour-end nil :minute-end nil)) : Add numbers based on latest Linode invoice. )) (item (:standard-properties [1547 1547 1549 1669 1669 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((1322 0 - nil nil nil 1487) (1487 0 - nil nil nil 1547) (1547 0 - nil nil nil 1669)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [1549 1549 1549 1669 1669 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) (timestamp (:standard-properties [1549 nil nil nil 1561 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #17] :type inactive :range-type nil :raw-value [2024-12-28] :year-start 2024 :month-start 12 :day-start 28 :hour-start nil :minute-start nil :year-end 2024 :month-end 12 :day-end 28 :hour-end nil :minute-end nil)) : Added talk and Q&A count, added note about BBB max simultaneous users, added note about BBB, added thanks )))) (paragraph (:standard-properties [1683 1683 1683 1939 1940 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #13]) (link (:standard-properties [1683 nil 1719 1748 1750 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14] :type https :type-explicit-p t :path //emacsconf.org/2024/talks :format bracket :raw-link https://emacsconf.org/2024/talks :application nil :search-option nil) The videos have been uploaded) , thank-you notes have been sent, and the kiddo has decided to play a little Minecraft on her own, so now I get to write some quick notes on (link (:standard-properties [1891 nil 1921 1935 1937 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14] :type https :type-explicit-p t :path //emacsconf.org/2024 :format bracket :raw-link https://emacsconf.org/2024 :application nil :search-option nil) EmacsConf 2024) . ) (keyword (:standard-properties [1940 1940 nil nil 1964 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #13] :key TOC :value headlines local))) (headline (:standard-properties [1964 1964 1973 3117 3117 0 (:title) nil nil nil nil 2030 3115 2 posts.org<2> nil nil #12] :pre-blank 0 :raw-value Stats :title (Stats) :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :footnote-section-p [org-element-deferred org-element--headline-footnote-section-p nil nil] :archivedp [org-element-deferred org-element--headline-archivedp nil nil] :commentedp nil :CUSTOM_ID emacsconf-2024-notes-stats) (section (:standard-properties [1973 1973 1973 3117 3117 0 nil section nil nil nil 1973 3117 nil posts.org<2> nil nil #13]) (drawer (:standard-properties [2032 2043 2053 2177 2185 2 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14] :drawer-name results :results ()) (table (:standard-properties [2053 2053 2053 2177 2177 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type org :tblfm nil :value nil) (table-row (:standard-properties [2053 2053 2054 2083 2084 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #16] :type standard) (table-cell (:standard-properties [2054 nil 2055 2060 2076 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #17]) Talks) (table-cell (:standard-properties [2076 nil 2079 2081 2083 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #17]) 31)) (table-row (:standard-properties [2084 2084 2085 2114 2115 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #16] :type standard) (table-cell (:standard-properties [2085 nil 2086 2091 2107 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #17]) Hours) (table-cell (:standard-properties [2107 nil 2108 2112 2114 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #17]) 10.7)) (table-row (:standard-properties [2115 2115 2116 2145 2146 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #16] :type standard) (table-cell (:standard-properties [2116 nil 2117 2136 2138 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #17]) Q&A web conferences) (table-cell (:standard-properties [2138 nil 2141 2143 2145 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #17]) 21)) (table-row (:standard-properties [2146 2146 2147 2176 2177 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #16] :type standard) (table-cell (:standard-properties [2147 nil 2148 2153 2169 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #17]) Hours) (table-cell (:standard-properties [2169 nil 2171 2174 2176 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #17]) 7.8)))) (plain-list (:standard-properties [2185 2185 2185 2311 2312 1 nil nil nil nil nil nil nil nil posts.org<2> nil ((2185 0 - nil nil nil 2267) (2197 2 - nil nil nil 2232) (2232 2 - nil nil nil 2267) (2267 0 - nil nil nil 2311) (2277 2 - nil nil nil 2311)) #14] :type unordered) (item (:standard-properties [2185 2185 2187 2267 2267 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((2185 0 - nil nil nil 2267) (2197 2 - nil nil nil 2232) (2232 2 - nil nil nil 2267) (2267 0 - nil nil nil 2311) (2277 2 - nil nil nil 2311)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [2187 2187 2187 2197 2197 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Saturday: ) (plain-list (:standard-properties [2197 2197 2197 2267 2267 0 nil nil nil nil nil nil nil nil posts.org<2> nil ((2185 0 - nil nil nil 2267) (2197 2 - nil nil nil 2232) (2232 2 - nil nil nil 2267) (2267 0 - nil nil nil 2311) (2277 2 - nil nil nil 2311)) #16] :type unordered) (item (:standard-properties [2197 2197 2201 2232 2232 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((2185 0 - nil nil nil 2267) (2197 2 - nil nil nil 2232) (2232 2 - nil nil nil 2267) (2267 0 - nil nil nil 2311) (2277 2 - nil nil nil 2311)) #17] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [2201 2201 2201 2232 2232 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #18]) gen: 177 peak + 14 peak lowres )) (item (:standard-properties [2232 2232 2236 2267 2267 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((2185 0 - nil nil nil 2267) (2197 2 - nil nil nil 2232) (2232 2 - nil nil nil 2267) (2267 0 - nil nil nil 2311) (2277 2 - nil nil nil 2311)) #17] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [2236 2236 2236 2267 2267 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #18]) dev: 226 peak + 79 peak lowres )))) (item (:standard-properties [2267 2267 2269 2311 2311 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((2185 0 - nil nil nil 2267) (2197 2 - nil nil nil 2232) (2232 2 - nil nil nil 2267) (2267 0 - nil nil nil 2311) (2277 2 - nil nil nil 2311)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [2269 2269 2269 2277 2277 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Sunday: ) (plain-list (:standard-properties [2277 2277 2277 2311 2311 0 nil nil nil nil nil nil nil nil posts.org<2> nil ((2185 0 - nil nil nil 2267) (2197 2 - nil nil nil 2232) (2232 2 - nil nil nil 2267) (2267 0 - nil nil nil 2311) (2277 2 - nil nil nil 2311)) #16] :type unordered) (item (:standard-properties [2277 2277 2281 2311 2311 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((2185 0 - nil nil nil 2267) (2197 2 - nil nil nil 2232) (2232 2 - nil nil nil 2267) (2267 0 - nil nil nil 2311) (2277 2 - nil nil nil 2311)) #17] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [2281 2281 2281 2311 2311 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #18]) gen: 89 peak + 10 peak lowres ))))) (paragraph (:standard-properties [2312 2312 2312 2334 2335 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) Server configuration: ) (table (:standard-properties [2335 2335 2335 2865 2866 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14] :type org :tblfm nil :value nil) (table-row (:standard-properties [2335 2335 2336 2440 2441 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [2336 nil 2337 2341 2344 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) meet) (table-cell (:standard-properties [2344 nil 2345 2365 2367 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 16GB 8core dedicated) (table-cell (:standard-properties [2367 nil 2368 2412 2440 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) peak 409% CPU (100% is 1 CPU), average 69.4%)) (table-row (:standard-properties [2441 2441 2442 2546 2547 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [2442 nil 2443 2448 2450 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) front) (table-cell (:standard-properties [2450 nil 2451 2468 2473 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 32GB 8core shared) (table-cell (:standard-properties [2473 nil 2474 2505 2546 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) peak 70.66% CPU (100% is 1 CPU))) (table-row (:standard-properties [2547 2547 2548 2652 2653 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [2548 nil 2549 2553 2556 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) live) (table-cell (:standard-properties [2556 nil 2557 2575 2579 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 64GB 16core shared) (table-cell (:standard-properties [2579 nil 2580 2622 2652 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) peak 552% CPU (100% is 1 CPU) average 144%)) (table-row (:standard-properties [2653 2653 2654 2758 2759 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [2654 nil 2655 2658 2662 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) res) (table-cell (:standard-properties [2662 nil 2663 2674 2685 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 46GB 12core) (table-cell (:standard-properties [2685 nil 2686 2756 2758 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) peak 81.54% total CPU (100% is 12 CPUs); each OBS ~250%), mem 7GB used)) (table-row (:standard-properties [2759 2759 2760 2864 2865 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [2760 nil 2761 2766 2768 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) media) (table-cell (:standard-properties [2768 nil 2769 2778 2791 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 3GB 1core) (table-cell (:standard-properties [2791 nil 2863 2863 2864 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16])))) (paragraph (:standard-properties [2866 2866 2866 2892 2893 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) YouTube livestream stats: ) (table (:standard-properties [2893 2893 2893 3117 3117 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14] :type org :tblfm nil :value nil) (table-row (:standard-properties [2893 2893 2894 2920 2921 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [2894 nil 2895 2900 2907 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Shift) (table-cell (:standard-properties [2907 nil 2908 2912 2914 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Peak) (table-cell (:standard-properties [2914 nil 2915 2918 2920 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Avg)) (table-row (:standard-properties [2921 2921 nil nil 2949 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type rule)) (table-row (:standard-properties [2949 2949 2950 2976 2977 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [2950 nil 2951 2961 2963 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Gen Sat AM) (table-cell (:standard-properties [2963 nil 2966 2968 2970 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 46) (table-cell (:standard-properties [2970 nil 2972 2974 2976 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 28)) (table-row (:standard-properties [2977 2977 2978 3004 3005 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [2978 nil 2979 2989 2991 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Gen Sat PM) (table-cell (:standard-properties [2991 nil 2994 2996 2998 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 24) (table-cell (:standard-properties [2998 nil 3000 3002 3004 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 16)) (table-row (:standard-properties [3005 3005 3006 3032 3033 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [3006 nil 3007 3017 3019 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Dev Sat AM) (table-cell (:standard-properties [3019 nil 3022 3024 3026 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 15) (table-cell (:standard-properties [3026 nil 3029 3030 3032 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 7)) (table-row (:standard-properties [3033 3033 3034 3060 3061 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [3034 nil 3035 3045 3047 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Dev Sat PM) (table-cell (:standard-properties [3047 nil 3050 3052 3054 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 20) (table-cell (:standard-properties [3054 nil 3056 3058 3060 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 12)) (table-row (:standard-properties [3061 3061 3062 3088 3089 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [3062 nil 3063 3073 3075 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Gen Sun AM) (table-cell (:standard-properties [3075 nil 3078 3080 3082 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 28) (table-cell (:standard-properties [3082 nil 3084 3086 3088 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 17)) (table-row (:standard-properties [3089 3089 3090 3116 3117 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [3090 nil 3091 3101 3103 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Gen Sun PM) (table-cell (:standard-properties [3103 nil 3106 3108 3110 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 26) (table-cell (:standard-properties [3110 nil 3112 3114 3116 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 18))))) (headline (:standard-properties [3117 3117 3129 4375 4375 0 (:title) nil nil nil nil 3189 4373 2 posts.org<2> nil nil #12] :pre-blank 0 :raw-value Timeline :title (Timeline) :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :footnote-section-p [org-element-deferred org-element--headline-footnote-section-p nil nil] :archivedp [org-element-deferred org-element--headline-archivedp nil nil] :commentedp nil :CUSTOM_ID emacsconf-2024-notes-timeline) (section (:standard-properties [3129 3129 3129 4375 4375 0 nil section nil nil nil 3129 4375 nil posts.org<2> nil nil #13]) (table (:standard-properties [3191 3191 3191 3563 3564 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14] :type org :tblfm nil :value nil) (table-row (:standard-properties [3191 3191 3192 3252 3253 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [3192 nil 3193 3211 3216 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Call for proposals) (table-cell (:standard-properties [3216 nil 3217 3233 3252 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) (timestamp (:standard-properties [3217 nil nil nil 3233 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #17] :type inactive :range-type nil :raw-value [2024-06-30 Sun] :year-start 2024 :month-start 6 :day-start 30 :hour-start nil :minute-start nil :year-end 2024 :month-end 6 :day-end 30 :hour-end nil :minute-end nil)))) (table-row (:standard-properties [3253 3253 3254 3314 3315 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [3254 nil 3255 3267 3278 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) CFP deadline) (table-cell (:standard-properties [3278 nil 3279 3295 3314 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) (timestamp (:standard-properties [3279 nil nil nil 3295 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #17] :type inactive :range-type nil :raw-value [2024-09-20 Fri] :year-start 2024 :month-start 9 :day-start 20 :hour-start nil :minute-start nil :year-end 2024 :month-end 9 :day-end 20 :hour-end nil :minute-end nil)))) (table-row (:standard-properties [3315 3315 3316 3376 3377 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [3316 nil 3317 3338 3340 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Speaker notifications) (table-cell (:standard-properties [3340 nil 3341 3357 3376 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) (timestamp (:standard-properties [3341 nil nil nil 3357 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #17] :type inactive :range-type nil :raw-value [2024-09-27 Fri] :year-start 2024 :month-start 9 :day-start 27 :hour-start nil :minute-start nil :year-end 2024 :month-end 9 :day-end 27 :hour-end nil :minute-end nil)))) (table-row (:standard-properties [3377 3377 3378 3438 3439 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [3378 nil 3379 3395 3402 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Publish schedule) (table-cell (:standard-properties [3402 nil 3403 3419 3438 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) (timestamp (:standard-properties [3403 nil nil nil 3419 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #17] :type inactive :range-type nil :raw-value [2024-10-25 Fri] :year-start 2024 :month-start 10 :day-start 25 :hour-start nil :minute-start nil :year-end 2024 :month-end 10 :day-end 25 :hour-end nil :minute-end nil)))) (table-row (:standard-properties [3439 3439 3440 3500 3501 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [3440 nil 3441 3458 3464 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Video target date) (table-cell (:standard-properties [3464 nil 3465 3481 3500 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) (timestamp (:standard-properties [3465 nil nil nil 3481 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #17] :type inactive :range-type nil :raw-value [2024-11-08 Fri] :year-start 2024 :month-start 11 :day-start 8 :hour-start nil :minute-start nil :year-end 2024 :month-end 11 :day-end 8 :hour-end nil :minute-end nil)))) (table-row (:standard-properties [3501 3501 3502 3562 3563 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [3502 nil 3503 3512 3526 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) EmacsConf) (table-cell (:standard-properties [3526 nil 3527 3560 3562 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) (timestamp (:standard-properties [3527 nil nil nil 3543 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #17] :type inactive :range-type nil :raw-value [2024-12-07 Sat] :year-start 2024 :month-start 12 :day-start 7 :hour-start nil :minute-start nil :year-end 2024 :month-end 12 :day-end 7 :hour-end nil :minute-end nil)) - (timestamp (:standard-properties [3544 nil nil nil 3560 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #17] :type inactive :range-type nil :raw-value [2024-12-07 Sat] :year-start 2024 :month-start 12 :day-start 7 :hour-start nil :minute-start nil :year-end 2024 :month-end 12 :day-end 7 :hour-end nil :minute-end nil))))) (paragraph (:standard-properties [3564 3564 3564 3886 3887 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) We did early acceptances again this year. That was nice. I wasn't sure about committing longer periods of time early in the scheduling process, so I usually tried to nudge people to plan a 20-minute video with the option of possibly doing more, and I okayed longer talks once we figured out what the schedule looked like. ) (paragraph (:standard-properties [3887 3887 3887 4374 4375 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) There were 82 days between the call for proposals and the CFP deadline, another 49 days from that to the video target date, and 29 days between the video target date and EmacsConf. It felt like there was a good amount of time for proposals and videos. Six videos came in before or on the target date. The rest trickled in afterwards, which was fine because we wanted to keep things low-pressure for the speakers. We had enough capacity to process and caption the videos as they came in. ))) (headline (:standard-properties [4375 4375 4383 5166 5166 0 (:title) nil nil nil nil 4439 5164 2 posts.org<2> nil nil #12] :pre-blank 0 :raw-value Data :title (Data) :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :footnote-section-p [org-element-deferred org-element--headline-footnote-section-p nil nil] :archivedp [org-element-deferred org-element--headline-archivedp nil nil] :commentedp nil :CUSTOM_ID emacsconf-2024-notes-data) (section (:standard-properties [4383 4383 4383 5166 5166 0 nil section nil nil nil 4383 5166 nil posts.org<2> nil nil #13]) (paragraph (:standard-properties [4441 4441 4441 4556 4557 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) We continued to use an Org file to store the talk information. It would be great to add some validation functions: ) (plain-list (:standard-properties [4557 4557 4557 4906 4907 1 nil nil nil nil nil nil nil nil posts.org<2> nil ((4557 0 - nil nil nil 4603) (4603 0 - nil nil nil 4653) (4653 0 - nil nil nil 4706) (4706 0 - nil nil nil 4804) (4804 0 - nil nil nil 4844) (4844 0 - nil nil nil 4906)) #14] :type unordered) (item (:standard-properties [4557 4557 4561 4603 4603 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((4557 0 - nil nil nil 4603) (4603 0 - nil nil nil 4653) (4653 0 - nil nil nil 4706) (4706 0 - nil nil nil 4804) (4804 0 - nil nil nil 4844) (4844 0 - nil nil nil 4906)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [4561 4561 4561 4603 4603 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Check permissions and ownership for files )) (item (:standard-properties [4603 4603 4607 4653 4653 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((4557 0 - nil nil nil 4603) (4603 0 - nil nil nil 4653) (4653 0 - nil nil nil 4706) (4706 0 - nil nil nil 4804) (4804 0 - nil nil nil 4844) (4844 0 - nil nil nil 4906)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [4607 4607 4607 4653 4653 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Check case sensitivity for Q&A type detection )) (item (:standard-properties [4653 4653 4657 4706 4706 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((4557 0 - nil nil nil 4603) (4603 0 - nil nil nil 4653) (4653 0 - nil nil nil 4706) (4706 0 - nil nil nil 4804) (4804 0 - nil nil nil 4844) (4844 0 - nil nil nil 4906)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [4657 4657 4657 4706 4706 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Check BBB redirect pages to make sure they exist )) (item (:standard-properties [4706 4706 4710 4804 4804 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((4557 0 - nil nil nil 4603) (4603 0 - nil nil nil 4653) (4653 0 - nil nil nil 4706) (4706 0 - nil nil nil 4804) (4804 0 - nil nil nil 4844) (4844 0 - nil nil nil 4906)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [4710 4710 4710 4804 4804 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Check transcripts for ` because that messes up formatting; consider escaping for the wiki )) (item (:standard-properties [4804 4804 4808 4844 4844 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((4557 0 - nil nil nil 4603) (4603 0 - nil nil nil 4653) (4653 0 - nil nil nil 4706) (4706 0 - nil nil nil 4804) (4804 0 - nil nil nil 4844) (4844 0 - nil nil nil 4906)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [4808 4808 4808 4844 4844 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Check files are public and readable )) (item (:standard-properties [4844 4844 4848 4906 4906 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((4557 0 - nil nil nil 4603) (4603 0 - nil nil nil 4653) (4653 0 - nil nil nil 4706) (4706 0 - nil nil nil 4804) (4804 0 - nil nil nil 4844) (4844 0 - nil nil nil 4906)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [4848 4848 4848 4906 4906 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Check captioned by comment vs caption status vs captioner ))) (paragraph (:standard-properties [4907 4907 4907 5165 5166 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) Speakers uploaded their files via (link (:standard-properties [4941 nil 4985 4996 4998 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //github.com/psi-4ward/psitransfer :format bracket :raw-link https://github.com/psi-4ward/psitransfer :application nil :search-option nil) PsiTransfer) again. I didn't get around to setting up the FTP server. I should probably rename ftp-upload.emacsconf.org to upload.emacsconf.org so that people don't get confused. ))) #9 (headline (:standard-properties [7779 7779 7791 11019 11019 0 (:title) nil nil nil nil 7851 11017 2 posts.org<2> nil nil #12] :pre-blank 0 :raw-value Schedule :title (Schedule) :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :footnote-section-p [org-element-deferred org-element--headline-footnote-section-p nil nil] :archivedp [org-element-deferred org-element--headline-archivedp nil nil] :commentedp nil :CUSTOM_ID emacsconf-2024-notes-schedule) (section (:standard-properties [7791 7791 7791 11019 11019 0 nil section nil nil nil 7791 11019 nil posts.org<2> nil nil #13]) (paragraph (:standard-properties [7853 7853 7853 8089 8090 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) The schedule worked out to two days of talks, with two tracks on the first day, and about 15-20 minutes between each talk. We were able to adapt to late submissions, last-minute cancellations, and last-minute switches from Q&A to live. ) (paragraph (:standard-properties [8090 8090 8090 8474 8475 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) We added an open mic session on Sunday to fill in the time from a last-minute cancellation. That worked out nicely and it might be a good idea to schedule in that time next year. It was also good to move some of the usual closing remarks earlier. We were able to wrap up in a timely manner, which was great for some hosts and participants because they didn't have to stay up so late. ) (paragraph (:standard-properties [8475 8475 8475 8782 8783 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) Sunday was single-track, so it was nice and relaxed. I was a little worried that people might get bored if the current talk wasn't relevant to their interests, but everyone managed just fine. I probably should have remembered that Emacs people are good at turning extra time into more configuration tweaks. ) (paragraph (:standard-properties [8783 8783 8783 9101 9102 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) Most of the scheduling was determined by people's time constraints, so I didn't worry too much about making the talks flow logically. I accidentally forgot to note down one speaker's time constraints, but he caught it when we e-mailed the draft schedule and I was able to move things around for a better time for him. ) (paragraph (:standard-properties [9102 9102 9102 9500 9501 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) There was a tiny bit of technical confusion because the automated schedule publishing on res had case-sensitive matching ( (code (:standard-properties [9224 nil nil nil 9242 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :value [org-element-deferred org-element--substring (1 17) t])) was set to (code (:standard-properties [9254 nil nil nil 9259 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :value [org-element-deferred org-element--substring (1 4) t])) ), so if a talk was set to "Live" Q&A, it didn't announce it as a live talk because it was looking for (code (:standard-properties [9362 nil nil nil 9368 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :value [org-element-deferred org-element--substring (1 5) t])) . Whoops. I've added that configuration setting to my (code (:standard-properties [9422 nil nil nil 9450 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :value [org-element-deferred org-element--substring (1 27) t])) , so the ansible scripts should get it next time. ) (paragraph (:standard-properties [9501 9501 9501 10021 10022 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) I asked Leo and Corwin if they wanted to manually control the talks this year. They opted to leave it automatically managed by crontab so that they wouldn't have to worry as much about timekeeping. It worked reliably. Hooray for automation! The only scheduling hiccup was because I turned off the crontab so that we could do Saturday closing remarks when we wanted to and I forgot to reenable autopilot the next day. We noticed when the opening remarks didn't start right on the dot, and I got everything back on track. ) (paragraph (:standard-properties [10022 10022 10022 10305 10306 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) Like last year, I scheduled the dev track to start a little later than the gen track. That made for a less frantic morning. Also, this year we scheduled Sunday morning to start with more IRC Q&A instead of live Q&A. We didn't notice any bandwidth issues on Sunday morning this time. ) (paragraph (:standard-properties [10306 10306 10306 10499 10500 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) It would be nice to have Javascript countdowns in some kind of web interface to make it easier for hosts, especially if we can update it with the actual time the current video will end in MPV. ) (paragraph (:standard-properties [10500 10500 10500 10646 10647 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) I can also update the (link (:standard-properties [10522 nil nil nil 10555 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type emacsconf-el :type-explicit-p t :path emacsconf-stream.el :format plain :raw-link emacsconf-el:emacsconf-stream.el :application nil :search-option nil)) code to make it easier to automatically count down to the next talk or to a specific talk. ) (paragraph (:standard-properties [10647 10647 10647 10795 10796 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) We have Javascript showing local time on the individual talk pages, but it would be nice to localize the times on all the schedule/watch pages too. ) (paragraph (:standard-properties [10796 10796 10796 11018 11019 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) Most of my stuff (scheduling, publishing, etc.) is handled by automation with just a little bit of manual nudging every so often, so it might be possible to organize an event that's more friendly to Europe/APAC timezones. ))) (headline (:standard-properties [11019 11019 11038 14417 14417 0 (:title) nil nil nil nil 11105 14415 2 posts.org<2> nil nil #12] :pre-blank 0 :raw-value Recorded videos :title (Recorded videos) :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :footnote-section-p [org-element-deferred org-element--headline-footnote-section-p nil nil] :archivedp [org-element-deferred org-element--headline-archivedp nil nil] :commentedp nil :CUSTOM_ID emacsconf-2024-notes-recorded-videos) (section (:standard-properties [11038 11038 11038 14417 14417 0 nil section nil nil nil 11038 14417 nil posts.org<2> nil nil #13]) (paragraph (:standard-properties [11107 11107 11107 11495 11496 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) As usual, we strongly encouraged speakers to record videos to lower everyone's stress levels and allow for captioning by volunteers, so that's what most speakers did. We were able to handle a few last-minute submissions as well as a live talk. Getting videos also meant we could publish them as each talk went live, including automatically putting the videos and transcripts on the wiki. ) (paragraph (:standard-properties [11496 11496 11496 11744 11745 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) We didn't have obvious video encoding cut-offs, so re-encoding in a screen was a reliable way to avoid interruptions this year. Also, no one complained about tiny text or low resolution, so the talk preparation instructions seem to be working out. ) (paragraph (:standard-properties [11745 11745 11745 12180 12181 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) Automatically normalizing the audio with ffmpeg-normalize didn't work out, so Leo Vivier did a last-minute scramble to normalize the audio the day before the conference. Maybe that's something that volunteers can help with during the lead-up to the conference, or maybe I can finally figure out how to fit that into my process. I don't have much time or patience to listen to things, but it would be nice to get that sorted out early. ) (paragraph (:standard-properties [12181 12181 12181 12417 12418 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) Next year we can try remixing the audio to mono. One of the talks had some audio moving around, which was a little distracting. Also, some people listen to the talks in one ear, so it would be good to drop things down to mono for them. ) (paragraph (:standard-properties [12418 12418 12418 12724 12725 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) We think 60fps videos stressed the res server a bit, resulting in dropped frames. Next year, we can downsample those to 30fps and add a note to the talk preparation instructions. The hosts also suggested looking into setting up streaming from each host's computer instead of using our shared VNC sessions. ) (paragraph (:standard-properties [12725 12725 12725 12847 12848 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) There was some colour smearing and weirdness when we played some videos with mpv on res. Upgrading MPV to v0.38 fixed it. ) (paragraph (:standard-properties [12848 12848 12848 12974 12975 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) Some people requested dark mode (light text on dark background), so maybe we can experiment with recommending that next year. ) (paragraph (:standard-properties [12975 12975 12975 13307 13308 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) I did a last-minute change to the shell scripts to load resources from the cache directory instead of the assets/stream directory, but I didn't get all of the file references, so sometimes the test videos played or the introductions didn't have captions. On the plus side, I learned how to use (code (:standard-properties [13269 nil nil nil 13273 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :value [org-element-deferred org-element--substring (1 2) t])) in MPV to reload a subtitle file. ) (paragraph (:standard-properties [13308 13308 13308 13610 13611 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) Sometimes we needed to play the videos manually. If we get the hang of starting MPV in a screen or tmux session, it might be easier for hosts to check how much time is left, or to restart a video at a specific point if needed. Leo said he'll work on figuring out the configuration and the Lua scripts. ) (paragraph (:standard-properties [13611 13611 13611 14165 14166 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) I uploaded all the videos to YouTube and scheduled them. That was nice because then I didn't have to keep updating things during the conference. It turns out that Toobnix also has a way to schedule uploads. I just need to upload it as unlisted first, and then choose Scheduled from the visibility. I wonder if (link (:standard-properties [13921 nil 13981 13993 13996 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //www.npmjs.com/package/%40peertube%2Fpeertube-cli :format bracket :raw-link https://www.npmjs.com/package/%40peertube%2Fpeertube-cli :application nil :search-option nil) peertube-cli) can be extended to schedule things. Anyway, since I didn't know about that during the conference, I just used (code (:standard-properties [14106 nil nil nil 14138 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :value [org-element-deferred org-element--substring (1 30) t])) function to upload videos. ) (paragraph (:standard-properties [14166 14166 14166 14416 14417 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) It was fun playing (link (:standard-properties [14185 nil 14232 14296 14299 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //www.youtube.com/watch?v=urcL86UpqZc :format bracket :raw-link https://www.youtube.com/watch?v=urcL86UpqZc :application nil :search-option nil) Interview with an Emacs Enthusiast in 2023 [Colorized] - YouTube) at lunch. I put together some captions for it after the conference, so maybe we can play it with captions next year. ))) (headline (:standard-properties [14417 14417 14443 15162 15162 0 (:title) nil nil nil nil 14517 15160 2 posts.org<2> nil nil #12] :pre-blank 0 :raw-value Recorded introductions :title (Recorded introductions) :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :footnote-section-p [org-element-deferred org-element--headline-footnote-section-p nil nil] :archivedp [org-element-deferred org-element--headline-archivedp nil nil] :commentedp nil :CUSTOM_ID emacsconf-2024-notes-recorded-introductions) (section (:standard-properties [14443 14443 14443 15162 15162 0 nil section nil nil nil 14443 15162 nil posts.org<2> nil nil #13]) (paragraph (:standard-properties [14519 14519 14519 14819 14820 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) We record introductions so that hosts don't have to worry about how to say things on air. I should probably send the intro check e-mail earlier--maybe on the original video target date, even if speakers haven't submitted their videos yet. This will reduce the last-minute scramble to correct intros. ) (paragraph (:standard-properties [14820 14820 14820 14994 14995 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) When I switched the shell scripts to use the cache directory, I forgot to get it to do the intros from that directory as well, so some of the uncorrected intros were played. ) (paragraph (:standard-properties [14995 14995 14995 15161 15162 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) I forgot to copy the intro VTTs to the cache directory. This should be handled by the subed-record process for creating intros, so it'll be all sorted out next year. ))) (headline (:standard-properties [15162 15162 15176 16756 16756 0 (:title) nil nil nil nil 15238 16754 2 posts.org<2> nil nil #12] :pre-blank 0 :raw-value Captioning :title (Captioning) :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :footnote-section-p [org-element-deferred org-element--headline-footnote-section-p nil nil] :archivedp [org-element-deferred org-element--headline-archivedp nil nil] :commentedp nil :CUSTOM_ID emacsconf-2024-notes-captioning) (section (:standard-properties [15176 15176 15176 16756 16756 0 nil section nil nil nil 15176 16756 nil posts.org<2> nil nil #13]) (paragraph (:standard-properties [15240 15240 15240 16015 16016 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) We used (link (:standard-properties [15248 nil 15286 15294 15297 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //github.com/m-bain/whisperX :format bracket :raw-link https://github.com/m-bain/whisperX :application nil :search-option nil) WhisperX) for speech-to-text this year. It did a great job at preparing the first drafts of captions that our wonderful army of volunteer captioners could then edit. WhisperX's built-in voice activity detection cut down a lot on the hallucinations that (link (:standard-properties [15540 nil 15577 15591 15594 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //github.com/openai/whisper :format bracket :raw-link https://github.com/openai/whisper :application nil :search-option nil) OpenAI Whisper) had during periods of silence in last year's captions, and there was only one instance of WhisperX missing a chunk of text from a speaker that I needed to manually fill in. I upgraded to a Lenovo P52 with 64GB RAM, so I was able to handle last-minute caption processing on my computer. It might be handy to have a smaller model ready for those last-minute requests, or have something ready to go for the commercial APIs. ) (paragraph (:standard-properties [16016 16016 16016 16585 16586 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) The timestamps were a little bit off. It was really helpful that speakers and volunteers used the backstage area to check video quality. I used (link (:standard-properties [16160 nil 16197 16203 16206 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //www.readbeyond.it/aeneas/ :format bracket :raw-link https://www.readbeyond.it/aeneas/ :application nil :search-option nil) Aeneas) to re-align the text, but Aeneas was also confused by silences. I've added some code to (link (:standard-properties [16294 nil 16329 16334 16337 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //github.com/sachac/subed :format bracket :raw-link https://github.com/sachac/subed :application nil :search-option nil) subed) so that I can realign regions of subtitles using Aeneas or WhisperX timestamps, and I also wrote some code to (link (:standard-properties [16447 nil 16544 16581 16583 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //sachachua.com/blog/2024/11/checking-caption-timing-by-skimming-with-emacs-lisp-or-js/ :format bracket :raw-link https://sachachua.com/blog/2024/11/checking-caption-timing-by-skimming-with-emacs-lisp-or-js/ :application nil :search-option nil) skim timestamps for easy verification) . ) (paragraph (:standard-properties [16586 16586 16586 16755 16756 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) Anush V experimented with using machine learning for (link (:standard-properties [16639 nil 16677 16698 16700 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //gitlab.com/jun8git/sub-seg :format bracket :raw-link https://gitlab.com/jun8git/sub-seg :application nil :search-option nil) subtitle segmentation) , so that might be something to explore going forward. ))) (headline (:standard-properties [16756 16756 16788 19618 19618 0 (:title) nil nil nil nil 16868 19616 2 posts.org<2> nil nil #12] :pre-blank 0 :raw-value BigBlueButton web conference :title (BigBlueButton web conference) :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :footnote-section-p [org-element-deferred org-element--headline-footnote-section-p nil nil] :archivedp [org-element-deferred org-element--headline-archivedp nil nil] :commentedp nil :CUSTOM_ID emacsconf-2024-notes-bigbluebutton-web-conference) (section (:standard-properties [16788 16788 16788 19618 19618 0 nil section nil nil nil 16788 19618 nil posts.org<2> nil nil #13]) (paragraph (:standard-properties [16870 16870 16870 17815 17816 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) This year we set up a new (link (:standard-properties [16896 nil 16931 16944 16947 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //demo.bigbluebutton.org/ :format bracket :raw-link https://demo.bigbluebutton.org/ :application nil :search-option nil) BigBlueButton) web conferencing server. The server with our previous BigBlueButton instance had been donated by a defunct nonprofit, so it finally got removed on October 27. After investigating whether Jitsi or Galene might be a good fit for EmacsConf, we decided to continue with BigBlueButton. There were some concerns about (link (:standard-properties [17259 nil 17318 17332 17335 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //github.com/bigbluebutton/bbb-install/issues/261 :format bracket :raw-link https://github.com/bigbluebutton/bbb-install/issues/261 :application nil :search-option nil) non-free Mongo) for BBB versions >= 2.3 and < 3, so I installed BBB 3.0. This was hard to get working on a Docker on the existing res server. (link (:standard-properties [17461 nil 17516 17526 17529 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //emacsconf.org/2024/organizers-notebook/#bbb :format bracket :raw-link https://emacsconf.org/2024/organizers-notebook/#bbb :application nil :search-option nil) We decided) it was worth spinning up an additional Linode virtual private server. It turned out that BBB refused to run on anything smaller than 8GB/4core, so I scaled up to that during testing, scaled back down to 1GB/1core in between, and scaled up to 16GB/8core dedicated during the conference. ) (paragraph (:standard-properties [17816 17816 17816 18043 18044 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) I'm still not 100% sure I set everything up correctly or that everything was stable. Maybe next year BBB 3.0 will be better-tested, someone more sysad-y can doublecheck the setup, or we can try (link (:standard-properties [18010 nil 18033 18039 18041 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //galene.org/ :format bracket :raw-link https://galene.org/ :application nil :search-option nil) Galene) . ) (paragraph (:standard-properties [18044 18044 18044 18339 18340 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) One of the benefits of upgrading to BBB 3.0 was that we could use the smart layout feature to drag the webcam thumbnails to the side of the shared screen. This made shared screens much easier to read. I haven't automated this yet, but it was easy enough for us to do via the shared VNC session. ) (paragraph (:standard-properties [18340 18340 18340 18708 18709 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) On the plus side, it was pretty straightforward to use the Rails console to create all the rooms. We used moderator access codes to give all the speakers moderator access. Mysteriously, superadmins didn't automatically have moderator access to all the rooms even if they were logged in, so we needed to add host access by hand so that they could start the recordings. ) (paragraph (:standard-properties [18709 18709 18709 18969 18970 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) Since we self-hosted and were budgeting more for the full-scale node, I didn't feel comfortable scaling it up to production size until a few days before the conference. I sent the access codes with the check-in e-mails to give speakers time to try things out. ) (paragraph (:standard-properties [18970 18970 18970 19130 19131 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) (link (:standard-properties [18970 nil 19097 19126 19128 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //sachachua.com/blog/2023/12/emacsconf-backstage-figuring-out-our-maximum-number-of-simultaneous-bigbluebutton-users/ :format bracket :raw-link https://sachachua.com/blog/2023/12/emacsconf-backstage-figuring-out-our-maximum-number-of-simultaneous-bigbluebutton-users/ :application nil :search-option nil) Compared to last year's stats) : ) (table (:standard-properties [19131 19131 19131 19509 19510 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14] :type org :tblfm nil :value nil) (table-row (:standard-properties [19131 19131 19132 19184 19185 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [19132 nil 19169 19169 19170 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16])) (table-cell (:standard-properties [19170 nil 19171 19175 19177 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 2023) (table-cell (:standard-properties [19177 nil 19178 19182 19184 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 2024)) (table-row (:standard-properties [19185 19185 nil nil 19239 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type rule)) (table-row (:standard-properties [19239 19239 19240 19292 19293 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [19240 nil 19241 19273 19278 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Max number of simultaneous users) (table-cell (:standard-properties [19278 nil 19279 19281 19285 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 62) (table-cell (:standard-properties [19285 nil 19287 19290 19292 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 107)) (table-row (:standard-properties [19293 19293 19294 19346 19347 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [19294 nil 19295 19330 19332 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Max number of simultaneous meetings) (table-cell (:standard-properties [19332 nil 19333 19334 19339 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 6) (table-cell (:standard-properties [19339 nil 19343 19344 19346 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 7)) (table-row (:standard-properties [19347 19347 19348 19400 19401 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [19348 nil 19349 19384 19386 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Max number of people in one meeting) (table-cell (:standard-properties [19386 nil 19387 19389 19393 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 27) (table-cell (:standard-properties [19393 nil 19396 19398 19400 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 25)) (table-row (:standard-properties [19401 19401 19402 19454 19455 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [19402 nil 19403 19422 19440 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Total unique people) (table-cell (:standard-properties [19440 nil 19441 19443 19447 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 84) (table-cell (:standard-properties [19447 nil 19449 19452 19454 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 102)) (table-row (:standard-properties [19455 19455 19456 19508 19509 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [19456 nil 19457 19477 19494 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Total unique talking) (table-cell (:standard-properties [19494 nil 19495 19497 19501 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 36) (table-cell (:standard-properties [19501 nil 19504 19506 19508 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 40))) (paragraph (:standard-properties [19510 19510 19510 19617 19618 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) (Max number of simultaneous users wasn't deduplicated, since we need that number for server load planning) ))) (headline (:standard-properties [19618 19618 19645 20534 20534 0 (:title) nil nil nil nil 19720 20532 2 posts.org<2> nil nil #12] :pre-blank 0 :raw-value Tech checks and hosting :title (Tech checks and hosting) :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :footnote-section-p [org-element-deferred org-element--headline-footnote-section-p nil nil] :archivedp [org-element-deferred org-element--headline-archivedp nil nil] :commentedp nil :CUSTOM_ID emacsconf-2024-notes-tech-checks-and-hosting) (section (:standard-properties [19645 19645 19645 20534 20534 0 nil section nil nil nil 19645 20534 nil posts.org<2> nil nil #13]) (paragraph (:standard-properties [19722 19722 19722 19902 19903 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) FlowyCoder did a great job getting everyone checked in, especially once I figured out the right checklist to use. We used people's emergency contact information a couple of times. ) (paragraph (:standard-properties [19903 19903 19903 20265 20266 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) Corwin and Leo were able to jump in and out of the different streams for hosting. Sometimes they were both in the same Q&A session, which made it more conversational especially when they were covering for technical issues. We had a couple of crashes even though the tech checks went fine, so that was weird. Maybe something's up with BBB 3.0 or how I set it up. ) (paragraph (:standard-properties [20266 20266 20266 20533 20534 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) Next time, we can consider asking speakers what kind of facilitation style they like. A chatty host? Someone who focuses on reading the questions and then gets out of the way? Speakers reading their own questions and the host focusing on timekeeping/troubleshooting? ))) (headline (:standard-properties [20534 20534 20547 22382 22382 0 (:title) nil nil nil nil 20608 22380 2 posts.org<2> nil nil #12] :pre-blank 0 :raw-value Streaming :title (Streaming) :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :footnote-section-p [org-element-deferred org-element--headline-footnote-section-p nil nil] :archivedp [org-element-deferred org-element--headline-archivedp nil nil] :commentedp nil :CUSTOM_ID emacsconf-2024-notes-streaming) (section (:standard-properties [20547 20547 20547 22382 22382 0 nil section nil nil nil 20547 22382 nil posts.org<2> nil nil #13]) (paragraph (:standard-properties [20610 20610 20610 20809 20810 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) I experimented with setting up the live0 streaming node as a 64GB 32core dedicated CPU server, but that was overkill, so we went back down to 64GB 16core and it still didn't approach the CPU limits. ) (paragraph (:standard-properties [20810 20810 20810 21067 21068 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) The 480p stream seemed stable, hooray! I had set it up last year to automatically kick in as soon as I started streaming to Icecast, and that worked out. I think I changed a loop to be (code (:standard-properties [20995 nil nil nil 21007 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :value [org-element-deferred org-element--substring (1 11) t])) instead of making it try 5 times, so that probably helped. ) (paragraph (:standard-properties [21068 21068 21068 21447 21448 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) I couldn't get Toobnix livestreaming to work this year. On the plus side, that meant that I could use OBS to directly stream to YouTube instead of trying to set up multicasting. I set up one YouTube livestreaming event for each shift and added the RTMP keys to our shift checklists so that I could update the settings before starting the stream. That was pretty straightforward. ) (paragraph (:standard-properties [21448 21448 21448 22023 22024 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) This year, I wrote a little randomizer function to display things on the countdown screen. At first I just dumped in (link (:standard-properties [21565 nil nil nil 21620 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //www.gnu.org/fun/jokes/gnuemacs.acro.exp.en.html :format plain :raw-link https://www.gnu.org/fun/jokes/gnuemacs.acro.exp.en.html :application nil :search-option nil)) , but some of those were not quite what I was looking for. (... Probably should've read them all first!) Then I added random packages from GNU ELPA and NonGNU ELPA, and that was more fun. I might add MELPA next time too. The code for dumping random packages is probably worth putting into a different blog post, since it's the sort of thing people might like to add to their dashboards or screensavers. ) (paragraph (:standard-properties [22024 22024 22024 22164 22165 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) I ran into some C-s annoyances in screen even with flow control turned off, so it might be a good idea to switch to tmux instead of screen. ) (paragraph (:standard-properties [22165 22165 22165 22381 22382 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) Next year, I think it might be a good idea to make intro images for each talk. Then we can use that as the opening slide in BigBlueButton (unless they're already sharing something else) as well as a video thumbnail. ))) (headline (:standard-properties [22382 22382 22396 22976 22976 0 (:title) nil nil nil nil 22458 22974 2 posts.org<2> nil nil #12] :pre-blank 0 :raw-value Publishing :title (Publishing) :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :footnote-section-p [org-element-deferred org-element--headline-footnote-section-p nil nil] :archivedp [org-element-deferred org-element--headline-archivedp nil nil] :commentedp nil :CUSTOM_ID emacsconf-2024-notes-publishing) (section (:standard-properties [22396 22396 22396 22976 22976 0 nil section nil nil nil 22396 22976 nil posts.org<2> nil nil #13]) (paragraph (:standard-properties [22460 22460 22460 22704 22705 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) The automated process for publishing talks and transcripts to the wiki occasionally needed nudging when someone else had committed a change to the wiki. I thought I had a (code (:standard-properties [22631 nil nil nil 22642 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :value [org-element-deferred org-element--substring (1 9) t])) in there somewhere, but maybe I need to look at it some more. ) (paragraph (:standard-properties [22705 22705 22705 22975 22976 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) I forgot to switch the conference publishing phase and enable the inclusion of Etherpads, but fortunately Ihor noticed. I did some last-minute hacking to add them in, and then I remembered the variables I needed to set. Just need to add it to our process documentation. ))) (headline (:standard-properties [22976 22976 22988 23859 23859 0 (:title) nil nil nil nil 23048 23857 2 posts.org<2> nil nil #12] :pre-blank 0 :raw-value Etherpad :title (Etherpad) :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :footnote-section-p [org-element-deferred org-element--headline-footnote-section-p nil nil] :archivedp [org-element-deferred org-element--headline-archivedp nil nil] :commentedp nil :CUSTOM_ID emacsconf-2024-notes-etherpad) (section (:standard-properties [22988 22988 22988 23859 23859 0 nil section nil nil nil 22988 23859 nil posts.org<2> nil nil #13]) (paragraph (:standard-properties [23050 23050 23050 23296 23297 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) We used (link (:standard-properties [23058 nil 23083 23091 23094 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //etherpad.org/ :format bracket :raw-link https://etherpad.org/ :application nil :search-option nil) Etherpad) 1.9.7 to collect Q&A again this year. I didn't upgrade to Etherpad v2.x because I couldn't figure out how to get it running within the time I set aside for it, but maybe that's something for next year. ) (paragraph (:standard-properties [23297 23297 23297 23586 23587 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) I wrote some Elisp to copy the current ERC line (unwrapped) for easier pasting into Etherpad. That worked out really well, and it let me keep up with copying questions from IRC to the pad in between other bits of running around. ( (code (:standard-properties [23527 nil nil nil 23548 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :value [org-element-deferred org-element--substring (1 19) t])) in (link (:standard-properties [23551 nil nil nil 23584 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type emacsconf-el :type-explicit-p t :path emacsconf-erc.el :format bracket :raw-link emacsconf-el:emacsconf-erc.el :application nil :search-option nil)) ) ) (paragraph (:standard-properties [23587 23587 23587 23700 23701 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) Next year, I'll add pronouns and pronunciations to the Etherpad template so that hosts can refer to them easily. ) (paragraph (:standard-properties [23701 23701 23701 23858 23859 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) If I rejig the template to move the next/previous links so that notes can be added to the end, I might be able to use the Etherpad API to add text from IRC. ))) (headline (:standard-properties [23859 23859 23866 24458 24458 0 (:title) nil nil nil nil 23921 24456 2 posts.org<2> nil nil #12] :pre-blank 0 :raw-value IRC :title (IRC) :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :footnote-section-p [org-element-deferred org-element--headline-footnote-section-p nil nil] :archivedp [org-element-deferred org-element--headline-archivedp nil nil] :commentedp nil :CUSTOM_ID emacsconf-2024-notes-irc) (section (:standard-properties [23866 23866 23866 24458 24458 0 nil section nil nil nil 23866 24458 nil posts.org<2> nil nil #13]) (paragraph (:standard-properties [23923 23923 23923 24074 24075 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) We remembered to give the libera.chat people a heads-up before the conference, so we didn't run into usage limits for (link (:standard-properties [24041 nil nil nil 24067 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //chat.emacsconf.org :format plain :raw-link https://chat.emacsconf.org :application nil :search-option nil)) . Yay! ) (paragraph (:standard-properties [24075 24075 24075 24332 24333 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) Aside from writing (code (:standard-properties [24094 nil nil nil 24114 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :value [org-element-deferred org-element--substring (1 19) t])) ( (link (:standard-properties [24116 nil 24149 24165 24167 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type emacsconf-el :type-explicit-p t :path emacsconf-erc.el :format bracket :raw-link emacsconf-el:emacsconf-erc.el :application nil :search-option nil) emacsconf-erc.el) ) to make it easier to add text from IRC to the Etherpad, I didn't tinker much with the IRC setup for this year. It continued to be a solid platform for discussion. ) (paragraph (:standard-properties [24333 24333 24333 24457 24458 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) I think a keyboard shortcut for inserting a talk's URL could be handy and should be pretty easy to add to my Embark keymap. ))) (headline (:standard-properties [24458 24458 24480 26746 26746 0 (:title) nil nil nil nil 24550 26744 2 posts.org<2> nil nil #12] :pre-blank 0 :raw-value Extracting the Q&A :title (Extracting the Q&A) :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :footnote-section-p [org-element-deferred org-element--headline-footnote-section-p nil nil] :archivedp [org-element-deferred org-element--headline-archivedp nil nil] :commentedp nil :CUSTOM_ID emacsconf-2024-notes-extracting-the-q-a) (section (:standard-properties [24480 24480 24480 26746 26746 0 nil section nil nil nil 24480 26746 nil posts.org<2> nil nil #13]) (paragraph (:standard-properties [24552 24552 24552 24861 24862 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) We sometimes forgot to start the recording for the Q&A until a few minutes into the talk. I considered extracting the Q&A recordings from the Icecast dump or YouTube stream recordings in order to get those first few minutes, but decided it wasn't worth it since people could generally figure out the answers. ) (paragraph (:standard-properties [24862 24862 24862 25203 25204 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) Getting the recordings off BigBlueButton was easier this year because I configured it with (link (:standard-properties [24953 nil 25065 25105 25107 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //docs.bigbluebutton.org/3.0/administration/customize/#install-additional-recording-processing-formats :format bracket :raw-link https://docs.bigbluebutton.org/3.0/administration/customize/#install-additional-recording-processing-formats :application nil :search-option nil) video as an additional processing format) , so we could grab one file per session instead of combining the different streams with ffmpeg. ) (paragraph (:standard-properties [25204 25204 25204 25490 25491 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) I did a quick pass of the Q&A transcripts and chat logs to see if people mentioned anything that they might want to take out. I also copied IRC messages and the pads, and I copied over the answers from the transcripts using the new (code (:standard-properties [25436 nil nil nil 25479 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :value [org-element-deferred org-element--substring (1 42) t])) function. ) (paragraph (:standard-properties [25491 25491 25491 25905 25906 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) Audio mixing was uneven. It might be nice to figure out separate audio recordings just in case ( (link (:standard-properties [25587 nil 25650 25656 25658 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //github.com/bigbluebutton/bigbluebutton/issues/12302 :format bracket :raw-link https://github.com/bigbluebutton/bigbluebutton/issues/12302 :application nil :search-option nil) #12302) , (link (:standard-properties [25660 nil 25723 25740 25742 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //groups.google.com/g/bigbluebutton-dev/c/oPzJy0mKOrw :format bracket :raw-link https://groups.google.com/g/bigbluebutton-dev/c/oPzJy0mKOrw :application nil :search-option nil) bigbluebutton-dev) ). We ended up not tinkering with the audio for the Q&A, so next time, I can probably upload them without waiting to see if anyone wants to fiddle with the audio. ) (paragraph (:standard-properties [25906 25906 25906 26073 26074 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) Trimming the Q&A was pretty straightforward. I added a (code (:standard-properties [25961 nil nil nil 25985 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :value [org-element-deferred org-element--substring (1 22) t])) function to (link (:standard-properties [25997 nil 26032 26037 26039 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //github.com/sachac/subed :format bracket :raw-link https://github.com/sachac/subed :application nil :search-option nil) subed) so that I can trim files easily. ) (paragraph (:standard-properties [26074 26074 26074 26252 26253 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) Thanks to my completion functions for adding section headings based on comments, it was easy to index the Q&A this year. I didn't even put it up backstage for people to work on. ) (paragraph (:standard-properties [26253 26253 26253 26511 26512 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) Nudged by (link (:standard-properties [26263 nil 26318 26326 26328 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //mastodon.social/@ctietze/113627423761735937 :format bracket :raw-link https://mastodon.social/@ctietze/113627423761735937 :application nil :search-option nil) @ctietze) , I'm experimenting with adding sticky videos if Javascript is enabled so that it's easier to navigate using the transcript. There's still a bit of tinkering to do, but it's a start. ) (paragraph (:standard-properties [26512 26512 26512 26745 26746 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) I added some conference-related variables to a (code (:standard-properties [26559 nil nil nil 26576 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :value [org-element-deferred org-element--substring (1 15) t])) file so that I can more easily update things even for past conferences. This is mostly related to publishing the captions on the wiki pages, which I do with Emacs Lisp. ))) (headline (:standard-properties [26746 26746 26770 27572 27572 0 (:title) nil nil nil nil 26842 27570 2 posts.org<2> nil nil #12] :pre-blank 0 :raw-value Budget and donations :title (Budget and donations) :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :footnote-section-p [org-element-deferred org-element--headline-footnote-section-p nil nil] :archivedp [org-element-deferred org-element--headline-archivedp nil nil] :commentedp nil :CUSTOM_ID emacsconf-2024-notes-budget-and-donations) (section (:standard-properties [26770 26770 26770 27572 27572 0 nil section nil nil nil 26770 27572 nil posts.org<2> nil nil #13]) (paragraph (:standard-properties [26844 26844 26844 26880 26881 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) Costs (USD, not including 13% tax): ) (table (:standard-properties [26881 26881 26881 27055 27056 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14] :type org :tblfm nil :value nil) (table-row (:standard-properties [26881 26881 26882 26938 26939 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [26882 nil 26883 26888 26890 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 52.54) (table-cell (:standard-properties [26890 nil 26891 26926 26938 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Extra costs for hosting in December)) (table-row (:standard-properties [26939 26939 26940 26996 26997 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [26940 nil 26942 26946 26948 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 3.11) (table-cell (:standard-properties [26948 nil 26949 26988 26996 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Extra costs for BBB testing in November)) (table-row (:standard-properties [26997 26997 26998 27054 27055 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [26998 nil 27001 27004 27006 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 120) (table-cell (:standard-properties [27006 nil 27007 27052 27054 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Hosting costs year-round (two Linode nanodes)))) (paragraph (:standard-properties [27056 27056 27056 27107 27108 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) Total of USD 175.65 + tax, or USD 198.48 for 2024. ) (paragraph (:standard-properties [27108 27108 27108 27298 27299 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) The Free Software Foundation also provided (link (:standard-properties [27151 nil 27182 27201 27204 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //media.emacsconf.org :format bracket :raw-link https://media.emacsconf.org :application nil :search-option nil) media.emacsconf.org) for serving media files. Ry P provided res.emacsconf.org for OBS streaming over VNC sessions. ) (paragraph (:standard-properties [27299 27299 27299 27571 27572 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) Amin Bandali was away during the conference weekend and no one else knew how to get the list of donors and current donation stats from the FSF Working Together program on short notice. Next time, we can get that sorted out beforehand so that we can thank donors properly. ))) (headline (:standard-properties [27572 27572 27598 30144 30144 0 (:title) nil nil nil nil 27672 30142 2 posts.org<2> nil nil #12] :pre-blank 0 :raw-value Documentation and time :title (Documentation and time) :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :footnote-section-p [org-element-deferred org-element--headline-footnote-section-p nil nil] :archivedp [org-element-deferred org-element--headline-archivedp nil nil] :commentedp nil :CUSTOM_ID emacsconf-2024-notes-documentation-and-time) (section (:standard-properties [27598 27598 27598 30144 30144 0 nil section nil nil nil 27598 30144 nil posts.org<2> nil nil #13]) (paragraph (:standard-properties [27674 27674 27674 27959 27960 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) I think my biggest challenge was having less time to prepare for EmacsConf this year because the kiddo wanted more of my attention. In many ways, the automation that I'd been gradually building up paid off. We were able to pull together EmacsConf even though I had limited focus time. ) (paragraph (:standard-properties [27960 27960 27960 28041 28042 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) Here's my Emacs-related time data (including Emacs News and tweaking my config): ) (table (:standard-properties [28042 28042 28042 28466 28467 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14] :type org :tblfm nil :value nil) (table-row (:standard-properties [28042 28042 28043 28147 28148 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [28043 nil 28044 28048 28050 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Year) (table-cell (:standard-properties [28050 nil 28052 28055 28057 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Jan) (table-cell (:standard-properties [28057 nil 28059 28062 28064 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Feb) (table-cell (:standard-properties [28064 nil 28065 28070 28072 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) March) (table-cell (:standard-properties [28072 nil 28073 28078 28080 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) April) (table-cell (:standard-properties [28080 nil 28082 28085 28087 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) May) (table-cell (:standard-properties [28087 nil 28088 28092 28094 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) June) (table-cell (:standard-properties [28094 nil 28095 28099 28101 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) July) (table-cell (:standard-properties [28101 nil 28103 28106 28108 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Aug) (table-cell (:standard-properties [28108 nil 28109 28113 28115 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Sept) (table-cell (:standard-properties [28115 nil 28118 28121 28123 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Oct) (table-cell (:standard-properties [28123 nil 28126 28129 28131 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Nov) (table-cell (:standard-properties [28131 nil 28134 28137 28139 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Dec) (table-cell (:standard-properties [28139 nil 28140 28145 28147 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Total)) (table-row (:standard-properties [28148 28148 nil nil 28254 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type rule)) (table-row (:standard-properties [28254 28254 28255 28359 28360 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [28255 nil 28256 28260 28262 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 2023) (table-cell (:standard-properties [28262 nil 28263 28267 28269 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 23.4) (table-cell (:standard-properties [28269 nil 28270 28274 28276 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 15.9) (table-cell (:standard-properties [28276 nil 28278 28282 28284 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 16.2) (table-cell (:standard-properties [28284 nil 28286 28290 28292 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 11.2) (table-cell (:standard-properties [28292 nil 28294 28297 28299 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 4.4) (table-cell (:standard-properties [28299 nil 28300 28304 28306 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 11.5) (table-cell (:standard-properties [28306 nil 28308 28311 28313 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 6.5) (table-cell (:standard-properties [28313 nil 28314 28318 28320 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 13.3) (table-cell (:standard-properties [28320 nil 28321 28325 28327 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 36.6) (table-cell (:standard-properties [28327 nil 28329 28333 28335 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 86.6) (table-cell (:standard-properties [28335 nil 28337 28341 28343 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 93.2) (table-cell (:standard-properties [28343 nil 28344 28349 28351 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 113.0) (table-cell (:standard-properties [28351 nil 28354 28357 28359 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 432)) (table-row (:standard-properties [28360 28360 28361 28465 28466 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [28361 nil 28362 28366 28368 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 2024) (table-cell (:standard-properties [28368 nil 28369 28373 28375 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 71.2) (table-cell (:standard-properties [28375 nil 28376 28380 28382 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 12.0) (table-cell (:standard-properties [28382 nil 28385 28388 28390 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 5.6) (table-cell (:standard-properties [28390 nil 28393 28396 28398 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 6.6) (table-cell (:standard-properties [28398 nil 28400 28403 28405 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 3.3) (table-cell (:standard-properties [28405 nil 28407 28410 28412 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 9.6) (table-cell (:standard-properties [28412 nil 28413 28417 28419 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 11.0) (table-cell (:standard-properties [28419 nil 28421 28424 28426 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 4.7) (table-cell (:standard-properties [28426 nil 28427 28431 28433 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 36.0) (table-cell (:standard-properties [28433 nil 28435 28439 28441 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 40.3) (table-cell (:standard-properties [28441 nil 28443 28447 28449 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 52.3) (table-cell (:standard-properties [28449 nil 28451 28455 28457 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 67.7) (table-cell (:standard-properties [28457 nil 28460 28463 28465 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 320))) (paragraph (:standard-properties [28467 28467 28467 28617 28618 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) (and here's a (link (:standard-properties [28481 nil 28573 28612 28614 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //sachachua.com/blog/2023/12/analyzing-my-emacs-time-over-the-last-11-years-or-so/ :format bracket :raw-link https://sachachua.com/blog/2023/12/analyzing-my-emacs-time-over-the-last-11-years-or-so/ :application nil :search-option nil) longer-term analysis going back to 2012) .) ) (paragraph (:standard-properties [28618 28618 28618 29188 29189 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) I spent 92.6 hours total in October and November 2024 doing Emacs-related things, compared to 179.8 hours the previous year -- so, around half the time. Part of the 2023 total was related to preparing my presentation for EmacsConf, so I was much more familiar with my scripts then. Apparently, there was still a lot more that I needed to document. As I scrambled to get EmacsConf sorted out, I captured quick tasks/notes for the things I need to add to our organizers notebook. Now I get to go through all those notes in my inbox. Maybe next year will be even smoother. ) (paragraph (:standard-properties [29189 29189 29189 29713 29714 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) On the plus side, all the process-related improvements meant that the other volunteers could jump in pretty much whenever they wanted, including during the conference itself. I didn't want to impose firm commitments on people or bug them too much by e-mail, so we kept things very chill in terms of scheduling and planning. If people were available, we had stuff people could help with. If people were busy, that was fine, we could manage. This was nice, especially when I applied the same sort of chill approach to myself. ) (paragraph (:standard-properties [29714 29714 29714 30143 30144 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) I'd like to eventually get to the point of being able to mostly follow my checklists and notes from the start of the conference planning process to the end. I've been moving notes from year-specific organizer notebooks to the main (link (:standard-properties [29945 nil 29991 30011 30013 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //emacsconf.org/organizers-notebook/ :format bracket :raw-link https://emacsconf.org/organizers-notebook/ :application nil :search-option nil) organizers' notebook) . I plan to keep that one as the main file for notes and processes, and then to have specific dates and notes in the yearly ones. ))) (headline (:standard-properties [30144 30144 30155 31757 31757 0 (:title) nil nil nil nil 30157 31755 2 posts.org<2> nil nil #12] :pre-blank 1 :raw-value Thanks :title (Thanks) :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :footnote-section-p [org-element-deferred org-element--headline-footnote-section-p nil nil] :archivedp [org-element-deferred org-element--headline-archivedp nil nil] :commentedp nil) (section (:standard-properties [30155 30155 30155 31757 31757 0 nil section nil nil nil 30155 31757 nil posts.org<2> nil nil #13]) (plain-list (:standard-properties [30155 30155 30155 31756 31757 1 nil planning nil nil nil nil nil nil posts.org<2> nil ((30155 0 - nil nil nil 30308) (30308 0 - nil nil nil 30416) (30416 0 - nil nil nil 30542) (30542 0 - nil nil nil 30692) (30692 0 - nil nil nil 30772) (30772 0 - nil nil nil 30838) (30838 0 - nil nil nil 30936) (30936 0 - nil nil nil 30971) (30971 0 - nil nil nil 31044) (31044 0 - nil nil nil 31138) (31138 0 - nil nil nil 31369) (31369 0 - nil nil nil 31734) (31734 0 - nil nil nil 31756)) #14] :type unordered) (item (:standard-properties [30155 30155 30157 30308 30308 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((30155 0 - nil nil nil 30308) (30308 0 - nil nil nil 30416) (30416 0 - nil nil nil 30542) (30542 0 - nil nil nil 30692) (30692 0 - nil nil nil 30772) (30772 0 - nil nil nil 30838) (30838 0 - nil nil nil 30936) (30936 0 - nil nil nil 30971) (30971 0 - nil nil nil 31044) (31044 0 - nil nil nil 31138) (31138 0 - nil nil nil 31369) (31369 0 - nil nil nil 31734) (31734 0 - nil nil nil 31756)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [30157 30157 30157 30308 30308 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Thank you to all the speakers, volunteers, and participants, and to all those other people in our lives who make it possible through time and support. )) (item (:standard-properties [30308 30308 30310 30416 30416 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((30155 0 - nil nil nil 30308) (30308 0 - nil nil nil 30416) (30416 0 - nil nil nil 30542) (30542 0 - nil nil nil 30692) (30692 0 - nil nil nil 30772) (30772 0 - nil nil nil 30838) (30838 0 - nil nil nil 30936) (30936 0 - nil nil nil 30971) (30971 0 - nil nil nil 31044) (31044 0 - nil nil nil 31138) (31138 0 - nil nil nil 31369) (31369 0 - nil nil nil 31734) (31734 0 - nil nil nil 31756)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [30310 30310 30310 30416 30416 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Thanks to Leo Vivier and Corwin Brust for hosting the sessions, and to FlowyCoder for checking people in. )) (item (:standard-properties [30416 30416 30418 30542 30542 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((30155 0 - nil nil nil 30308) (30308 0 - nil nil nil 30416) (30416 0 - nil nil nil 30542) (30542 0 - nil nil nil 30692) (30692 0 - nil nil nil 30772) (30772 0 - nil nil nil 30838) (30838 0 - nil nil nil 30936) (30936 0 - nil nil nil 30971) (30971 0 - nil nil nil 31044) (31044 0 - nil nil nil 31138) (31138 0 - nil nil nil 31369) (31369 0 - nil nil nil 31734) (31734 0 - nil nil nil 31756)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [30418 30418 30418 30542 30542 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Thanks to our proposal review volunteers James Howell, JC Helary, and others for helping with the early acceptance process. )) (item (:standard-properties [30542 30542 30544 30692 30692 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((30155 0 - nil nil nil 30308) (30308 0 - nil nil nil 30416) (30416 0 - nil nil nil 30542) (30542 0 - nil nil nil 30692) (30692 0 - nil nil nil 30772) (30772 0 - nil nil nil 30838) (30838 0 - nil nil nil 30936) (30936 0 - nil nil nil 30971) (30971 0 - nil nil nil 31044) (31044 0 - nil nil nil 31138) (31138 0 - nil nil nil 31369) (31369 0 - nil nil nil 31734) (31734 0 - nil nil nil 31756)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [30544 30544 30544 30692 30692 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Thanks to our captioning volunteers: Mark Lewin, Rodrigo Morales, Anush, annona, and James Howell, and some speakers who captioned their own talks. )) (item (:standard-properties [30692 30692 30694 30772 30772 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((30155 0 - nil nil nil 30308) (30308 0 - nil nil nil 30416) (30416 0 - nil nil nil 30542) (30542 0 - nil nil nil 30692) (30692 0 - nil nil nil 30772) (30772 0 - nil nil nil 30838) (30838 0 - nil nil nil 30936) (30936 0 - nil nil nil 30971) (30971 0 - nil nil nil 31044) (31044 0 - nil nil nil 31138) (31138 0 - nil nil nil 31369) (31369 0 - nil nil nil 31734) (31734 0 - nil nil nil 31756)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [30694 30694 30694 30772 30772 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Thanks to Leo Vivier for fiddling with the audio to get things nicely synced. )) (item (:standard-properties [30772 30772 30774 30838 30838 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((30155 0 - nil nil nil 30308) (30308 0 - nil nil nil 30416) (30416 0 - nil nil nil 30542) (30542 0 - nil nil nil 30692) (30692 0 - nil nil nil 30772) (30772 0 - nil nil nil 30838) (30838 0 - nil nil nil 30936) (30936 0 - nil nil nil 30971) (30971 0 - nil nil nil 31044) (31044 0 - nil nil nil 31138) (31138 0 - nil nil nil 31369) (31369 0 - nil nil nil 31734) (31734 0 - nil nil nil 31756)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [30774 30774 30774 30838 30838 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Thanks to volunteers who kept the mailing lists free from spam. )) (item (:standard-properties [30838 30838 30840 30936 30936 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((30155 0 - nil nil nil 30308) (30308 0 - nil nil nil 30416) (30416 0 - nil nil nil 30542) (30542 0 - nil nil nil 30692) (30692 0 - nil nil nil 30772) (30772 0 - nil nil nil 30838) (30838 0 - nil nil nil 30936) (30936 0 - nil nil nil 30971) (30971 0 - nil nil nil 31044) (31044 0 - nil nil nil 31138) (31138 0 - nil nil nil 31369) (31369 0 - nil nil nil 31734) (31734 0 - nil nil nil 31756)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [30840 30840 30840 30936 30936 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Thanks to Bhavin Gandhi, Christopher Howard, Joseph Turner, and screwlisp for quality-checking. )) (item (:standard-properties [30936 30936 30938 30971 30971 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((30155 0 - nil nil nil 30308) (30308 0 - nil nil nil 30416) (30416 0 - nil nil nil 30542) (30542 0 - nil nil nil 30692) (30692 0 - nil nil nil 30772) (30772 0 - nil nil nil 30838) (30838 0 - nil nil nil 30936) (30936 0 - nil nil nil 30971) (30971 0 - nil nil nil 31044) (31044 0 - nil nil nil 31138) (31138 0 - nil nil nil 31369) (31369 0 - nil nil nil 31734) (31734 0 - nil nil nil 31756)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [30938 30938 30938 30971 30971 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Thanks to shoshin for the music. )) (item (:standard-properties [30971 30971 30973 31044 31044 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((30155 0 - nil nil nil 30308) (30308 0 - nil nil nil 30416) (30416 0 - nil nil nil 30542) (30542 0 - nil nil nil 30692) (30692 0 - nil nil nil 30772) (30772 0 - nil nil nil 30838) (30838 0 - nil nil nil 30936) (30936 0 - nil nil nil 30971) (30971 0 - nil nil nil 31044) (31044 0 - nil nil nil 31138) (31138 0 - nil nil nil 31369) (31369 0 - nil nil nil 31734) (31734 0 - nil nil nil 31756)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [30973 30973 30973 31044 31044 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Thanks to Amin Bandali for help with infrastructure and communication. )) (item (:standard-properties [31044 31044 31046 31138 31138 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((30155 0 - nil nil nil 30308) (30308 0 - nil nil nil 30416) (30416 0 - nil nil nil 30542) (30542 0 - nil nil nil 30692) (30692 0 - nil nil nil 30772) (30772 0 - nil nil nil 30838) (30838 0 - nil nil nil 30936) (30936 0 - nil nil nil 30971) (30971 0 - nil nil nil 31044) (31044 0 - nil nil nil 31138) (31138 0 - nil nil nil 31369) (31369 0 - nil nil nil 31734) (31734 0 - nil nil nil 31756)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [31046 31046 31046 31138 31138 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Thanks to Ry P for the server that we're using for OBS streaming and for processing videos. )) (item (:standard-properties [31138 31138 31140 31369 31369 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((30155 0 - nil nil nil 30308) (30308 0 - nil nil nil 30416) (30416 0 - nil nil nil 30542) (30542 0 - nil nil nil 30692) (30692 0 - nil nil nil 30772) (30772 0 - nil nil nil 30838) (30838 0 - nil nil nil 30936) (30936 0 - nil nil nil 30971) (30971 0 - nil nil nil 31044) (31044 0 - nil nil nil 31138) (31138 0 - nil nil nil 31369) (31369 0 - nil nil nil 31734) (31734 0 - nil nil nil 31756)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [31140 31140 31140 31369 31369 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Thanks to the Free Software Foundation for Emacs itself, the mailing lists, the media.emacsconf.org server, and handling donations on our behalf through the FSF Working Together program. (link (:standard-properties [31327 nil nil nil 31368 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #17] :type https :type-explicit-p t :path //www.fsf.org/working-together/fund :format plain :raw-link https://www.fsf.org/working-together/fund :application nil :search-option nil)) )) (item (:standard-properties [31369 31369 31371 31734 31734 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((30155 0 - nil nil nil 30308) (30308 0 - nil nil nil 30416) (30416 0 - nil nil nil 30542) (30542 0 - nil nil nil 30692) (30692 0 - nil nil nil 30772) (30772 0 - nil nil nil 30838) (30838 0 - nil nil nil 30936) (30936 0 - nil nil nil 30971) (30971 0 - nil nil nil 31044) (31044 0 - nil nil nil 31138) (31138 0 - nil nil nil 31369) (31369 0 - nil nil nil 31734) (31734 0 - nil nil nil 31756)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [31371 31371 31371 31734 31734 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Thanks to the many users and contributers and project teams that create all the awesome free software we use, especially: BigBlueButton, Etherpad, Icecast, OBS, TheLounge, libera.chat, ffmpeg, OpenAI Whisper, WhisperX, the aeneas forced alignment tool, PsiTransfer, subed, and many, many other tools and services we used to prepare and host this years conference )) (item (:standard-properties [31734 31734 31736 31756 31756 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((30155 0 - nil nil nil 30308) (30308 0 - nil nil nil 30416) (30416 0 - nil nil nil 30542) (30542 0 - nil nil nil 30692) (30692 0 - nil nil nil 30772) (30772 0 - nil nil nil 30838) (30838 0 - nil nil nil 30936) (30936 0 - nil nil nil 30971) (30971 0 - nil nil nil 31044) (31044 0 - nil nil nil 31138) (31138 0 - nil nil nil 31369) (31369 0 - nil nil nil 31734) (31734 0 - nil nil nil 31756)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [31736 31736 31736 31756 31756 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Thanks to everyone! ))))) (headline (:standard-properties [31757 31757 31768 32989 32989 0 (:title) nil nil nil nil 31827 32987 2 posts.org<2> nil nil #12] :pre-blank 0 :raw-value Overall :title (Overall) :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :footnote-section-p [org-element-deferred org-element--headline-footnote-section-p nil nil] :archivedp [org-element-deferred org-element--headline-archivedp nil nil] :commentedp nil :CUSTOM_ID emacsconf-2024-notes-overall) (section (:standard-properties [31768 31768 31768 32989 32989 0 nil section nil nil nil 31768 32989 nil posts.org<2> nil nil #13]) (paragraph (:standard-properties [31829 31829 31829 32047 32048 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) Good experience. Lots of fun. I'd love to do it again next year. EmacsConf feels like a nice, cozy get-together where people share the cool things they've been working on and thinking about. People had fun! They said: ) (plain-list (:standard-properties [32048 32048 32048 32329 32330 1 nil nil nil nil nil nil nil nil posts.org<2> nil ((32048 0 - nil nil nil 32142) (32142 0 - nil nil nil 32228) (32228 0 - nil nil nil 32329)) #14] :type unordered) (item (:standard-properties [32048 32048 32050 32142 32142 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((32048 0 - nil nil nil 32142) (32142 0 - nil nil nil 32228) (32228 0 - nil nil nil 32329)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [32050 32050 32050 32142 32142 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) "emacsconf is absolutely knocking it out of the park when it comes to conference logistics" )) (item (:standard-properties [32142 32142 32144 32228 32228 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((32048 0 - nil nil nil 32142) (32142 0 - nil nil nil 32228) (32228 0 - nil nil nil 32329)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [32144 32144 32144 32228 32228 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) "I think this conference has defined the terms for a successful online conference." )) (item (:standard-properties [32228 32228 32230 32329 32329 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((32048 0 - nil nil nil 32142) (32142 0 - nil nil nil 32228) (32228 0 - nil nil nil 32329)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [32230 32230 32230 32329 32329 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) "EmacsConf is one of the big highlights of my year every year. Thank you a ton for running this 😊" ))) (paragraph (:standard-properties [32330 32330 32330 32409 32410 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) It's one of the highlights of my year too. =) Looking forward to the next one! ) (paragraph (:standard-properties [32410 32410 32410 32685 32686 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) In the meantime, y'all can stay connected via (link (:standard-properties [32456 nil 32507 32517 32519 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //sachachua.com/blog/category/emacs-news/ :format bracket :raw-link https://sachachua.com/blog/category/emacs-news/ :application nil :search-option nil) Emacs News) , (link (:standard-properties [32521 nil 32550 32580 32582 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //emacs-berlin.org/ :format bracket :raw-link https://emacs-berlin.org/ :application nil :search-option nil) meetups (online and in person)) , (link (:standard-properties [32584 nil 32617 32633 32635 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //planet.emacslife.com/ :format bracket :raw-link https://planet.emacslife.com/ :application nil :search-option nil) Planet Emacslife) , and now (link (:standard-properties [32645 nil 32666 32674 32676 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //emacs.tv/ :format bracket :raw-link https://emacs.tv/ :application nil :search-option nil) emacs.tv) . Enjoy! ) (paragraph (:standard-properties [32686 32686 32686 32989 32989 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) p.s. I'd love to learn from other people's conference blog posts, EmacsConf or otherwise. I'm particularly interested in virtual conferences and how we can tinker with them to make them even better. I'm having a hard time finding posts; please feel free to send me links to ones you've liked or written!))))] :pre-blank 0 :raw-value Communication :title (Communication) :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :footnote-section-p [org-element-deferred org-element--headline-footnote-section-p nil nil] :archivedp [org-element-deferred org-element--headline-archivedp nil nil] :commentedp nil :CUSTOM_ID emacsconf-2024-notes-communication) #6)]) (paragraph (:standard-properties [5250 5250 5250 6764 6765 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #6]) As usual, we announced the EmacsConf call for proposals on (link (:standard-properties [5309 nil 5384 5398 5400 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #7] :type https :type-explicit-p t :path //lists.gnu.org/archive/html/emacs-tangents/2024-06/msg00004.html :format bracket :raw-link https://lists.gnu.org/archive/html/emacs-tangents/2024-06/msg00004.html :application nil :search-option nil) emacs-tangents) , (link (:standard-properties [5402 nil 5463 5473 5475 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #7] :type https :type-explicit-p t :path //sachachua.com/blog/2024/07/2024-07-01-emacs-news/ :format bracket :raw-link https://sachachua.com/blog/2024/07/2024-07-01-emacs-news/ :application nil :search-option nil) Emacs News) , (link (:standard-properties [5477 nil 5537 5554 5556 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #7] :type https :type-explicit-p t :path //lists.gnu.org/mailman/listinfo/emacsconf-discuss :format bracket :raw-link https://lists.gnu.org/mailman/listinfo/emacsconf-discuss :application nil :search-option nil) emacsconf-discuss) , (link (:standard-properties [5558 nil 5632 5645 5647 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #7] :type https :type-explicit-p t :path //lists.gnu.org/archive/html/emacsconf-org/2024-06/msg00000.html :format bracket :raw-link https://lists.gnu.org/archive/html/emacsconf-org/2024-06/msg00000.html :application nil :search-option nil) emacsconf-org) , (link (:standard-properties [5649 nil nil nil 5675 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #7] :type https :type-explicit-p t :path //reddit.com/r/emacs :format plain :raw-link https://reddit.com/r/emacs :application nil :search-option nil)) . (link (:standard-properties [5677 nil 5734 5749 5751 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #7] :type https :type-explicit-p t :path //systemcrafters.net/live-streams/july-12-2024/ :format bracket :raw-link https://systemcrafters.net/live-streams/july-12-2024/ :application nil :search-option nil) System Crafters) , (link (:standard-properties [5753 nil 5789 5795 5797 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #7] :type https :type-explicit-p t :path //irreal.org/blog/?p=12280 :format bracket :raw-link https://irreal.org/blog/?p=12280 :application nil :search-option nil) Irreal) , and (link (:standard-properties [5803 nil 5864 5874 5876 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #7] :type https :type-explicit-p t :path //emacs-apac.gitlab.io/announcements/november-2024/ :format bracket :raw-link https://emacs-apac.gitlab.io/announcements/november-2024/ :application nil :search-option nil) Emacs APAC) , mentioned it, and people also posted about EmacsConf on (link (:standard-properties [5934 nil 5976 5984 5986 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #7] :type https :type-explicit-p t :path //mastodon.social/tags/emacsconf :format bracket :raw-link https://mastodon.social/tags/emacsconf :application nil :search-option nil) Mastodon) , (link (:standard-properties [5988 nil 6050 6051 6053 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #7] :type https :type-explicit-p t :path //x.com/search?q=%23emacsconf&src=typed_query&f=live :format bracket :raw-link https://x.com/search?q=%23emacsconf&src=typed_query&f=live :application nil :search-option nil) X) , (link (:standard-properties [6055 nil 6093 6100 6102 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #7] :type https :type-explicit-p t :path //bsky.app/hashtag/emacsconf :format bracket :raw-link https://bsky.app/hashtag/emacsconf :application nil :search-option nil) BlueSky) , and (link (:standard-properties [6108 nil 6197 6205 6207 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #7] :type https :type-explicit-p t :path //www.facebook.com/story.php?story_fbid=538504738701826&id=100076269125316&_rdr :format bracket :raw-link https://www.facebook.com/story.php?story_fbid=538504738701826&id=100076269125316&_rdr :application nil :search-option nil) Facebook) . (link (:standard-properties [6209 nil 6252 6274 6276 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #7] :type https :type-explicit-p t :path //toot.si/@len/113392360015917614 :format bracket :raw-link https://toot.si/@len/113392360015917614 :application nil :search-option nil) @len@toot.si suggested) submitting EmacsConf to (link (:standard-properties [6301 nil nil nil 6320 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #7] :type https :type-explicit-p t :path //foss.events :format plain :raw-link https://foss.events :application nil :search-option nil)) , so I did. There was some other (link (:standard-properties [6353 nil 6452 6481 6484 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #7] :type https :type-explicit-p t :path //www.reddit.com/r/emacs/comments/1h5c778/which_emacsconf_2024_talks_have_your_attention/ :format bracket :raw-link https://www.reddit.com/r/emacs/comments/1h5c778/which_emacsconf_2024_talks_have_your_attention/ :application nil :search-option nil) EmacsConf-related discussions) in r/emacs. (link (:standard-properties [6496 nil 6585 6600 6603 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #7] :type https :type-explicit-p t :path //200ok.ch/posts/2024-09-16_announcing_emacsconf__official_swiss_satellite.html :format bracket :raw-link https://200ok.ch/posts/2024-09-16_announcing_emacsconf__official_swiss_satellite.html :application nil :search-option nil) 200ok and Ardeo) organized an in-person meetup in Switzerland, and (link (:standard-properties [6653 nil 6726 6760 6762 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #7] :type https :type-explicit-p t :path //dogodki.kompot.si/events/00a6f9ee-9087-400d-9d9b-d51b98561424 :format bracket :raw-link https://dogodki.kompot.si/events/00a6f9ee-9087-400d-9d9b-d51b98561424 :application nil :search-option nil) emacs.si got together in Ljubljana) . ) #3 (paragraph (:standard-properties [7078 7078 7078 7164 7165 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #6]) Next time, I think it could be interesting to add more blog posts and Mastodon toots. ) (paragraph (:standard-properties [7165 7165 7165 7229 7230 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #6]) Also, maybe it would be good to get in touch with podcasts like ) (plain-list (:standard-properties [7230 7230 7230 7571 7572 1 nil nil nil nil nil nil nil nil posts.org<2> nil ((7230 0 - nil nil nil 7281) (7281 0 - nil nil nil 7380) (7380 0 - nil nil nil 7431) (7431 0 - nil nil nil 7471) (7471 0 - nil nil nil 7523) (7523 0 - nil nil nil 7571)) #6] :type unordered) (item (:standard-properties [7230 7230 7232 7281 7281 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((7230 0 - nil nil nil 7281) (7281 0 - nil nil nil 7380) (7380 0 - nil nil nil 7431) (7431 0 - nil nil nil 7471) (7471 0 - nil nil nil 7523) (7523 0 - nil nil nil 7571)) #7] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [7232 7232 7232 7281 7281 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #8]) (link (:standard-properties [7232 nil 7263 7278 7280 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #9] :type https :type-explicit-p t :path //systemcrafters.net/ :format bracket :raw-link https://systemcrafters.net/ :application nil :search-option nil) System Crafters) )) (item (:standard-properties [7281 7281 7283 7380 7380 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((7230 0 - nil nil nil 7281) (7281 0 - nil nil nil 7380) (7380 0 - nil nil nil 7431) (7431 0 - nil nil nil 7471) (7471 0 - nil nil nil 7523) (7523 0 - nil nil nil 7571)) #7] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [7283 7283 7283 7380 7380 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #8]) (link (:standard-properties [7283 nil 7359 7377 7379 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #9] :type https :type-explicit-p t :path //www.youtube.com/playlist?list=PLbFVcOQ-YH_LRP687N0YeN78YZmBp5wqF :format bracket :raw-link https://www.youtube.com/playlist?list=PLbFVcOQ-YH_LRP687N0YeN78YZmBp5wqF :application nil :search-option nil) This Week in Linux) )) (item (:standard-properties [7380 7380 7382 7431 7431 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((7230 0 - nil nil nil 7281) (7281 0 - nil nil nil 7380) (7380 0 - nil nil nil 7431) (7431 0 - nil nil nil 7471) (7471 0 - nil nil nil 7523) (7523 0 - nil nil nil 7571)) #7] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [7382 7382 7382 7431 7431 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #8]) (link (:standard-properties [7382 nil 7413 7428 7430 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #9] :type https :type-explicit-p t :path //linuxunplugged.com/ :format bracket :raw-link https://linuxunplugged.com/ :application nil :search-option nil) Linux Unplugged) )) (item (:standard-properties [7431 7431 7433 7471 7471 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((7230 0 - nil nil nil 7281) (7281 0 - nil nil nil 7380) (7380 0 - nil nil nil 7431) (7431 0 - nil nil nil 7471) (7471 0 - nil nil nil 7523) (7523 0 - nil nil nil 7571)) #7] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [7433 7433 7433 7471 7471 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #8]) (link (:standard-properties [7433 nil 7460 7468 7470 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #9] :type http :type-explicit-p t :path //asknoahshow.com/ :format bracket :raw-link http://asknoahshow.com/ :application nil :search-option nil) Ask Noah) )) (item (:standard-properties [7471 7471 7473 7523 7523 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((7230 0 - nil nil nil 7281) (7281 0 - nil nil nil 7380) (7380 0 - nil nil nil 7431) (7431 0 - nil nil nil 7471) (7471 0 - nil nil nil 7523) (7523 0 - nil nil nil 7571)) #7] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [7473 7473 7473 7523 7523 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #8]) (link (:standard-properties [7473 nil 7504 7520 7522 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #9] :type https :type-explicit-p t :path //linuxafterdark.net/ :format bracket :raw-link https://linuxafterdark.net/ :application nil :search-option nil) Linux After Dark) )) (item (:standard-properties [7523 7523 7525 7571 7571 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((7230 0 - nil nil nil 7281) (7281 0 - nil nil nil 7380) (7380 0 - nil nil nil 7431) (7431 0 - nil nil nil 7471) (7471 0 - nil nil nil 7523) (7523 0 - nil nil nil 7571)) #7] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [7525 7525 7525 7571 7571 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #8]) (link (:standard-properties [7525 nil 7551 7568 7570 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #9] :type https :type-explicit-p t :path //anonradio.net/ :format bracket :raw-link https://anonradio.net/ :application nil :search-option nil) Lispy Gopher Show) ))) (paragraph (:standard-properties [7572 7572 7572 7672 7673 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #6]) to give a heads up on EmacsConf before it happens and also let them know when videos are available. ) (paragraph (:standard-properties [7673 7673 7673 7778 7779 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #6]) We continued to use (link (:standard-properties [7693 nil 7721 7727 7730 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #7] :type https :type-explicit-p t :path //www.mumble.info/ :format bracket :raw-link https://www.mumble.info/ :application nil :search-option nil) Mumble) for backstage coordination. It worked out well. ))]) For communicating with speakers and volunteers, I used lots of mail merge ( #0 ). Most of the templates only needed a little tweaking from last year's code. I added a function to help me double-check delivery, since the batches that I tried to send via async sometimes ran into errors. )] :type emacsconf-el :type-explicit-p t :path emacsconf-mail.el :format plain :raw-link emacsconf-el:emacsconf-mail.el :application nil :search-option nil))). Most of the templates only needed a little tweaking from last year's code. I added a function to help me double-check delivery, since the batches that I tried to send via async sometimes ran into errors.

Next time, I think it could be interesting to add more blog posts and Mastodon toots.

Also, maybe it would be good to get in touch with podcasts like

to give a heads up on EmacsConf before it happens and also let them know when videos are available.

We continued to use Mumble for backstage coordination. It worked out well.

Schedule

The schedule worked out to two days of talks, with two tracks on the first day, and about 15-20 minutes between each talk. We were able to adapt to late submissions, last-minute cancellations, and last-minute switches from Q&A to live.

We added an open mic session on Sunday to fill in the time from a last-minute cancellation. That worked out nicely and it might be a good idea to schedule in that time next year. It was also good to move some of the usual closing remarks earlier. We were able to wrap up in a timely manner, which was great for some hosts and participants because they didn't have to stay up so late.

Sunday was single-track, so it was nice and relaxed. I was a little worried that people might get bored if the current talk wasn't relevant to their interests, but everyone managed just fine. I probably should have remembered that Emacs people are good at turning extra time into more configuration tweaks.

Most of the scheduling was determined by people's time constraints, so I didn't worry too much about making the talks flow logically. I accidentally forgot to note down one speaker's time constraints, but he caught it when we e-mailed the draft schedule and I was able to move things around for a better time for him.

There was a tiny bit of technical confusion because the automated schedule publishing on res had case-sensitive matching (case-fold-search was set to nil), so if a talk was set to "Live" Q&A, it didn't announce it as a live talk because it was looking for live. Whoops. I've added that configuration setting to my emacsconf-stream-config.el, so the ansible scripts should get it next time.

I asked Leo and Corwin if they wanted to manually control the talks this year. They opted to leave it automatically managed by crontab so that they wouldn't have to worry as much about timekeeping. It worked reliably. Hooray for automation! The only scheduling hiccup was because I turned off the crontab so that we could do Saturday closing remarks when we wanted to and I forgot to reenable autopilot the next day. We noticed when the opening remarks didn't start right on the dot, and I got everything back on track.

Like last year, I scheduled the dev track to start a little later than the gen track. That made for a less frantic morning. Also, this year we scheduled Sunday morning to start with more IRC Q&A instead of live Q&A. We didn't notice any bandwidth issues on Sunday morning this time.

It would be nice to have Javascript countdowns in some kind of web interface to make it easier for hosts, especially if we can update it with the actual time the current video will end in MPV.

I can also update the (link (:standard-properties [10522 nil nil nil 10555 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil (paragraph (:standard-properties [10500 10500 10500 10646 10647 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil (section (:standard-properties [7791 7791 7791 11019 11019 0 nil section nil nil nil 7791 11019 nil posts.org<2> nil nil (headline (:standard-properties [7779 7779 7791 11019 11019 0 (:title) nil nil nil nil 7851 11017 2 posts.org<2> nil nil (org-data (:standard-properties [1 1 1 261287 261287 0 nil org-data nil nil nil 3 261287 nil posts.org<2> nil nil nil] :path /home/sacha/sync/orgzly/posts.org :CATEGORY posts) (section (:standard-properties [1307 1307 1307 1964 1964 0 nil first-section nil nil nil 1307 1964 nil posts.org<2> nil nil #12]) (special-block (:standard-properties [1307 1307 1322 1669 1683 1 nil top-comment nil nil nil nil nil nil posts.org<2> nil nil #13] :type update :parameters nil) (plain-list (:standard-properties [1322 1322 1322 1669 1669 0 nil nil nil nil nil nil nil nil posts.org<2> nil ((1322 0 - nil nil nil 1487) (1487 0 - nil nil nil 1547) (1547 0 - nil nil nil 1669)) #14] :type unordered) (item (:standard-properties [1322 1322 1324 1487 1487 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((1322 0 - nil nil nil 1487) (1487 0 - nil nil nil 1547) (1547 0 - nil nil nil 1669)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [1324 1324 1324 1487 1487 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) (timestamp (:standard-properties [1324 nil nil nil 1336 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #17] :type inactive :range-type nil :raw-value [2025-01-10] :year-start 2025 :month-start 1 :day-start 10 :hour-start nil :minute-start nil :year-end 2025 :month-end 1 :day-end 10 :hour-end nil :minute-end nil)) : (link (:standard-properties [1338 nil 1387 1412 1415 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #17] :type https :type-explicit-p t :path //news.ycombinator.com/item?id=42531217 :format bracket :raw-link https://news.ycombinator.com/item?id=42531217 :application nil :search-option nil) Discussion on Hacker News) ( (link (:standard-properties [1416 nil 1452 1483 1485 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #17] :type https :type-explicit-p t :path //ditzes.com/item/42531217 :format bracket :raw-link https://ditzes.com/item/42531217 :application nil :search-option nil) comments in chronological order) ) )) (item (:standard-properties [1487 1487 1489 1547 1547 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((1322 0 - nil nil nil 1487) (1487 0 - nil nil nil 1547) (1547 0 - nil nil nil 1669)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [1489 1489 1489 1547 1547 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) (timestamp (:standard-properties [1489 nil nil nil 1501 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #17] :type inactive :range-type nil :raw-value [2025-01-02] :year-start 2025 :month-start 1 :day-start 2 :hour-start nil :minute-start nil :year-end 2025 :month-end 1 :day-end 2 :hour-end nil :minute-end nil)) : Add numbers based on latest Linode invoice. )) (item (:standard-properties [1547 1547 1549 1669 1669 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((1322 0 - nil nil nil 1487) (1487 0 - nil nil nil 1547) (1547 0 - nil nil nil 1669)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [1549 1549 1549 1669 1669 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) (timestamp (:standard-properties [1549 nil nil nil 1561 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #17] :type inactive :range-type nil :raw-value [2024-12-28] :year-start 2024 :month-start 12 :day-start 28 :hour-start nil :minute-start nil :year-end 2024 :month-end 12 :day-end 28 :hour-end nil :minute-end nil)) : Added talk and Q&A count, added note about BBB max simultaneous users, added note about BBB, added thanks )))) (paragraph (:standard-properties [1683 1683 1683 1939 1940 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #13]) (link (:standard-properties [1683 nil 1719 1748 1750 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14] :type https :type-explicit-p t :path //emacsconf.org/2024/talks :format bracket :raw-link https://emacsconf.org/2024/talks :application nil :search-option nil) The videos have been uploaded) , thank-you notes have been sent, and the kiddo has decided to play a little Minecraft on her own, so now I get to write some quick notes on (link (:standard-properties [1891 nil 1921 1935 1937 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14] :type https :type-explicit-p t :path //emacsconf.org/2024 :format bracket :raw-link https://emacsconf.org/2024 :application nil :search-option nil) EmacsConf 2024) . ) (keyword (:standard-properties [1940 1940 nil nil 1964 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #13] :key TOC :value headlines local))) (headline (:standard-properties [1964 1964 1973 3117 3117 0 (:title) nil nil nil nil 2030 3115 2 posts.org<2> nil nil #12] :pre-blank 0 :raw-value Stats :title (Stats) :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :footnote-section-p [org-element-deferred org-element--headline-footnote-section-p nil nil] :archivedp [org-element-deferred org-element--headline-archivedp nil nil] :commentedp nil :CUSTOM_ID emacsconf-2024-notes-stats) (section (:standard-properties [1973 1973 1973 3117 3117 0 nil section nil nil nil 1973 3117 nil posts.org<2> nil nil #13]) (drawer (:standard-properties [2032 2043 2053 2177 2185 2 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14] :drawer-name results :results ()) (table (:standard-properties [2053 2053 2053 2177 2177 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type org :tblfm nil :value nil) (table-row (:standard-properties [2053 2053 2054 2083 2084 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #16] :type standard) (table-cell (:standard-properties [2054 nil 2055 2060 2076 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #17]) Talks) (table-cell (:standard-properties [2076 nil 2079 2081 2083 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #17]) 31)) (table-row (:standard-properties [2084 2084 2085 2114 2115 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #16] :type standard) (table-cell (:standard-properties [2085 nil 2086 2091 2107 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #17]) Hours) (table-cell (:standard-properties [2107 nil 2108 2112 2114 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #17]) 10.7)) (table-row (:standard-properties [2115 2115 2116 2145 2146 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #16] :type standard) (table-cell (:standard-properties [2116 nil 2117 2136 2138 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #17]) Q&A web conferences) (table-cell (:standard-properties [2138 nil 2141 2143 2145 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #17]) 21)) (table-row (:standard-properties [2146 2146 2147 2176 2177 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #16] :type standard) (table-cell (:standard-properties [2147 nil 2148 2153 2169 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #17]) Hours) (table-cell (:standard-properties [2169 nil 2171 2174 2176 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #17]) 7.8)))) (plain-list (:standard-properties [2185 2185 2185 2311 2312 1 nil nil nil nil nil nil nil nil posts.org<2> nil ((2185 0 - nil nil nil 2267) (2197 2 - nil nil nil 2232) (2232 2 - nil nil nil 2267) (2267 0 - nil nil nil 2311) (2277 2 - nil nil nil 2311)) #14] :type unordered) (item (:standard-properties [2185 2185 2187 2267 2267 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((2185 0 - nil nil nil 2267) (2197 2 - nil nil nil 2232) (2232 2 - nil nil nil 2267) (2267 0 - nil nil nil 2311) (2277 2 - nil nil nil 2311)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [2187 2187 2187 2197 2197 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Saturday: ) (plain-list (:standard-properties [2197 2197 2197 2267 2267 0 nil nil nil nil nil nil nil nil posts.org<2> nil ((2185 0 - nil nil nil 2267) (2197 2 - nil nil nil 2232) (2232 2 - nil nil nil 2267) (2267 0 - nil nil nil 2311) (2277 2 - nil nil nil 2311)) #16] :type unordered) (item (:standard-properties [2197 2197 2201 2232 2232 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((2185 0 - nil nil nil 2267) (2197 2 - nil nil nil 2232) (2232 2 - nil nil nil 2267) (2267 0 - nil nil nil 2311) (2277 2 - nil nil nil 2311)) #17] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [2201 2201 2201 2232 2232 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #18]) gen: 177 peak + 14 peak lowres )) (item (:standard-properties [2232 2232 2236 2267 2267 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((2185 0 - nil nil nil 2267) (2197 2 - nil nil nil 2232) (2232 2 - nil nil nil 2267) (2267 0 - nil nil nil 2311) (2277 2 - nil nil nil 2311)) #17] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [2236 2236 2236 2267 2267 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #18]) dev: 226 peak + 79 peak lowres )))) (item (:standard-properties [2267 2267 2269 2311 2311 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((2185 0 - nil nil nil 2267) (2197 2 - nil nil nil 2232) (2232 2 - nil nil nil 2267) (2267 0 - nil nil nil 2311) (2277 2 - nil nil nil 2311)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [2269 2269 2269 2277 2277 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Sunday: ) (plain-list (:standard-properties [2277 2277 2277 2311 2311 0 nil nil nil nil nil nil nil nil posts.org<2> nil ((2185 0 - nil nil nil 2267) (2197 2 - nil nil nil 2232) (2232 2 - nil nil nil 2267) (2267 0 - nil nil nil 2311) (2277 2 - nil nil nil 2311)) #16] :type unordered) (item (:standard-properties [2277 2277 2281 2311 2311 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((2185 0 - nil nil nil 2267) (2197 2 - nil nil nil 2232) (2232 2 - nil nil nil 2267) (2267 0 - nil nil nil 2311) (2277 2 - nil nil nil 2311)) #17] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [2281 2281 2281 2311 2311 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #18]) gen: 89 peak + 10 peak lowres ))))) (paragraph (:standard-properties [2312 2312 2312 2334 2335 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) Server configuration: ) (table (:standard-properties [2335 2335 2335 2865 2866 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14] :type org :tblfm nil :value nil) (table-row (:standard-properties [2335 2335 2336 2440 2441 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [2336 nil 2337 2341 2344 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) meet) (table-cell (:standard-properties [2344 nil 2345 2365 2367 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 16GB 8core dedicated) (table-cell (:standard-properties [2367 nil 2368 2412 2440 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) peak 409% CPU (100% is 1 CPU), average 69.4%)) (table-row (:standard-properties [2441 2441 2442 2546 2547 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [2442 nil 2443 2448 2450 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) front) (table-cell (:standard-properties [2450 nil 2451 2468 2473 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 32GB 8core shared) (table-cell (:standard-properties [2473 nil 2474 2505 2546 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) peak 70.66% CPU (100% is 1 CPU))) (table-row (:standard-properties [2547 2547 2548 2652 2653 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [2548 nil 2549 2553 2556 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) live) (table-cell (:standard-properties [2556 nil 2557 2575 2579 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 64GB 16core shared) (table-cell (:standard-properties [2579 nil 2580 2622 2652 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) peak 552% CPU (100% is 1 CPU) average 144%)) (table-row (:standard-properties [2653 2653 2654 2758 2759 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [2654 nil 2655 2658 2662 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) res) (table-cell (:standard-properties [2662 nil 2663 2674 2685 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 46GB 12core) (table-cell (:standard-properties [2685 nil 2686 2756 2758 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) peak 81.54% total CPU (100% is 12 CPUs); each OBS ~250%), mem 7GB used)) (table-row (:standard-properties [2759 2759 2760 2864 2865 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [2760 nil 2761 2766 2768 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) media) (table-cell (:standard-properties [2768 nil 2769 2778 2791 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 3GB 1core) (table-cell (:standard-properties [2791 nil 2863 2863 2864 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16])))) (paragraph (:standard-properties [2866 2866 2866 2892 2893 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) YouTube livestream stats: ) (table (:standard-properties [2893 2893 2893 3117 3117 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14] :type org :tblfm nil :value nil) (table-row (:standard-properties [2893 2893 2894 2920 2921 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [2894 nil 2895 2900 2907 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Shift) (table-cell (:standard-properties [2907 nil 2908 2912 2914 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Peak) (table-cell (:standard-properties [2914 nil 2915 2918 2920 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Avg)) (table-row (:standard-properties [2921 2921 nil nil 2949 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type rule)) (table-row (:standard-properties [2949 2949 2950 2976 2977 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [2950 nil 2951 2961 2963 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Gen Sat AM) (table-cell (:standard-properties [2963 nil 2966 2968 2970 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 46) (table-cell (:standard-properties [2970 nil 2972 2974 2976 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 28)) (table-row (:standard-properties [2977 2977 2978 3004 3005 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [2978 nil 2979 2989 2991 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Gen Sat PM) (table-cell (:standard-properties [2991 nil 2994 2996 2998 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 24) (table-cell (:standard-properties [2998 nil 3000 3002 3004 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 16)) (table-row (:standard-properties [3005 3005 3006 3032 3033 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [3006 nil 3007 3017 3019 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Dev Sat AM) (table-cell (:standard-properties [3019 nil 3022 3024 3026 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 15) (table-cell (:standard-properties [3026 nil 3029 3030 3032 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 7)) (table-row (:standard-properties [3033 3033 3034 3060 3061 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [3034 nil 3035 3045 3047 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Dev Sat PM) (table-cell (:standard-properties [3047 nil 3050 3052 3054 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 20) (table-cell (:standard-properties [3054 nil 3056 3058 3060 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 12)) (table-row (:standard-properties [3061 3061 3062 3088 3089 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [3062 nil 3063 3073 3075 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Gen Sun AM) (table-cell (:standard-properties [3075 nil 3078 3080 3082 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 28) (table-cell (:standard-properties [3082 nil 3084 3086 3088 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 17)) (table-row (:standard-properties [3089 3089 3090 3116 3117 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [3090 nil 3091 3101 3103 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Gen Sun PM) (table-cell (:standard-properties [3103 nil 3106 3108 3110 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 26) (table-cell (:standard-properties [3110 nil 3112 3114 3116 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 18))))) (headline (:standard-properties [3117 3117 3129 4375 4375 0 (:title) nil nil nil nil 3189 4373 2 posts.org<2> nil nil #12] :pre-blank 0 :raw-value Timeline :title (Timeline) :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :footnote-section-p [org-element-deferred org-element--headline-footnote-section-p nil nil] :archivedp [org-element-deferred org-element--headline-archivedp nil nil] :commentedp nil :CUSTOM_ID emacsconf-2024-notes-timeline) (section (:standard-properties [3129 3129 3129 4375 4375 0 nil section nil nil nil 3129 4375 nil posts.org<2> nil nil #13]) (table (:standard-properties [3191 3191 3191 3563 3564 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14] :type org :tblfm nil :value nil) (table-row (:standard-properties [3191 3191 3192 3252 3253 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [3192 nil 3193 3211 3216 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Call for proposals) (table-cell (:standard-properties [3216 nil 3217 3233 3252 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) (timestamp (:standard-properties [3217 nil nil nil 3233 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #17] :type inactive :range-type nil :raw-value [2024-06-30 Sun] :year-start 2024 :month-start 6 :day-start 30 :hour-start nil :minute-start nil :year-end 2024 :month-end 6 :day-end 30 :hour-end nil :minute-end nil)))) (table-row (:standard-properties [3253 3253 3254 3314 3315 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [3254 nil 3255 3267 3278 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) CFP deadline) (table-cell (:standard-properties [3278 nil 3279 3295 3314 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) (timestamp (:standard-properties [3279 nil nil nil 3295 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #17] :type inactive :range-type nil :raw-value [2024-09-20 Fri] :year-start 2024 :month-start 9 :day-start 20 :hour-start nil :minute-start nil :year-end 2024 :month-end 9 :day-end 20 :hour-end nil :minute-end nil)))) (table-row (:standard-properties [3315 3315 3316 3376 3377 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [3316 nil 3317 3338 3340 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Speaker notifications) (table-cell (:standard-properties [3340 nil 3341 3357 3376 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) (timestamp (:standard-properties [3341 nil nil nil 3357 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #17] :type inactive :range-type nil :raw-value [2024-09-27 Fri] :year-start 2024 :month-start 9 :day-start 27 :hour-start nil :minute-start nil :year-end 2024 :month-end 9 :day-end 27 :hour-end nil :minute-end nil)))) (table-row (:standard-properties [3377 3377 3378 3438 3439 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [3378 nil 3379 3395 3402 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Publish schedule) (table-cell (:standard-properties [3402 nil 3403 3419 3438 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) (timestamp (:standard-properties [3403 nil nil nil 3419 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #17] :type inactive :range-type nil :raw-value [2024-10-25 Fri] :year-start 2024 :month-start 10 :day-start 25 :hour-start nil :minute-start nil :year-end 2024 :month-end 10 :day-end 25 :hour-end nil :minute-end nil)))) (table-row (:standard-properties [3439 3439 3440 3500 3501 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [3440 nil 3441 3458 3464 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Video target date) (table-cell (:standard-properties [3464 nil 3465 3481 3500 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) (timestamp (:standard-properties [3465 nil nil nil 3481 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #17] :type inactive :range-type nil :raw-value [2024-11-08 Fri] :year-start 2024 :month-start 11 :day-start 8 :hour-start nil :minute-start nil :year-end 2024 :month-end 11 :day-end 8 :hour-end nil :minute-end nil)))) (table-row (:standard-properties [3501 3501 3502 3562 3563 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [3502 nil 3503 3512 3526 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) EmacsConf) (table-cell (:standard-properties [3526 nil 3527 3560 3562 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) (timestamp (:standard-properties [3527 nil nil nil 3543 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #17] :type inactive :range-type nil :raw-value [2024-12-07 Sat] :year-start 2024 :month-start 12 :day-start 7 :hour-start nil :minute-start nil :year-end 2024 :month-end 12 :day-end 7 :hour-end nil :minute-end nil)) - (timestamp (:standard-properties [3544 nil nil nil 3560 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #17] :type inactive :range-type nil :raw-value [2024-12-07 Sat] :year-start 2024 :month-start 12 :day-start 7 :hour-start nil :minute-start nil :year-end 2024 :month-end 12 :day-end 7 :hour-end nil :minute-end nil))))) (paragraph (:standard-properties [3564 3564 3564 3886 3887 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) We did early acceptances again this year. That was nice. I wasn't sure about committing longer periods of time early in the scheduling process, so I usually tried to nudge people to plan a 20-minute video with the option of possibly doing more, and I okayed longer talks once we figured out what the schedule looked like. ) (paragraph (:standard-properties [3887 3887 3887 4374 4375 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) There were 82 days between the call for proposals and the CFP deadline, another 49 days from that to the video target date, and 29 days between the video target date and EmacsConf. It felt like there was a good amount of time for proposals and videos. Six videos came in before or on the target date. The rest trickled in afterwards, which was fine because we wanted to keep things low-pressure for the speakers. We had enough capacity to process and caption the videos as they came in. ))) (headline (:standard-properties [4375 4375 4383 5166 5166 0 (:title) nil nil nil nil 4439 5164 2 posts.org<2> nil nil #12] :pre-blank 0 :raw-value Data :title (Data) :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :footnote-section-p [org-element-deferred org-element--headline-footnote-section-p nil nil] :archivedp [org-element-deferred org-element--headline-archivedp nil nil] :commentedp nil :CUSTOM_ID emacsconf-2024-notes-data) (section (:standard-properties [4383 4383 4383 5166 5166 0 nil section nil nil nil 4383 5166 nil posts.org<2> nil nil #13]) (paragraph (:standard-properties [4441 4441 4441 4556 4557 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) We continued to use an Org file to store the talk information. It would be great to add some validation functions: ) (plain-list (:standard-properties [4557 4557 4557 4906 4907 1 nil nil nil nil nil nil nil nil posts.org<2> nil ((4557 0 - nil nil nil 4603) (4603 0 - nil nil nil 4653) (4653 0 - nil nil nil 4706) (4706 0 - nil nil nil 4804) (4804 0 - nil nil nil 4844) (4844 0 - nil nil nil 4906)) #14] :type unordered) (item (:standard-properties [4557 4557 4561 4603 4603 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((4557 0 - nil nil nil 4603) (4603 0 - nil nil nil 4653) (4653 0 - nil nil nil 4706) (4706 0 - nil nil nil 4804) (4804 0 - nil nil nil 4844) (4844 0 - nil nil nil 4906)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [4561 4561 4561 4603 4603 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Check permissions and ownership for files )) (item (:standard-properties [4603 4603 4607 4653 4653 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((4557 0 - nil nil nil 4603) (4603 0 - nil nil nil 4653) (4653 0 - nil nil nil 4706) (4706 0 - nil nil nil 4804) (4804 0 - nil nil nil 4844) (4844 0 - nil nil nil 4906)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [4607 4607 4607 4653 4653 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Check case sensitivity for Q&A type detection )) (item (:standard-properties [4653 4653 4657 4706 4706 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((4557 0 - nil nil nil 4603) (4603 0 - nil nil nil 4653) (4653 0 - nil nil nil 4706) (4706 0 - nil nil nil 4804) (4804 0 - nil nil nil 4844) (4844 0 - nil nil nil 4906)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [4657 4657 4657 4706 4706 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Check BBB redirect pages to make sure they exist )) (item (:standard-properties [4706 4706 4710 4804 4804 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((4557 0 - nil nil nil 4603) (4603 0 - nil nil nil 4653) (4653 0 - nil nil nil 4706) (4706 0 - nil nil nil 4804) (4804 0 - nil nil nil 4844) (4844 0 - nil nil nil 4906)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [4710 4710 4710 4804 4804 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Check transcripts for ` because that messes up formatting; consider escaping for the wiki )) (item (:standard-properties [4804 4804 4808 4844 4844 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((4557 0 - nil nil nil 4603) (4603 0 - nil nil nil 4653) (4653 0 - nil nil nil 4706) (4706 0 - nil nil nil 4804) (4804 0 - nil nil nil 4844) (4844 0 - nil nil nil 4906)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [4808 4808 4808 4844 4844 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Check files are public and readable )) (item (:standard-properties [4844 4844 4848 4906 4906 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((4557 0 - nil nil nil 4603) (4603 0 - nil nil nil 4653) (4653 0 - nil nil nil 4706) (4706 0 - nil nil nil 4804) (4804 0 - nil nil nil 4844) (4844 0 - nil nil nil 4906)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [4848 4848 4848 4906 4906 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Check captioned by comment vs caption status vs captioner ))) (paragraph (:standard-properties [4907 4907 4907 5165 5166 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) Speakers uploaded their files via (link (:standard-properties [4941 nil 4985 4996 4998 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //github.com/psi-4ward/psitransfer :format bracket :raw-link https://github.com/psi-4ward/psitransfer :application nil :search-option nil) PsiTransfer) again. I didn't get around to setting up the FTP server. I should probably rename ftp-upload.emacsconf.org to upload.emacsconf.org so that people don't get confused. ))) (headline (:standard-properties [5166 5166 5183 7779 7779 0 (:title) nil nil nil nil 5248 7777 2 posts.org<2> nil nil #12] :pre-blank 0 :raw-value Communication :title (Communication) :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :footnote-section-p [org-element-deferred org-element--headline-footnote-section-p nil nil] :archivedp [org-element-deferred org-element--headline-archivedp nil nil] :commentedp nil :CUSTOM_ID emacsconf-2024-notes-communication) (section (:standard-properties [5183 5183 5183 7779 7779 0 nil section nil nil nil 5183 7779 nil posts.org<2> nil nil #13]) (paragraph (:standard-properties [5250 5250 5250 6764 6765 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) As usual, we announced the EmacsConf call for proposals on (link (:standard-properties [5309 nil 5384 5398 5400 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //lists.gnu.org/archive/html/emacs-tangents/2024-06/msg00004.html :format bracket :raw-link https://lists.gnu.org/archive/html/emacs-tangents/2024-06/msg00004.html :application nil :search-option nil) emacs-tangents) , (link (:standard-properties [5402 nil 5463 5473 5475 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //sachachua.com/blog/2024/07/2024-07-01-emacs-news/ :format bracket :raw-link https://sachachua.com/blog/2024/07/2024-07-01-emacs-news/ :application nil :search-option nil) Emacs News) , (link (:standard-properties [5477 nil 5537 5554 5556 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //lists.gnu.org/mailman/listinfo/emacsconf-discuss :format bracket :raw-link https://lists.gnu.org/mailman/listinfo/emacsconf-discuss :application nil :search-option nil) emacsconf-discuss) , (link (:standard-properties [5558 nil 5632 5645 5647 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //lists.gnu.org/archive/html/emacsconf-org/2024-06/msg00000.html :format bracket :raw-link https://lists.gnu.org/archive/html/emacsconf-org/2024-06/msg00000.html :application nil :search-option nil) emacsconf-org) , (link (:standard-properties [5649 nil nil nil 5675 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //reddit.com/r/emacs :format plain :raw-link https://reddit.com/r/emacs :application nil :search-option nil)) . (link (:standard-properties [5677 nil 5734 5749 5751 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //systemcrafters.net/live-streams/july-12-2024/ :format bracket :raw-link https://systemcrafters.net/live-streams/july-12-2024/ :application nil :search-option nil) System Crafters) , (link (:standard-properties [5753 nil 5789 5795 5797 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //irreal.org/blog/?p=12280 :format bracket :raw-link https://irreal.org/blog/?p=12280 :application nil :search-option nil) Irreal) , and (link (:standard-properties [5803 nil 5864 5874 5876 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //emacs-apac.gitlab.io/announcements/november-2024/ :format bracket :raw-link https://emacs-apac.gitlab.io/announcements/november-2024/ :application nil :search-option nil) Emacs APAC) , mentioned it, and people also posted about EmacsConf on (link (:standard-properties [5934 nil 5976 5984 5986 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //mastodon.social/tags/emacsconf :format bracket :raw-link https://mastodon.social/tags/emacsconf :application nil :search-option nil) Mastodon) , (link (:standard-properties [5988 nil 6050 6051 6053 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //x.com/search?q=%23emacsconf&src=typed_query&f=live :format bracket :raw-link https://x.com/search?q=%23emacsconf&src=typed_query&f=live :application nil :search-option nil) X) , (link (:standard-properties [6055 nil 6093 6100 6102 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //bsky.app/hashtag/emacsconf :format bracket :raw-link https://bsky.app/hashtag/emacsconf :application nil :search-option nil) BlueSky) , and (link (:standard-properties [6108 nil 6197 6205 6207 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //www.facebook.com/story.php?story_fbid=538504738701826&id=100076269125316&_rdr :format bracket :raw-link https://www.facebook.com/story.php?story_fbid=538504738701826&id=100076269125316&_rdr :application nil :search-option nil) Facebook) . (link (:standard-properties [6209 nil 6252 6274 6276 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //toot.si/@len/113392360015917614 :format bracket :raw-link https://toot.si/@len/113392360015917614 :application nil :search-option nil) @len@toot.si suggested) submitting EmacsConf to (link (:standard-properties [6301 nil nil nil 6320 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //foss.events :format plain :raw-link https://foss.events :application nil :search-option nil)) , so I did. There was some other (link (:standard-properties [6353 nil 6452 6481 6484 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //www.reddit.com/r/emacs/comments/1h5c778/which_emacsconf_2024_talks_have_your_attention/ :format bracket :raw-link https://www.reddit.com/r/emacs/comments/1h5c778/which_emacsconf_2024_talks_have_your_attention/ :application nil :search-option nil) EmacsConf-related discussions) in r/emacs. (link (:standard-properties [6496 nil 6585 6600 6603 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //200ok.ch/posts/2024-09-16_announcing_emacsconf__official_swiss_satellite.html :format bracket :raw-link https://200ok.ch/posts/2024-09-16_announcing_emacsconf__official_swiss_satellite.html :application nil :search-option nil) 200ok and Ardeo) organized an in-person meetup in Switzerland, and (link (:standard-properties [6653 nil 6726 6760 6762 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //dogodki.kompot.si/events/00a6f9ee-9087-400d-9d9b-d51b98561424 :format bracket :raw-link https://dogodki.kompot.si/events/00a6f9ee-9087-400d-9d9b-d51b98561424 :application nil :search-option nil) emacs.si got together in Ljubljana) . ) (paragraph (:standard-properties [6765 6765 6765 7077 7078 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) For communicating with speakers and volunteers, I used lots of mail merge ( (link (:standard-properties [6840 nil nil nil 6870 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type emacsconf-el :type-explicit-p t :path emacsconf-mail.el :format plain :raw-link emacsconf-el:emacsconf-mail.el :application nil :search-option nil)) ). Most of the templates only needed a little tweaking from last year's code. I added a function to help me double-check delivery, since the batches that I tried to send via async sometimes ran into errors. ) (paragraph (:standard-properties [7078 7078 7078 7164 7165 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) Next time, I think it could be interesting to add more blog posts and Mastodon toots. ) (paragraph (:standard-properties [7165 7165 7165 7229 7230 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) Also, maybe it would be good to get in touch with podcasts like ) (plain-list (:standard-properties [7230 7230 7230 7571 7572 1 nil nil nil nil nil nil nil nil posts.org<2> nil ((7230 0 - nil nil nil 7281) (7281 0 - nil nil nil 7380) (7380 0 - nil nil nil 7431) (7431 0 - nil nil nil 7471) (7471 0 - nil nil nil 7523) (7523 0 - nil nil nil 7571)) #14] :type unordered) (item (:standard-properties [7230 7230 7232 7281 7281 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((7230 0 - nil nil nil 7281) (7281 0 - nil nil nil 7380) (7380 0 - nil nil nil 7431) (7431 0 - nil nil nil 7471) (7471 0 - nil nil nil 7523) (7523 0 - nil nil nil 7571)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [7232 7232 7232 7281 7281 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) (link (:standard-properties [7232 nil 7263 7278 7280 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #17] :type https :type-explicit-p t :path //systemcrafters.net/ :format bracket :raw-link https://systemcrafters.net/ :application nil :search-option nil) System Crafters) )) (item (:standard-properties [7281 7281 7283 7380 7380 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((7230 0 - nil nil nil 7281) (7281 0 - nil nil nil 7380) (7380 0 - nil nil nil 7431) (7431 0 - nil nil nil 7471) (7471 0 - nil nil nil 7523) (7523 0 - nil nil nil 7571)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [7283 7283 7283 7380 7380 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) (link (:standard-properties [7283 nil 7359 7377 7379 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #17] :type https :type-explicit-p t :path //www.youtube.com/playlist?list=PLbFVcOQ-YH_LRP687N0YeN78YZmBp5wqF :format bracket :raw-link https://www.youtube.com/playlist?list=PLbFVcOQ-YH_LRP687N0YeN78YZmBp5wqF :application nil :search-option nil) This Week in Linux) )) (item (:standard-properties [7380 7380 7382 7431 7431 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((7230 0 - nil nil nil 7281) (7281 0 - nil nil nil 7380) (7380 0 - nil nil nil 7431) (7431 0 - nil nil nil 7471) (7471 0 - nil nil nil 7523) (7523 0 - nil nil nil 7571)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [7382 7382 7382 7431 7431 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) (link (:standard-properties [7382 nil 7413 7428 7430 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #17] :type https :type-explicit-p t :path //linuxunplugged.com/ :format bracket :raw-link https://linuxunplugged.com/ :application nil :search-option nil) Linux Unplugged) )) (item (:standard-properties [7431 7431 7433 7471 7471 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((7230 0 - nil nil nil 7281) (7281 0 - nil nil nil 7380) (7380 0 - nil nil nil 7431) (7431 0 - nil nil nil 7471) (7471 0 - nil nil nil 7523) (7523 0 - nil nil nil 7571)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [7433 7433 7433 7471 7471 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) (link (:standard-properties [7433 nil 7460 7468 7470 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #17] :type http :type-explicit-p t :path //asknoahshow.com/ :format bracket :raw-link http://asknoahshow.com/ :application nil :search-option nil) Ask Noah) )) (item (:standard-properties [7471 7471 7473 7523 7523 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((7230 0 - nil nil nil 7281) (7281 0 - nil nil nil 7380) (7380 0 - nil nil nil 7431) (7431 0 - nil nil nil 7471) (7471 0 - nil nil nil 7523) (7523 0 - nil nil nil 7571)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [7473 7473 7473 7523 7523 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) (link (:standard-properties [7473 nil 7504 7520 7522 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #17] :type https :type-explicit-p t :path //linuxafterdark.net/ :format bracket :raw-link https://linuxafterdark.net/ :application nil :search-option nil) Linux After Dark) )) (item (:standard-properties [7523 7523 7525 7571 7571 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((7230 0 - nil nil nil 7281) (7281 0 - nil nil nil 7380) (7380 0 - nil nil nil 7431) (7431 0 - nil nil nil 7471) (7471 0 - nil nil nil 7523) (7523 0 - nil nil nil 7571)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [7525 7525 7525 7571 7571 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) (link (:standard-properties [7525 nil 7551 7568 7570 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #17] :type https :type-explicit-p t :path //anonradio.net/ :format bracket :raw-link https://anonradio.net/ :application nil :search-option nil) Lispy Gopher Show) ))) (paragraph (:standard-properties [7572 7572 7572 7672 7673 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) to give a heads up on EmacsConf before it happens and also let them know when videos are available. ) (paragraph (:standard-properties [7673 7673 7673 7778 7779 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) We continued to use (link (:standard-properties [7693 nil 7721 7727 7730 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //www.mumble.info/ :format bracket :raw-link https://www.mumble.info/ :application nil :search-option nil) Mumble) for backstage coordination. It worked out well. ))) #9 (headline (:standard-properties [11019 11019 11038 14417 14417 0 (:title) nil nil nil nil 11105 14415 2 posts.org<2> nil nil #12] :pre-blank 0 :raw-value Recorded videos :title (Recorded videos) :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :footnote-section-p [org-element-deferred org-element--headline-footnote-section-p nil nil] :archivedp [org-element-deferred org-element--headline-archivedp nil nil] :commentedp nil :CUSTOM_ID emacsconf-2024-notes-recorded-videos) (section (:standard-properties [11038 11038 11038 14417 14417 0 nil section nil nil nil 11038 14417 nil posts.org<2> nil nil #13]) (paragraph (:standard-properties [11107 11107 11107 11495 11496 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) As usual, we strongly encouraged speakers to record videos to lower everyone's stress levels and allow for captioning by volunteers, so that's what most speakers did. We were able to handle a few last-minute submissions as well as a live talk. Getting videos also meant we could publish them as each talk went live, including automatically putting the videos and transcripts on the wiki. ) (paragraph (:standard-properties [11496 11496 11496 11744 11745 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) We didn't have obvious video encoding cut-offs, so re-encoding in a screen was a reliable way to avoid interruptions this year. Also, no one complained about tiny text or low resolution, so the talk preparation instructions seem to be working out. ) (paragraph (:standard-properties [11745 11745 11745 12180 12181 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) Automatically normalizing the audio with ffmpeg-normalize didn't work out, so Leo Vivier did a last-minute scramble to normalize the audio the day before the conference. Maybe that's something that volunteers can help with during the lead-up to the conference, or maybe I can finally figure out how to fit that into my process. I don't have much time or patience to listen to things, but it would be nice to get that sorted out early. ) (paragraph (:standard-properties [12181 12181 12181 12417 12418 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) Next year we can try remixing the audio to mono. One of the talks had some audio moving around, which was a little distracting. Also, some people listen to the talks in one ear, so it would be good to drop things down to mono for them. ) (paragraph (:standard-properties [12418 12418 12418 12724 12725 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) We think 60fps videos stressed the res server a bit, resulting in dropped frames. Next year, we can downsample those to 30fps and add a note to the talk preparation instructions. The hosts also suggested looking into setting up streaming from each host's computer instead of using our shared VNC sessions. ) (paragraph (:standard-properties [12725 12725 12725 12847 12848 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) There was some colour smearing and weirdness when we played some videos with mpv on res. Upgrading MPV to v0.38 fixed it. ) (paragraph (:standard-properties [12848 12848 12848 12974 12975 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) Some people requested dark mode (light text on dark background), so maybe we can experiment with recommending that next year. ) (paragraph (:standard-properties [12975 12975 12975 13307 13308 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) I did a last-minute change to the shell scripts to load resources from the cache directory instead of the assets/stream directory, but I didn't get all of the file references, so sometimes the test videos played or the introductions didn't have captions. On the plus side, I learned how to use (code (:standard-properties [13269 nil nil nil 13273 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :value [org-element-deferred org-element--substring (1 2) t])) in MPV to reload a subtitle file. ) (paragraph (:standard-properties [13308 13308 13308 13610 13611 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) Sometimes we needed to play the videos manually. If we get the hang of starting MPV in a screen or tmux session, it might be easier for hosts to check how much time is left, or to restart a video at a specific point if needed. Leo said he'll work on figuring out the configuration and the Lua scripts. ) (paragraph (:standard-properties [13611 13611 13611 14165 14166 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) I uploaded all the videos to YouTube and scheduled them. That was nice because then I didn't have to keep updating things during the conference. It turns out that Toobnix also has a way to schedule uploads. I just need to upload it as unlisted first, and then choose Scheduled from the visibility. I wonder if (link (:standard-properties [13921 nil 13981 13993 13996 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //www.npmjs.com/package/%40peertube%2Fpeertube-cli :format bracket :raw-link https://www.npmjs.com/package/%40peertube%2Fpeertube-cli :application nil :search-option nil) peertube-cli) can be extended to schedule things. Anyway, since I didn't know about that during the conference, I just used (code (:standard-properties [14106 nil nil nil 14138 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :value [org-element-deferred org-element--substring (1 30) t])) function to upload videos. ) (paragraph (:standard-properties [14166 14166 14166 14416 14417 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) It was fun playing (link (:standard-properties [14185 nil 14232 14296 14299 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //www.youtube.com/watch?v=urcL86UpqZc :format bracket :raw-link https://www.youtube.com/watch?v=urcL86UpqZc :application nil :search-option nil) Interview with an Emacs Enthusiast in 2023 [Colorized] - YouTube) at lunch. I put together some captions for it after the conference, so maybe we can play it with captions next year. ))) (headline (:standard-properties [14417 14417 14443 15162 15162 0 (:title) nil nil nil nil 14517 15160 2 posts.org<2> nil nil #12] :pre-blank 0 :raw-value Recorded introductions :title (Recorded introductions) :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :footnote-section-p [org-element-deferred org-element--headline-footnote-section-p nil nil] :archivedp [org-element-deferred org-element--headline-archivedp nil nil] :commentedp nil :CUSTOM_ID emacsconf-2024-notes-recorded-introductions) (section (:standard-properties [14443 14443 14443 15162 15162 0 nil section nil nil nil 14443 15162 nil posts.org<2> nil nil #13]) (paragraph (:standard-properties [14519 14519 14519 14819 14820 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) We record introductions so that hosts don't have to worry about how to say things on air. I should probably send the intro check e-mail earlier--maybe on the original video target date, even if speakers haven't submitted their videos yet. This will reduce the last-minute scramble to correct intros. ) (paragraph (:standard-properties [14820 14820 14820 14994 14995 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) When I switched the shell scripts to use the cache directory, I forgot to get it to do the intros from that directory as well, so some of the uncorrected intros were played. ) (paragraph (:standard-properties [14995 14995 14995 15161 15162 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) I forgot to copy the intro VTTs to the cache directory. This should be handled by the subed-record process for creating intros, so it'll be all sorted out next year. ))) (headline (:standard-properties [15162 15162 15176 16756 16756 0 (:title) nil nil nil nil 15238 16754 2 posts.org<2> nil nil #12] :pre-blank 0 :raw-value Captioning :title (Captioning) :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :footnote-section-p [org-element-deferred org-element--headline-footnote-section-p nil nil] :archivedp [org-element-deferred org-element--headline-archivedp nil nil] :commentedp nil :CUSTOM_ID emacsconf-2024-notes-captioning) (section (:standard-properties [15176 15176 15176 16756 16756 0 nil section nil nil nil 15176 16756 nil posts.org<2> nil nil #13]) (paragraph (:standard-properties [15240 15240 15240 16015 16016 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) We used (link (:standard-properties [15248 nil 15286 15294 15297 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //github.com/m-bain/whisperX :format bracket :raw-link https://github.com/m-bain/whisperX :application nil :search-option nil) WhisperX) for speech-to-text this year. It did a great job at preparing the first drafts of captions that our wonderful army of volunteer captioners could then edit. WhisperX's built-in voice activity detection cut down a lot on the hallucinations that (link (:standard-properties [15540 nil 15577 15591 15594 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //github.com/openai/whisper :format bracket :raw-link https://github.com/openai/whisper :application nil :search-option nil) OpenAI Whisper) had during periods of silence in last year's captions, and there was only one instance of WhisperX missing a chunk of text from a speaker that I needed to manually fill in. I upgraded to a Lenovo P52 with 64GB RAM, so I was able to handle last-minute caption processing on my computer. It might be handy to have a smaller model ready for those last-minute requests, or have something ready to go for the commercial APIs. ) (paragraph (:standard-properties [16016 16016 16016 16585 16586 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) The timestamps were a little bit off. It was really helpful that speakers and volunteers used the backstage area to check video quality. I used (link (:standard-properties [16160 nil 16197 16203 16206 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //www.readbeyond.it/aeneas/ :format bracket :raw-link https://www.readbeyond.it/aeneas/ :application nil :search-option nil) Aeneas) to re-align the text, but Aeneas was also confused by silences. I've added some code to (link (:standard-properties [16294 nil 16329 16334 16337 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //github.com/sachac/subed :format bracket :raw-link https://github.com/sachac/subed :application nil :search-option nil) subed) so that I can realign regions of subtitles using Aeneas or WhisperX timestamps, and I also wrote some code to (link (:standard-properties [16447 nil 16544 16581 16583 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //sachachua.com/blog/2024/11/checking-caption-timing-by-skimming-with-emacs-lisp-or-js/ :format bracket :raw-link https://sachachua.com/blog/2024/11/checking-caption-timing-by-skimming-with-emacs-lisp-or-js/ :application nil :search-option nil) skim timestamps for easy verification) . ) (paragraph (:standard-properties [16586 16586 16586 16755 16756 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) Anush V experimented with using machine learning for (link (:standard-properties [16639 nil 16677 16698 16700 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //gitlab.com/jun8git/sub-seg :format bracket :raw-link https://gitlab.com/jun8git/sub-seg :application nil :search-option nil) subtitle segmentation) , so that might be something to explore going forward. ))) (headline (:standard-properties [16756 16756 16788 19618 19618 0 (:title) nil nil nil nil 16868 19616 2 posts.org<2> nil nil #12] :pre-blank 0 :raw-value BigBlueButton web conference :title (BigBlueButton web conference) :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :footnote-section-p [org-element-deferred org-element--headline-footnote-section-p nil nil] :archivedp [org-element-deferred org-element--headline-archivedp nil nil] :commentedp nil :CUSTOM_ID emacsconf-2024-notes-bigbluebutton-web-conference) (section (:standard-properties [16788 16788 16788 19618 19618 0 nil section nil nil nil 16788 19618 nil posts.org<2> nil nil #13]) (paragraph (:standard-properties [16870 16870 16870 17815 17816 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) This year we set up a new (link (:standard-properties [16896 nil 16931 16944 16947 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //demo.bigbluebutton.org/ :format bracket :raw-link https://demo.bigbluebutton.org/ :application nil :search-option nil) BigBlueButton) web conferencing server. The server with our previous BigBlueButton instance had been donated by a defunct nonprofit, so it finally got removed on October 27. After investigating whether Jitsi or Galene might be a good fit for EmacsConf, we decided to continue with BigBlueButton. There were some concerns about (link (:standard-properties [17259 nil 17318 17332 17335 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //github.com/bigbluebutton/bbb-install/issues/261 :format bracket :raw-link https://github.com/bigbluebutton/bbb-install/issues/261 :application nil :search-option nil) non-free Mongo) for BBB versions >= 2.3 and < 3, so I installed BBB 3.0. This was hard to get working on a Docker on the existing res server. (link (:standard-properties [17461 nil 17516 17526 17529 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //emacsconf.org/2024/organizers-notebook/#bbb :format bracket :raw-link https://emacsconf.org/2024/organizers-notebook/#bbb :application nil :search-option nil) We decided) it was worth spinning up an additional Linode virtual private server. It turned out that BBB refused to run on anything smaller than 8GB/4core, so I scaled up to that during testing, scaled back down to 1GB/1core in between, and scaled up to 16GB/8core dedicated during the conference. ) (paragraph (:standard-properties [17816 17816 17816 18043 18044 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) I'm still not 100% sure I set everything up correctly or that everything was stable. Maybe next year BBB 3.0 will be better-tested, someone more sysad-y can doublecheck the setup, or we can try (link (:standard-properties [18010 nil 18033 18039 18041 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //galene.org/ :format bracket :raw-link https://galene.org/ :application nil :search-option nil) Galene) . ) (paragraph (:standard-properties [18044 18044 18044 18339 18340 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) One of the benefits of upgrading to BBB 3.0 was that we could use the smart layout feature to drag the webcam thumbnails to the side of the shared screen. This made shared screens much easier to read. I haven't automated this yet, but it was easy enough for us to do via the shared VNC session. ) (paragraph (:standard-properties [18340 18340 18340 18708 18709 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) On the plus side, it was pretty straightforward to use the Rails console to create all the rooms. We used moderator access codes to give all the speakers moderator access. Mysteriously, superadmins didn't automatically have moderator access to all the rooms even if they were logged in, so we needed to add host access by hand so that they could start the recordings. ) (paragraph (:standard-properties [18709 18709 18709 18969 18970 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) Since we self-hosted and were budgeting more for the full-scale node, I didn't feel comfortable scaling it up to production size until a few days before the conference. I sent the access codes with the check-in e-mails to give speakers time to try things out. ) (paragraph (:standard-properties [18970 18970 18970 19130 19131 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) (link (:standard-properties [18970 nil 19097 19126 19128 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //sachachua.com/blog/2023/12/emacsconf-backstage-figuring-out-our-maximum-number-of-simultaneous-bigbluebutton-users/ :format bracket :raw-link https://sachachua.com/blog/2023/12/emacsconf-backstage-figuring-out-our-maximum-number-of-simultaneous-bigbluebutton-users/ :application nil :search-option nil) Compared to last year's stats) : ) (table (:standard-properties [19131 19131 19131 19509 19510 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14] :type org :tblfm nil :value nil) (table-row (:standard-properties [19131 19131 19132 19184 19185 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [19132 nil 19169 19169 19170 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16])) (table-cell (:standard-properties [19170 nil 19171 19175 19177 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 2023) (table-cell (:standard-properties [19177 nil 19178 19182 19184 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 2024)) (table-row (:standard-properties [19185 19185 nil nil 19239 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type rule)) (table-row (:standard-properties [19239 19239 19240 19292 19293 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [19240 nil 19241 19273 19278 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Max number of simultaneous users) (table-cell (:standard-properties [19278 nil 19279 19281 19285 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 62) (table-cell (:standard-properties [19285 nil 19287 19290 19292 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 107)) (table-row (:standard-properties [19293 19293 19294 19346 19347 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [19294 nil 19295 19330 19332 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Max number of simultaneous meetings) (table-cell (:standard-properties [19332 nil 19333 19334 19339 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 6) (table-cell (:standard-properties [19339 nil 19343 19344 19346 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 7)) (table-row (:standard-properties [19347 19347 19348 19400 19401 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [19348 nil 19349 19384 19386 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Max number of people in one meeting) (table-cell (:standard-properties [19386 nil 19387 19389 19393 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 27) (table-cell (:standard-properties [19393 nil 19396 19398 19400 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 25)) (table-row (:standard-properties [19401 19401 19402 19454 19455 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [19402 nil 19403 19422 19440 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Total unique people) (table-cell (:standard-properties [19440 nil 19441 19443 19447 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 84) (table-cell (:standard-properties [19447 nil 19449 19452 19454 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 102)) (table-row (:standard-properties [19455 19455 19456 19508 19509 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [19456 nil 19457 19477 19494 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Total unique talking) (table-cell (:standard-properties [19494 nil 19495 19497 19501 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 36) (table-cell (:standard-properties [19501 nil 19504 19506 19508 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 40))) (paragraph (:standard-properties [19510 19510 19510 19617 19618 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) (Max number of simultaneous users wasn't deduplicated, since we need that number for server load planning) ))) (headline (:standard-properties [19618 19618 19645 20534 20534 0 (:title) nil nil nil nil 19720 20532 2 posts.org<2> nil nil #12] :pre-blank 0 :raw-value Tech checks and hosting :title (Tech checks and hosting) :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :footnote-section-p [org-element-deferred org-element--headline-footnote-section-p nil nil] :archivedp [org-element-deferred org-element--headline-archivedp nil nil] :commentedp nil :CUSTOM_ID emacsconf-2024-notes-tech-checks-and-hosting) (section (:standard-properties [19645 19645 19645 20534 20534 0 nil section nil nil nil 19645 20534 nil posts.org<2> nil nil #13]) (paragraph (:standard-properties [19722 19722 19722 19902 19903 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) FlowyCoder did a great job getting everyone checked in, especially once I figured out the right checklist to use. We used people's emergency contact information a couple of times. ) (paragraph (:standard-properties [19903 19903 19903 20265 20266 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) Corwin and Leo were able to jump in and out of the different streams for hosting. Sometimes they were both in the same Q&A session, which made it more conversational especially when they were covering for technical issues. We had a couple of crashes even though the tech checks went fine, so that was weird. Maybe something's up with BBB 3.0 or how I set it up. ) (paragraph (:standard-properties [20266 20266 20266 20533 20534 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) Next time, we can consider asking speakers what kind of facilitation style they like. A chatty host? Someone who focuses on reading the questions and then gets out of the way? Speakers reading their own questions and the host focusing on timekeeping/troubleshooting? ))) (headline (:standard-properties [20534 20534 20547 22382 22382 0 (:title) nil nil nil nil 20608 22380 2 posts.org<2> nil nil #12] :pre-blank 0 :raw-value Streaming :title (Streaming) :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :footnote-section-p [org-element-deferred org-element--headline-footnote-section-p nil nil] :archivedp [org-element-deferred org-element--headline-archivedp nil nil] :commentedp nil :CUSTOM_ID emacsconf-2024-notes-streaming) (section (:standard-properties [20547 20547 20547 22382 22382 0 nil section nil nil nil 20547 22382 nil posts.org<2> nil nil #13]) (paragraph (:standard-properties [20610 20610 20610 20809 20810 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) I experimented with setting up the live0 streaming node as a 64GB 32core dedicated CPU server, but that was overkill, so we went back down to 64GB 16core and it still didn't approach the CPU limits. ) (paragraph (:standard-properties [20810 20810 20810 21067 21068 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) The 480p stream seemed stable, hooray! I had set it up last year to automatically kick in as soon as I started streaming to Icecast, and that worked out. I think I changed a loop to be (code (:standard-properties [20995 nil nil nil 21007 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :value [org-element-deferred org-element--substring (1 11) t])) instead of making it try 5 times, so that probably helped. ) (paragraph (:standard-properties [21068 21068 21068 21447 21448 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) I couldn't get Toobnix livestreaming to work this year. On the plus side, that meant that I could use OBS to directly stream to YouTube instead of trying to set up multicasting. I set up one YouTube livestreaming event for each shift and added the RTMP keys to our shift checklists so that I could update the settings before starting the stream. That was pretty straightforward. ) (paragraph (:standard-properties [21448 21448 21448 22023 22024 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) This year, I wrote a little randomizer function to display things on the countdown screen. At first I just dumped in (link (:standard-properties [21565 nil nil nil 21620 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //www.gnu.org/fun/jokes/gnuemacs.acro.exp.en.html :format plain :raw-link https://www.gnu.org/fun/jokes/gnuemacs.acro.exp.en.html :application nil :search-option nil)) , but some of those were not quite what I was looking for. (... Probably should've read them all first!) Then I added random packages from GNU ELPA and NonGNU ELPA, and that was more fun. I might add MELPA next time too. The code for dumping random packages is probably worth putting into a different blog post, since it's the sort of thing people might like to add to their dashboards or screensavers. ) (paragraph (:standard-properties [22024 22024 22024 22164 22165 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) I ran into some C-s annoyances in screen even with flow control turned off, so it might be a good idea to switch to tmux instead of screen. ) (paragraph (:standard-properties [22165 22165 22165 22381 22382 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) Next year, I think it might be a good idea to make intro images for each talk. Then we can use that as the opening slide in BigBlueButton (unless they're already sharing something else) as well as a video thumbnail. ))) (headline (:standard-properties [22382 22382 22396 22976 22976 0 (:title) nil nil nil nil 22458 22974 2 posts.org<2> nil nil #12] :pre-blank 0 :raw-value Publishing :title (Publishing) :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :footnote-section-p [org-element-deferred org-element--headline-footnote-section-p nil nil] :archivedp [org-element-deferred org-element--headline-archivedp nil nil] :commentedp nil :CUSTOM_ID emacsconf-2024-notes-publishing) (section (:standard-properties [22396 22396 22396 22976 22976 0 nil section nil nil nil 22396 22976 nil posts.org<2> nil nil #13]) (paragraph (:standard-properties [22460 22460 22460 22704 22705 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) The automated process for publishing talks and transcripts to the wiki occasionally needed nudging when someone else had committed a change to the wiki. I thought I had a (code (:standard-properties [22631 nil nil nil 22642 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :value [org-element-deferred org-element--substring (1 9) t])) in there somewhere, but maybe I need to look at it some more. ) (paragraph (:standard-properties [22705 22705 22705 22975 22976 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) I forgot to switch the conference publishing phase and enable the inclusion of Etherpads, but fortunately Ihor noticed. I did some last-minute hacking to add them in, and then I remembered the variables I needed to set. Just need to add it to our process documentation. ))) (headline (:standard-properties [22976 22976 22988 23859 23859 0 (:title) nil nil nil nil 23048 23857 2 posts.org<2> nil nil #12] :pre-blank 0 :raw-value Etherpad :title (Etherpad) :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :footnote-section-p [org-element-deferred org-element--headline-footnote-section-p nil nil] :archivedp [org-element-deferred org-element--headline-archivedp nil nil] :commentedp nil :CUSTOM_ID emacsconf-2024-notes-etherpad) (section (:standard-properties [22988 22988 22988 23859 23859 0 nil section nil nil nil 22988 23859 nil posts.org<2> nil nil #13]) (paragraph (:standard-properties [23050 23050 23050 23296 23297 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) We used (link (:standard-properties [23058 nil 23083 23091 23094 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //etherpad.org/ :format bracket :raw-link https://etherpad.org/ :application nil :search-option nil) Etherpad) 1.9.7 to collect Q&A again this year. I didn't upgrade to Etherpad v2.x because I couldn't figure out how to get it running within the time I set aside for it, but maybe that's something for next year. ) (paragraph (:standard-properties [23297 23297 23297 23586 23587 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) I wrote some Elisp to copy the current ERC line (unwrapped) for easier pasting into Etherpad. That worked out really well, and it let me keep up with copying questions from IRC to the pad in between other bits of running around. ( (code (:standard-properties [23527 nil nil nil 23548 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :value [org-element-deferred org-element--substring (1 19) t])) in (link (:standard-properties [23551 nil nil nil 23584 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type emacsconf-el :type-explicit-p t :path emacsconf-erc.el :format bracket :raw-link emacsconf-el:emacsconf-erc.el :application nil :search-option nil)) ) ) (paragraph (:standard-properties [23587 23587 23587 23700 23701 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) Next year, I'll add pronouns and pronunciations to the Etherpad template so that hosts can refer to them easily. ) (paragraph (:standard-properties [23701 23701 23701 23858 23859 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) If I rejig the template to move the next/previous links so that notes can be added to the end, I might be able to use the Etherpad API to add text from IRC. ))) (headline (:standard-properties [23859 23859 23866 24458 24458 0 (:title) nil nil nil nil 23921 24456 2 posts.org<2> nil nil #12] :pre-blank 0 :raw-value IRC :title (IRC) :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :footnote-section-p [org-element-deferred org-element--headline-footnote-section-p nil nil] :archivedp [org-element-deferred org-element--headline-archivedp nil nil] :commentedp nil :CUSTOM_ID emacsconf-2024-notes-irc) (section (:standard-properties [23866 23866 23866 24458 24458 0 nil section nil nil nil 23866 24458 nil posts.org<2> nil nil #13]) (paragraph (:standard-properties [23923 23923 23923 24074 24075 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) We remembered to give the libera.chat people a heads-up before the conference, so we didn't run into usage limits for (link (:standard-properties [24041 nil nil nil 24067 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //chat.emacsconf.org :format plain :raw-link https://chat.emacsconf.org :application nil :search-option nil)) . Yay! ) (paragraph (:standard-properties [24075 24075 24075 24332 24333 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) Aside from writing (code (:standard-properties [24094 nil nil nil 24114 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :value [org-element-deferred org-element--substring (1 19) t])) ( (link (:standard-properties [24116 nil 24149 24165 24167 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type emacsconf-el :type-explicit-p t :path emacsconf-erc.el :format bracket :raw-link emacsconf-el:emacsconf-erc.el :application nil :search-option nil) emacsconf-erc.el) ) to make it easier to add text from IRC to the Etherpad, I didn't tinker much with the IRC setup for this year. It continued to be a solid platform for discussion. ) (paragraph (:standard-properties [24333 24333 24333 24457 24458 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) I think a keyboard shortcut for inserting a talk's URL could be handy and should be pretty easy to add to my Embark keymap. ))) (headline (:standard-properties [24458 24458 24480 26746 26746 0 (:title) nil nil nil nil 24550 26744 2 posts.org<2> nil nil #12] :pre-blank 0 :raw-value Extracting the Q&A :title (Extracting the Q&A) :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :footnote-section-p [org-element-deferred org-element--headline-footnote-section-p nil nil] :archivedp [org-element-deferred org-element--headline-archivedp nil nil] :commentedp nil :CUSTOM_ID emacsconf-2024-notes-extracting-the-q-a) (section (:standard-properties [24480 24480 24480 26746 26746 0 nil section nil nil nil 24480 26746 nil posts.org<2> nil nil #13]) (paragraph (:standard-properties [24552 24552 24552 24861 24862 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) We sometimes forgot to start the recording for the Q&A until a few minutes into the talk. I considered extracting the Q&A recordings from the Icecast dump or YouTube stream recordings in order to get those first few minutes, but decided it wasn't worth it since people could generally figure out the answers. ) (paragraph (:standard-properties [24862 24862 24862 25203 25204 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) Getting the recordings off BigBlueButton was easier this year because I configured it with (link (:standard-properties [24953 nil 25065 25105 25107 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //docs.bigbluebutton.org/3.0/administration/customize/#install-additional-recording-processing-formats :format bracket :raw-link https://docs.bigbluebutton.org/3.0/administration/customize/#install-additional-recording-processing-formats :application nil :search-option nil) video as an additional processing format) , so we could grab one file per session instead of combining the different streams with ffmpeg. ) (paragraph (:standard-properties [25204 25204 25204 25490 25491 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) I did a quick pass of the Q&A transcripts and chat logs to see if people mentioned anything that they might want to take out. I also copied IRC messages and the pads, and I copied over the answers from the transcripts using the new (code (:standard-properties [25436 nil nil nil 25479 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :value [org-element-deferred org-element--substring (1 42) t])) function. ) (paragraph (:standard-properties [25491 25491 25491 25905 25906 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) Audio mixing was uneven. It might be nice to figure out separate audio recordings just in case ( (link (:standard-properties [25587 nil 25650 25656 25658 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //github.com/bigbluebutton/bigbluebutton/issues/12302 :format bracket :raw-link https://github.com/bigbluebutton/bigbluebutton/issues/12302 :application nil :search-option nil) #12302) , (link (:standard-properties [25660 nil 25723 25740 25742 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //groups.google.com/g/bigbluebutton-dev/c/oPzJy0mKOrw :format bracket :raw-link https://groups.google.com/g/bigbluebutton-dev/c/oPzJy0mKOrw :application nil :search-option nil) bigbluebutton-dev) ). We ended up not tinkering with the audio for the Q&A, so next time, I can probably upload them without waiting to see if anyone wants to fiddle with the audio. ) (paragraph (:standard-properties [25906 25906 25906 26073 26074 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) Trimming the Q&A was pretty straightforward. I added a (code (:standard-properties [25961 nil nil nil 25985 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :value [org-element-deferred org-element--substring (1 22) t])) function to (link (:standard-properties [25997 nil 26032 26037 26039 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //github.com/sachac/subed :format bracket :raw-link https://github.com/sachac/subed :application nil :search-option nil) subed) so that I can trim files easily. ) (paragraph (:standard-properties [26074 26074 26074 26252 26253 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) Thanks to my completion functions for adding section headings based on comments, it was easy to index the Q&A this year. I didn't even put it up backstage for people to work on. ) (paragraph (:standard-properties [26253 26253 26253 26511 26512 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) Nudged by (link (:standard-properties [26263 nil 26318 26326 26328 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //mastodon.social/@ctietze/113627423761735937 :format bracket :raw-link https://mastodon.social/@ctietze/113627423761735937 :application nil :search-option nil) @ctietze) , I'm experimenting with adding sticky videos if Javascript is enabled so that it's easier to navigate using the transcript. There's still a bit of tinkering to do, but it's a start. ) (paragraph (:standard-properties [26512 26512 26512 26745 26746 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) I added some conference-related variables to a (code (:standard-properties [26559 nil nil nil 26576 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :value [org-element-deferred org-element--substring (1 15) t])) file so that I can more easily update things even for past conferences. This is mostly related to publishing the captions on the wiki pages, which I do with Emacs Lisp. ))) (headline (:standard-properties [26746 26746 26770 27572 27572 0 (:title) nil nil nil nil 26842 27570 2 posts.org<2> nil nil #12] :pre-blank 0 :raw-value Budget and donations :title (Budget and donations) :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :footnote-section-p [org-element-deferred org-element--headline-footnote-section-p nil nil] :archivedp [org-element-deferred org-element--headline-archivedp nil nil] :commentedp nil :CUSTOM_ID emacsconf-2024-notes-budget-and-donations) (section (:standard-properties [26770 26770 26770 27572 27572 0 nil section nil nil nil 26770 27572 nil posts.org<2> nil nil #13]) (paragraph (:standard-properties [26844 26844 26844 26880 26881 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) Costs (USD, not including 13% tax): ) (table (:standard-properties [26881 26881 26881 27055 27056 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14] :type org :tblfm nil :value nil) (table-row (:standard-properties [26881 26881 26882 26938 26939 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [26882 nil 26883 26888 26890 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 52.54) (table-cell (:standard-properties [26890 nil 26891 26926 26938 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Extra costs for hosting in December)) (table-row (:standard-properties [26939 26939 26940 26996 26997 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [26940 nil 26942 26946 26948 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 3.11) (table-cell (:standard-properties [26948 nil 26949 26988 26996 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Extra costs for BBB testing in November)) (table-row (:standard-properties [26997 26997 26998 27054 27055 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [26998 nil 27001 27004 27006 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 120) (table-cell (:standard-properties [27006 nil 27007 27052 27054 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Hosting costs year-round (two Linode nanodes)))) (paragraph (:standard-properties [27056 27056 27056 27107 27108 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) Total of USD 175.65 + tax, or USD 198.48 for 2024. ) (paragraph (:standard-properties [27108 27108 27108 27298 27299 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) The Free Software Foundation also provided (link (:standard-properties [27151 nil 27182 27201 27204 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //media.emacsconf.org :format bracket :raw-link https://media.emacsconf.org :application nil :search-option nil) media.emacsconf.org) for serving media files. Ry P provided res.emacsconf.org for OBS streaming over VNC sessions. ) (paragraph (:standard-properties [27299 27299 27299 27571 27572 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) Amin Bandali was away during the conference weekend and no one else knew how to get the list of donors and current donation stats from the FSF Working Together program on short notice. Next time, we can get that sorted out beforehand so that we can thank donors properly. ))) (headline (:standard-properties [27572 27572 27598 30144 30144 0 (:title) nil nil nil nil 27672 30142 2 posts.org<2> nil nil #12] :pre-blank 0 :raw-value Documentation and time :title (Documentation and time) :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :footnote-section-p [org-element-deferred org-element--headline-footnote-section-p nil nil] :archivedp [org-element-deferred org-element--headline-archivedp nil nil] :commentedp nil :CUSTOM_ID emacsconf-2024-notes-documentation-and-time) (section (:standard-properties [27598 27598 27598 30144 30144 0 nil section nil nil nil 27598 30144 nil posts.org<2> nil nil #13]) (paragraph (:standard-properties [27674 27674 27674 27959 27960 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) I think my biggest challenge was having less time to prepare for EmacsConf this year because the kiddo wanted more of my attention. In many ways, the automation that I'd been gradually building up paid off. We were able to pull together EmacsConf even though I had limited focus time. ) (paragraph (:standard-properties [27960 27960 27960 28041 28042 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) Here's my Emacs-related time data (including Emacs News and tweaking my config): ) (table (:standard-properties [28042 28042 28042 28466 28467 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14] :type org :tblfm nil :value nil) (table-row (:standard-properties [28042 28042 28043 28147 28148 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [28043 nil 28044 28048 28050 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Year) (table-cell (:standard-properties [28050 nil 28052 28055 28057 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Jan) (table-cell (:standard-properties [28057 nil 28059 28062 28064 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Feb) (table-cell (:standard-properties [28064 nil 28065 28070 28072 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) March) (table-cell (:standard-properties [28072 nil 28073 28078 28080 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) April) (table-cell (:standard-properties [28080 nil 28082 28085 28087 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) May) (table-cell (:standard-properties [28087 nil 28088 28092 28094 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) June) (table-cell (:standard-properties [28094 nil 28095 28099 28101 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) July) (table-cell (:standard-properties [28101 nil 28103 28106 28108 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Aug) (table-cell (:standard-properties [28108 nil 28109 28113 28115 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Sept) (table-cell (:standard-properties [28115 nil 28118 28121 28123 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Oct) (table-cell (:standard-properties [28123 nil 28126 28129 28131 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Nov) (table-cell (:standard-properties [28131 nil 28134 28137 28139 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Dec) (table-cell (:standard-properties [28139 nil 28140 28145 28147 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Total)) (table-row (:standard-properties [28148 28148 nil nil 28254 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type rule)) (table-row (:standard-properties [28254 28254 28255 28359 28360 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [28255 nil 28256 28260 28262 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 2023) (table-cell (:standard-properties [28262 nil 28263 28267 28269 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 23.4) (table-cell (:standard-properties [28269 nil 28270 28274 28276 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 15.9) (table-cell (:standard-properties [28276 nil 28278 28282 28284 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 16.2) (table-cell (:standard-properties [28284 nil 28286 28290 28292 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 11.2) (table-cell (:standard-properties [28292 nil 28294 28297 28299 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 4.4) (table-cell (:standard-properties [28299 nil 28300 28304 28306 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 11.5) (table-cell (:standard-properties [28306 nil 28308 28311 28313 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 6.5) (table-cell (:standard-properties [28313 nil 28314 28318 28320 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 13.3) (table-cell (:standard-properties [28320 nil 28321 28325 28327 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 36.6) (table-cell (:standard-properties [28327 nil 28329 28333 28335 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 86.6) (table-cell (:standard-properties [28335 nil 28337 28341 28343 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 93.2) (table-cell (:standard-properties [28343 nil 28344 28349 28351 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 113.0) (table-cell (:standard-properties [28351 nil 28354 28357 28359 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 432)) (table-row (:standard-properties [28360 28360 28361 28465 28466 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [28361 nil 28362 28366 28368 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 2024) (table-cell (:standard-properties [28368 nil 28369 28373 28375 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 71.2) (table-cell (:standard-properties [28375 nil 28376 28380 28382 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 12.0) (table-cell (:standard-properties [28382 nil 28385 28388 28390 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 5.6) (table-cell (:standard-properties [28390 nil 28393 28396 28398 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 6.6) (table-cell (:standard-properties [28398 nil 28400 28403 28405 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 3.3) (table-cell (:standard-properties [28405 nil 28407 28410 28412 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 9.6) (table-cell (:standard-properties [28412 nil 28413 28417 28419 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 11.0) (table-cell (:standard-properties [28419 nil 28421 28424 28426 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 4.7) (table-cell (:standard-properties [28426 nil 28427 28431 28433 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 36.0) (table-cell (:standard-properties [28433 nil 28435 28439 28441 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 40.3) (table-cell (:standard-properties [28441 nil 28443 28447 28449 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 52.3) (table-cell (:standard-properties [28449 nil 28451 28455 28457 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 67.7) (table-cell (:standard-properties [28457 nil 28460 28463 28465 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 320))) (paragraph (:standard-properties [28467 28467 28467 28617 28618 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) (and here's a (link (:standard-properties [28481 nil 28573 28612 28614 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //sachachua.com/blog/2023/12/analyzing-my-emacs-time-over-the-last-11-years-or-so/ :format bracket :raw-link https://sachachua.com/blog/2023/12/analyzing-my-emacs-time-over-the-last-11-years-or-so/ :application nil :search-option nil) longer-term analysis going back to 2012) .) ) (paragraph (:standard-properties [28618 28618 28618 29188 29189 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) I spent 92.6 hours total in October and November 2024 doing Emacs-related things, compared to 179.8 hours the previous year -- so, around half the time. Part of the 2023 total was related to preparing my presentation for EmacsConf, so I was much more familiar with my scripts then. Apparently, there was still a lot more that I needed to document. As I scrambled to get EmacsConf sorted out, I captured quick tasks/notes for the things I need to add to our organizers notebook. Now I get to go through all those notes in my inbox. Maybe next year will be even smoother. ) (paragraph (:standard-properties [29189 29189 29189 29713 29714 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) On the plus side, all the process-related improvements meant that the other volunteers could jump in pretty much whenever they wanted, including during the conference itself. I didn't want to impose firm commitments on people or bug them too much by e-mail, so we kept things very chill in terms of scheduling and planning. If people were available, we had stuff people could help with. If people were busy, that was fine, we could manage. This was nice, especially when I applied the same sort of chill approach to myself. ) (paragraph (:standard-properties [29714 29714 29714 30143 30144 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) I'd like to eventually get to the point of being able to mostly follow my checklists and notes from the start of the conference planning process to the end. I've been moving notes from year-specific organizer notebooks to the main (link (:standard-properties [29945 nil 29991 30011 30013 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //emacsconf.org/organizers-notebook/ :format bracket :raw-link https://emacsconf.org/organizers-notebook/ :application nil :search-option nil) organizers' notebook) . I plan to keep that one as the main file for notes and processes, and then to have specific dates and notes in the yearly ones. ))) (headline (:standard-properties [30144 30144 30155 31757 31757 0 (:title) nil nil nil nil 30157 31755 2 posts.org<2> nil nil #12] :pre-blank 1 :raw-value Thanks :title (Thanks) :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :footnote-section-p [org-element-deferred org-element--headline-footnote-section-p nil nil] :archivedp [org-element-deferred org-element--headline-archivedp nil nil] :commentedp nil) (section (:standard-properties [30155 30155 30155 31757 31757 0 nil section nil nil nil 30155 31757 nil posts.org<2> nil nil #13]) (plain-list (:standard-properties [30155 30155 30155 31756 31757 1 nil planning nil nil nil nil nil nil posts.org<2> nil ((30155 0 - nil nil nil 30308) (30308 0 - nil nil nil 30416) (30416 0 - nil nil nil 30542) (30542 0 - nil nil nil 30692) (30692 0 - nil nil nil 30772) (30772 0 - nil nil nil 30838) (30838 0 - nil nil nil 30936) (30936 0 - nil nil nil 30971) (30971 0 - nil nil nil 31044) (31044 0 - nil nil nil 31138) (31138 0 - nil nil nil 31369) (31369 0 - nil nil nil 31734) (31734 0 - nil nil nil 31756)) #14] :type unordered) (item (:standard-properties [30155 30155 30157 30308 30308 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((30155 0 - nil nil nil 30308) (30308 0 - nil nil nil 30416) (30416 0 - nil nil nil 30542) (30542 0 - nil nil nil 30692) (30692 0 - nil nil nil 30772) (30772 0 - nil nil nil 30838) (30838 0 - nil nil nil 30936) (30936 0 - nil nil nil 30971) (30971 0 - nil nil nil 31044) (31044 0 - nil nil nil 31138) (31138 0 - nil nil nil 31369) (31369 0 - nil nil nil 31734) (31734 0 - nil nil nil 31756)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [30157 30157 30157 30308 30308 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Thank you to all the speakers, volunteers, and participants, and to all those other people in our lives who make it possible through time and support. )) (item (:standard-properties [30308 30308 30310 30416 30416 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((30155 0 - nil nil nil 30308) (30308 0 - nil nil nil 30416) (30416 0 - nil nil nil 30542) (30542 0 - nil nil nil 30692) (30692 0 - nil nil nil 30772) (30772 0 - nil nil nil 30838) (30838 0 - nil nil nil 30936) (30936 0 - nil nil nil 30971) (30971 0 - nil nil nil 31044) (31044 0 - nil nil nil 31138) (31138 0 - nil nil nil 31369) (31369 0 - nil nil nil 31734) (31734 0 - nil nil nil 31756)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [30310 30310 30310 30416 30416 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Thanks to Leo Vivier and Corwin Brust for hosting the sessions, and to FlowyCoder for checking people in. )) (item (:standard-properties [30416 30416 30418 30542 30542 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((30155 0 - nil nil nil 30308) (30308 0 - nil nil nil 30416) (30416 0 - nil nil nil 30542) (30542 0 - nil nil nil 30692) (30692 0 - nil nil nil 30772) (30772 0 - nil nil nil 30838) (30838 0 - nil nil nil 30936) (30936 0 - nil nil nil 30971) (30971 0 - nil nil nil 31044) (31044 0 - nil nil nil 31138) (31138 0 - nil nil nil 31369) (31369 0 - nil nil nil 31734) (31734 0 - nil nil nil 31756)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [30418 30418 30418 30542 30542 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Thanks to our proposal review volunteers James Howell, JC Helary, and others for helping with the early acceptance process. )) (item (:standard-properties [30542 30542 30544 30692 30692 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((30155 0 - nil nil nil 30308) (30308 0 - nil nil nil 30416) (30416 0 - nil nil nil 30542) (30542 0 - nil nil nil 30692) (30692 0 - nil nil nil 30772) (30772 0 - nil nil nil 30838) (30838 0 - nil nil nil 30936) (30936 0 - nil nil nil 30971) (30971 0 - nil nil nil 31044) (31044 0 - nil nil nil 31138) (31138 0 - nil nil nil 31369) (31369 0 - nil nil nil 31734) (31734 0 - nil nil nil 31756)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [30544 30544 30544 30692 30692 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Thanks to our captioning volunteers: Mark Lewin, Rodrigo Morales, Anush, annona, and James Howell, and some speakers who captioned their own talks. )) (item (:standard-properties [30692 30692 30694 30772 30772 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((30155 0 - nil nil nil 30308) (30308 0 - nil nil nil 30416) (30416 0 - nil nil nil 30542) (30542 0 - nil nil nil 30692) (30692 0 - nil nil nil 30772) (30772 0 - nil nil nil 30838) (30838 0 - nil nil nil 30936) (30936 0 - nil nil nil 30971) (30971 0 - nil nil nil 31044) (31044 0 - nil nil nil 31138) (31138 0 - nil nil nil 31369) (31369 0 - nil nil nil 31734) (31734 0 - nil nil nil 31756)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [30694 30694 30694 30772 30772 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Thanks to Leo Vivier for fiddling with the audio to get things nicely synced. )) (item (:standard-properties [30772 30772 30774 30838 30838 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((30155 0 - nil nil nil 30308) (30308 0 - nil nil nil 30416) (30416 0 - nil nil nil 30542) (30542 0 - nil nil nil 30692) (30692 0 - nil nil nil 30772) (30772 0 - nil nil nil 30838) (30838 0 - nil nil nil 30936) (30936 0 - nil nil nil 30971) (30971 0 - nil nil nil 31044) (31044 0 - nil nil nil 31138) (31138 0 - nil nil nil 31369) (31369 0 - nil nil nil 31734) (31734 0 - nil nil nil 31756)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [30774 30774 30774 30838 30838 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Thanks to volunteers who kept the mailing lists free from spam. )) (item (:standard-properties [30838 30838 30840 30936 30936 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((30155 0 - nil nil nil 30308) (30308 0 - nil nil nil 30416) (30416 0 - nil nil nil 30542) (30542 0 - nil nil nil 30692) (30692 0 - nil nil nil 30772) (30772 0 - nil nil nil 30838) (30838 0 - nil nil nil 30936) (30936 0 - nil nil nil 30971) (30971 0 - nil nil nil 31044) (31044 0 - nil nil nil 31138) (31138 0 - nil nil nil 31369) (31369 0 - nil nil nil 31734) (31734 0 - nil nil nil 31756)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [30840 30840 30840 30936 30936 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Thanks to Bhavin Gandhi, Christopher Howard, Joseph Turner, and screwlisp for quality-checking. )) (item (:standard-properties [30936 30936 30938 30971 30971 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((30155 0 - nil nil nil 30308) (30308 0 - nil nil nil 30416) (30416 0 - nil nil nil 30542) (30542 0 - nil nil nil 30692) (30692 0 - nil nil nil 30772) (30772 0 - nil nil nil 30838) (30838 0 - nil nil nil 30936) (30936 0 - nil nil nil 30971) (30971 0 - nil nil nil 31044) (31044 0 - nil nil nil 31138) (31138 0 - nil nil nil 31369) (31369 0 - nil nil nil 31734) (31734 0 - nil nil nil 31756)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [30938 30938 30938 30971 30971 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Thanks to shoshin for the music. )) (item (:standard-properties [30971 30971 30973 31044 31044 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((30155 0 - nil nil nil 30308) (30308 0 - nil nil nil 30416) (30416 0 - nil nil nil 30542) (30542 0 - nil nil nil 30692) (30692 0 - nil nil nil 30772) (30772 0 - nil nil nil 30838) (30838 0 - nil nil nil 30936) (30936 0 - nil nil nil 30971) (30971 0 - nil nil nil 31044) (31044 0 - nil nil nil 31138) (31138 0 - nil nil nil 31369) (31369 0 - nil nil nil 31734) (31734 0 - nil nil nil 31756)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [30973 30973 30973 31044 31044 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Thanks to Amin Bandali for help with infrastructure and communication. )) (item (:standard-properties [31044 31044 31046 31138 31138 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((30155 0 - nil nil nil 30308) (30308 0 - nil nil nil 30416) (30416 0 - nil nil nil 30542) (30542 0 - nil nil nil 30692) (30692 0 - nil nil nil 30772) (30772 0 - nil nil nil 30838) (30838 0 - nil nil nil 30936) (30936 0 - nil nil nil 30971) (30971 0 - nil nil nil 31044) (31044 0 - nil nil nil 31138) (31138 0 - nil nil nil 31369) (31369 0 - nil nil nil 31734) (31734 0 - nil nil nil 31756)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [31046 31046 31046 31138 31138 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Thanks to Ry P for the server that we're using for OBS streaming and for processing videos. )) (item (:standard-properties [31138 31138 31140 31369 31369 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((30155 0 - nil nil nil 30308) (30308 0 - nil nil nil 30416) (30416 0 - nil nil nil 30542) (30542 0 - nil nil nil 30692) (30692 0 - nil nil nil 30772) (30772 0 - nil nil nil 30838) (30838 0 - nil nil nil 30936) (30936 0 - nil nil nil 30971) (30971 0 - nil nil nil 31044) (31044 0 - nil nil nil 31138) (31138 0 - nil nil nil 31369) (31369 0 - nil nil nil 31734) (31734 0 - nil nil nil 31756)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [31140 31140 31140 31369 31369 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Thanks to the Free Software Foundation for Emacs itself, the mailing lists, the media.emacsconf.org server, and handling donations on our behalf through the FSF Working Together program. (link (:standard-properties [31327 nil nil nil 31368 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #17] :type https :type-explicit-p t :path //www.fsf.org/working-together/fund :format plain :raw-link https://www.fsf.org/working-together/fund :application nil :search-option nil)) )) (item (:standard-properties [31369 31369 31371 31734 31734 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((30155 0 - nil nil nil 30308) (30308 0 - nil nil nil 30416) (30416 0 - nil nil nil 30542) (30542 0 - nil nil nil 30692) (30692 0 - nil nil nil 30772) (30772 0 - nil nil nil 30838) (30838 0 - nil nil nil 30936) (30936 0 - nil nil nil 30971) (30971 0 - nil nil nil 31044) (31044 0 - nil nil nil 31138) (31138 0 - nil nil nil 31369) (31369 0 - nil nil nil 31734) (31734 0 - nil nil nil 31756)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [31371 31371 31371 31734 31734 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Thanks to the many users and contributers and project teams that create all the awesome free software we use, especially: BigBlueButton, Etherpad, Icecast, OBS, TheLounge, libera.chat, ffmpeg, OpenAI Whisper, WhisperX, the aeneas forced alignment tool, PsiTransfer, subed, and many, many other tools and services we used to prepare and host this years conference )) (item (:standard-properties [31734 31734 31736 31756 31756 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((30155 0 - nil nil nil 30308) (30308 0 - nil nil nil 30416) (30416 0 - nil nil nil 30542) (30542 0 - nil nil nil 30692) (30692 0 - nil nil nil 30772) (30772 0 - nil nil nil 30838) (30838 0 - nil nil nil 30936) (30936 0 - nil nil nil 30971) (30971 0 - nil nil nil 31044) (31044 0 - nil nil nil 31138) (31138 0 - nil nil nil 31369) (31369 0 - nil nil nil 31734) (31734 0 - nil nil nil 31756)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [31736 31736 31736 31756 31756 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Thanks to everyone! ))))) (headline (:standard-properties [31757 31757 31768 32989 32989 0 (:title) nil nil nil nil 31827 32987 2 posts.org<2> nil nil #12] :pre-blank 0 :raw-value Overall :title (Overall) :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :footnote-section-p [org-element-deferred org-element--headline-footnote-section-p nil nil] :archivedp [org-element-deferred org-element--headline-archivedp nil nil] :commentedp nil :CUSTOM_ID emacsconf-2024-notes-overall) (section (:standard-properties [31768 31768 31768 32989 32989 0 nil section nil nil nil 31768 32989 nil posts.org<2> nil nil #13]) (paragraph (:standard-properties [31829 31829 31829 32047 32048 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) Good experience. Lots of fun. I'd love to do it again next year. EmacsConf feels like a nice, cozy get-together where people share the cool things they've been working on and thinking about. People had fun! They said: ) (plain-list (:standard-properties [32048 32048 32048 32329 32330 1 nil nil nil nil nil nil nil nil posts.org<2> nil ((32048 0 - nil nil nil 32142) (32142 0 - nil nil nil 32228) (32228 0 - nil nil nil 32329)) #14] :type unordered) (item (:standard-properties [32048 32048 32050 32142 32142 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((32048 0 - nil nil nil 32142) (32142 0 - nil nil nil 32228) (32228 0 - nil nil nil 32329)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [32050 32050 32050 32142 32142 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) "emacsconf is absolutely knocking it out of the park when it comes to conference logistics" )) (item (:standard-properties [32142 32142 32144 32228 32228 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((32048 0 - nil nil nil 32142) (32142 0 - nil nil nil 32228) (32228 0 - nil nil nil 32329)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [32144 32144 32144 32228 32228 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) "I think this conference has defined the terms for a successful online conference." )) (item (:standard-properties [32228 32228 32230 32329 32329 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((32048 0 - nil nil nil 32142) (32142 0 - nil nil nil 32228) (32228 0 - nil nil nil 32329)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [32230 32230 32230 32329 32329 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) "EmacsConf is one of the big highlights of my year every year. Thank you a ton for running this 😊" ))) (paragraph (:standard-properties [32330 32330 32330 32409 32410 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) It's one of the highlights of my year too. =) Looking forward to the next one! ) (paragraph (:standard-properties [32410 32410 32410 32685 32686 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) In the meantime, y'all can stay connected via (link (:standard-properties [32456 nil 32507 32517 32519 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //sachachua.com/blog/category/emacs-news/ :format bracket :raw-link https://sachachua.com/blog/category/emacs-news/ :application nil :search-option nil) Emacs News) , (link (:standard-properties [32521 nil 32550 32580 32582 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //emacs-berlin.org/ :format bracket :raw-link https://emacs-berlin.org/ :application nil :search-option nil) meetups (online and in person)) , (link (:standard-properties [32584 nil 32617 32633 32635 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //planet.emacslife.com/ :format bracket :raw-link https://planet.emacslife.com/ :application nil :search-option nil) Planet Emacslife) , and now (link (:standard-properties [32645 nil 32666 32674 32676 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //emacs.tv/ :format bracket :raw-link https://emacs.tv/ :application nil :search-option nil) emacs.tv) . Enjoy! ) (paragraph (:standard-properties [32686 32686 32686 32989 32989 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) p.s. I'd love to learn from other people's conference blog posts, EmacsConf or otherwise. I'm particularly interested in virtual conferences and how we can tinker with them to make them even better. I'm having a hard time finding posts; please feel free to send me links to ones you've liked or written!))))] :pre-blank 0 :raw-value Schedule :title (Schedule) :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :footnote-section-p [org-element-deferred org-element--headline-footnote-section-p nil nil] :archivedp [org-element-deferred org-element--headline-archivedp nil nil] :commentedp nil :CUSTOM_ID emacsconf-2024-notes-schedule) #6)]) (paragraph (:standard-properties [7853 7853 7853 8089 8090 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #6]) The schedule worked out to two days of talks, with two tracks on the first day, and about 15-20 minutes between each talk. We were able to adapt to late submissions, last-minute cancellations, and last-minute switches from Q&A to live. ) (paragraph (:standard-properties [8090 8090 8090 8474 8475 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #6]) We added an open mic session on Sunday to fill in the time from a last-minute cancellation. That worked out nicely and it might be a good idea to schedule in that time next year. It was also good to move some of the usual closing remarks earlier. We were able to wrap up in a timely manner, which was great for some hosts and participants because they didn't have to stay up so late. ) (paragraph (:standard-properties [8475 8475 8475 8782 8783 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #6]) Sunday was single-track, so it was nice and relaxed. I was a little worried that people might get bored if the current talk wasn't relevant to their interests, but everyone managed just fine. I probably should have remembered that Emacs people are good at turning extra time into more configuration tweaks. ) (paragraph (:standard-properties [8783 8783 8783 9101 9102 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #6]) Most of the scheduling was determined by people's time constraints, so I didn't worry too much about making the talks flow logically. I accidentally forgot to note down one speaker's time constraints, but he caught it when we e-mailed the draft schedule and I was able to move things around for a better time for him. ) (paragraph (:standard-properties [9102 9102 9102 9500 9501 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #6]) There was a tiny bit of technical confusion because the automated schedule publishing on res had case-sensitive matching ( (code (:standard-properties [9224 nil nil nil 9242 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #7] :value case-fold-search)) was set to (code (:standard-properties [9254 nil nil nil 9259 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #7] :value nil)) ), so if a talk was set to "Live" Q&A, it didn't announce it as a live talk because it was looking for (code (:standard-properties [9362 nil nil nil 9368 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #7] :value live)) . Whoops. I've added that configuration setting to my (code (:standard-properties [9422 nil nil nil 9450 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #7] :value emacsconf-stream-config.el)) , so the ansible scripts should get it next time. ) (paragraph (:standard-properties [9501 9501 9501 10021 10022 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #6]) I asked Leo and Corwin if they wanted to manually control the talks this year. They opted to leave it automatically managed by crontab so that they wouldn't have to worry as much about timekeeping. It worked reliably. Hooray for automation! The only scheduling hiccup was because I turned off the crontab so that we could do Saturday closing remarks when we wanted to and I forgot to reenable autopilot the next day. We noticed when the opening remarks didn't start right on the dot, and I got everything back on track. ) (paragraph (:standard-properties [10022 10022 10022 10305 10306 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #6]) Like last year, I scheduled the dev track to start a little later than the gen track. That made for a less frantic morning. Also, this year we scheduled Sunday morning to start with more IRC Q&A instead of live Q&A. We didn't notice any bandwidth issues on Sunday morning this time. ) (paragraph (:standard-properties [10306 10306 10306 10499 10500 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #6]) It would be nice to have Javascript countdowns in some kind of web interface to make it easier for hosts, especially if we can update it with the actual time the current video will end in MPV. ) #3 (paragraph (:standard-properties [10647 10647 10647 10795 10796 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #6]) We have Javascript showing local time on the individual talk pages, but it would be nice to localize the times on all the schedule/watch pages too. ) (paragraph (:standard-properties [10796 10796 10796 11018 11019 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #6]) Most of my stuff (scheduling, publishing, etc.) is handled by automation with just a little bit of manual nudging every so often, so it might be possible to organize an event that's more friendly to Europe/APAC timezones. ))]) I can also update the #0 code to make it easier to automatically count down to the next talk or to a specific talk. )] :type emacsconf-el :type-explicit-p t :path emacsconf-stream.el :format plain :raw-link emacsconf-el:emacsconf-stream.el :application nil :search-option nil)) code to make it easier to automatically count down to the next talk or to a specific talk.

We have Javascript showing local time on the individual talk pages, but it would be nice to localize the times on all the schedule/watch pages too.

Most of my stuff (scheduling, publishing, etc.) is handled by automation with just a little bit of manual nudging every so often, so it might be possible to organize an event that's more friendly to Europe/APAC timezones.

Recorded videos

As usual, we strongly encouraged speakers to record videos to lower everyone's stress levels and allow for captioning by volunteers, so that's what most speakers did. We were able to handle a few last-minute submissions as well as a live talk. Getting videos also meant we could publish them as each talk went live, including automatically putting the videos and transcripts on the wiki.

We didn't have obvious video encoding cut-offs, so re-encoding in a screen was a reliable way to avoid interruptions this year. Also, no one complained about tiny text or low resolution, so the talk preparation instructions seem to be working out.

Automatically normalizing the audio with ffmpeg-normalize didn't work out, so Leo Vivier did a last-minute scramble to normalize the audio the day before the conference. Maybe that's something that volunteers can help with during the lead-up to the conference, or maybe I can finally figure out how to fit that into my process. I don't have much time or patience to listen to things, but it would be nice to get that sorted out early.

Next year we can try remixing the audio to mono. One of the talks had some audio moving around, which was a little distracting. Also, some people listen to the talks in one ear, so it would be good to drop things down to mono for them.

We think 60fps videos stressed the res server a bit, resulting in dropped frames. Next year, we can downsample those to 30fps and add a note to the talk preparation instructions. The hosts also suggested looking into setting up streaming from each host's computer instead of using our shared VNC sessions.

There was some colour smearing and weirdness when we played some videos with mpv on res. Upgrading MPV to v0.38 fixed it.

Some people requested dark mode (light text on dark background), so maybe we can experiment with recommending that next year.

I did a last-minute change to the shell scripts to load resources from the cache directory instead of the assets/stream directory, but I didn't get all of the file references, so sometimes the test videos played or the introductions didn't have captions. On the plus side, I learned how to use j in MPV to reload a subtitle file.

Sometimes we needed to play the videos manually. If we get the hang of starting MPV in a screen or tmux session, it might be easier for hosts to check how much time is left, or to restart a video at a specific point if needed. Leo said he'll work on figuring out the configuration and the Lua scripts.

I uploaded all the videos to YouTube and scheduled them. That was nice because then I didn't have to keep updating things during the conference. It turns out that Toobnix also has a way to schedule uploads. I just need to upload it as unlisted first, and then choose Scheduled from the visibility. I wonder if peertube-cli can be extended to schedule things. Anyway, since I didn't know about that during the conference, I just used emacsconf-publish-upload-talk function to upload videos.

It was fun playing Interview with an Emacs Enthusiast in 2023 [Colorized] - YouTube at lunch. I put together some captions for it after the conference, so maybe we can play it with captions next year.

Recorded introductions

We record introductions so that hosts don't have to worry about how to say things on air. I should probably send the intro check e-mail earlier–maybe on the original video target date, even if speakers haven't submitted their videos yet. This will reduce the last-minute scramble to correct intros.

When I switched the shell scripts to use the cache directory, I forgot to get it to do the intros from that directory as well, so some of the uncorrected intros were played.

I forgot to copy the intro VTTs to the cache directory. This should be handled by the subed-record process for creating intros, so it'll be all sorted out next year.

Captioning

We used WhisperX for speech-to-text this year. It did a great job at preparing the first drafts of captions that our wonderful army of volunteer captioners could then edit. WhisperX's built-in voice activity detection cut down a lot on the hallucinations that OpenAI Whisper had during periods of silence in last year's captions, and there was only one instance of WhisperX missing a chunk of text from a speaker that I needed to manually fill in. I upgraded to a Lenovo P52 with 64GB RAM, so I was able to handle last-minute caption processing on my computer. It might be handy to have a smaller model ready for those last-minute requests, or have something ready to go for the commercial APIs.

The timestamps were a little bit off. It was really helpful that speakers and volunteers used the backstage area to check video quality. I used Aeneas to re-align the text, but Aeneas was also confused by silences. I've added some code to subed so that I can realign regions of subtitles using Aeneas or WhisperX timestamps, and I also wrote some code to skim timestamps for easy verification.

Anush V experimented with using machine learning for subtitle segmentation, so that might be something to explore going forward.

BigBlueButton web conference

This year we set up a new BigBlueButton web conferencing server. The server with our previous BigBlueButton instance had been donated by a defunct nonprofit, so it finally got removed on October 27. After investigating whether Jitsi or Galene might be a good fit for EmacsConf, we decided to continue with BigBlueButton. There were some concerns about non-free Mongo for BBB versions >= 2.3 and < 3, so I installed BBB 3.0. This was hard to get working on a Docker on the existing res server. We decided it was worth spinning up an additional Linode virtual private server. It turned out that BBB refused to run on anything smaller than 8GB/4core, so I scaled up to that during testing, scaled back down to 1GB/1core in between, and scaled up to 16GB/8core dedicated during the conference.

I'm still not 100% sure I set everything up correctly or that everything was stable. Maybe next year BBB 3.0 will be better-tested, someone more sysad-y can doublecheck the setup, or we can try Galene.

One of the benefits of upgrading to BBB 3.0 was that we could use the smart layout feature to drag the webcam thumbnails to the side of the shared screen. This made shared screens much easier to read. I haven't automated this yet, but it was easy enough for us to do via the shared VNC session.

On the plus side, it was pretty straightforward to use the Rails console to create all the rooms. We used moderator access codes to give all the speakers moderator access. Mysteriously, superadmins didn't automatically have moderator access to all the rooms even if they were logged in, so we needed to add host access by hand so that they could start the recordings.

Since we self-hosted and were budgeting more for the full-scale node, I didn't feel comfortable scaling it up to production size until a few days before the conference. I sent the access codes with the check-in e-mails to give speakers time to try things out.

Compared to last year's stats:

  2023 2024
Max number of simultaneous users 62 107
Max number of simultaneous meetings 6 7
Max number of people in one meeting 27 25
Total unique people 84 102
Total unique talking 36 40

(Max number of simultaneous users wasn't deduplicated, since we need that number for server load planning)

Tech checks and hosting

FlowyCoder did a great job getting everyone checked in, especially once I figured out the right checklist to use. We used people's emergency contact information a couple of times.

Corwin and Leo were able to jump in and out of the different streams for hosting. Sometimes they were both in the same Q&A session, which made it more conversational especially when they were covering for technical issues. We had a couple of crashes even though the tech checks went fine, so that was weird. Maybe something's up with BBB 3.0 or how I set it up.

Next time, we can consider asking speakers what kind of facilitation style they like. A chatty host? Someone who focuses on reading the questions and then gets out of the way? Speakers reading their own questions and the host focusing on timekeeping/troubleshooting?

Streaming

I experimented with setting up the live0 streaming node as a 64GB 32core dedicated CPU server, but that was overkill, so we went back down to 64GB 16core and it still didn't approach the CPU limits.

The 480p stream seemed stable, hooray! I had set it up last year to automatically kick in as soon as I started streaming to Icecast, and that worked out. I think I changed a loop to be while true instead of making it try 5 times, so that probably helped.

I couldn't get Toobnix livestreaming to work this year. On the plus side, that meant that I could use OBS to directly stream to YouTube instead of trying to set up multicasting. I set up one YouTube livestreaming event for each shift and added the RTMP keys to our shift checklists so that I could update the settings before starting the stream. That was pretty straightforward.

This year, I wrote a little randomizer function to display things on the countdown screen. At first I just dumped in https://www.gnu.org/fun/jokes/gnuemacs.acro.exp.en.html, but some of those were not quite what I was looking for. (… Probably should've read them all first!) Then I added random packages from GNU ELPA and NonGNU ELPA, and that was more fun. I might add MELPA next time too. The code for dumping random packages is probably worth putting into a different blog post, since it's the sort of thing people might like to add to their dashboards or screensavers.

I ran into some C-s annoyances in screen even with flow control turned off, so it might be a good idea to switch to tmux instead of screen.

Next year, I think it might be a good idea to make intro images for each talk. Then we can use that as the opening slide in BigBlueButton (unless they're already sharing something else) as well as a video thumbnail.

Publishing

The automated process for publishing talks and transcripts to the wiki occasionally needed nudging when someone else had committed a change to the wiki. I thought I had a git pull in there somewhere, but maybe I need to look at it some more.

I forgot to switch the conference publishing phase and enable the inclusion of Etherpads, but fortunately Ihor noticed. I did some last-minute hacking to add them in, and then I remembered the variables I needed to set. Just need to add it to our process documentation.

Etherpad

We used Etherpad 1.9.7 to collect Q&A again this year. I didn't upgrade to Etherpad v2.x because I couldn't figure out how to get it running within the time I set aside for it, but maybe that's something for next year.

I wrote some Elisp to copy the current ERC line (unwrapped) for easier pasting into Etherpad. That worked out really well, and it let me keep up with copying questions from IRC to the pad in between other bits of running around. (emacsconf-erc-copy in (link (:standard-properties [23551 nil nil nil 23584 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil (paragraph (:standard-properties [23297 23297 23297 23586 23587 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil (section (:standard-properties [22988 22988 22988 23859 23859 0 nil section nil nil nil 22988 23859 nil posts.org<2> nil nil (headline (:standard-properties [22976 22976 22988 23859 23859 0 (:title) nil nil nil nil 23048 23857 2 posts.org<2> nil nil (org-data (:standard-properties [1 1 1 261287 261287 0 nil org-data nil nil nil 3 261287 nil posts.org<2> nil nil nil] :path /home/sacha/sync/orgzly/posts.org :CATEGORY posts) (section (:standard-properties [1307 1307 1307 1964 1964 0 nil first-section nil nil nil 1307 1964 nil posts.org<2> nil nil #12]) (special-block (:standard-properties [1307 1307 1322 1669 1683 1 nil top-comment nil nil nil nil nil nil posts.org<2> nil nil #13] :type update :parameters nil) (plain-list (:standard-properties [1322 1322 1322 1669 1669 0 nil nil nil nil nil nil nil nil posts.org<2> nil ((1322 0 - nil nil nil 1487) (1487 0 - nil nil nil 1547) (1547 0 - nil nil nil 1669)) #14] :type unordered) (item (:standard-properties [1322 1322 1324 1487 1487 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((1322 0 - nil nil nil 1487) (1487 0 - nil nil nil 1547) (1547 0 - nil nil nil 1669)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [1324 1324 1324 1487 1487 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) (timestamp (:standard-properties [1324 nil nil nil 1336 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #17] :type inactive :range-type nil :raw-value [2025-01-10] :year-start 2025 :month-start 1 :day-start 10 :hour-start nil :minute-start nil :year-end 2025 :month-end 1 :day-end 10 :hour-end nil :minute-end nil)) : (link (:standard-properties [1338 nil 1387 1412 1415 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #17] :type https :type-explicit-p t :path //news.ycombinator.com/item?id=42531217 :format bracket :raw-link https://news.ycombinator.com/item?id=42531217 :application nil :search-option nil) Discussion on Hacker News) ( (link (:standard-properties [1416 nil 1452 1483 1485 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #17] :type https :type-explicit-p t :path //ditzes.com/item/42531217 :format bracket :raw-link https://ditzes.com/item/42531217 :application nil :search-option nil) comments in chronological order) ) )) (item (:standard-properties [1487 1487 1489 1547 1547 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((1322 0 - nil nil nil 1487) (1487 0 - nil nil nil 1547) (1547 0 - nil nil nil 1669)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [1489 1489 1489 1547 1547 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) (timestamp (:standard-properties [1489 nil nil nil 1501 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #17] :type inactive :range-type nil :raw-value [2025-01-02] :year-start 2025 :month-start 1 :day-start 2 :hour-start nil :minute-start nil :year-end 2025 :month-end 1 :day-end 2 :hour-end nil :minute-end nil)) : Add numbers based on latest Linode invoice. )) (item (:standard-properties [1547 1547 1549 1669 1669 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((1322 0 - nil nil nil 1487) (1487 0 - nil nil nil 1547) (1547 0 - nil nil nil 1669)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [1549 1549 1549 1669 1669 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) (timestamp (:standard-properties [1549 nil nil nil 1561 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #17] :type inactive :range-type nil :raw-value [2024-12-28] :year-start 2024 :month-start 12 :day-start 28 :hour-start nil :minute-start nil :year-end 2024 :month-end 12 :day-end 28 :hour-end nil :minute-end nil)) : Added talk and Q&A count, added note about BBB max simultaneous users, added note about BBB, added thanks )))) (paragraph (:standard-properties [1683 1683 1683 1939 1940 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #13]) (link (:standard-properties [1683 nil 1719 1748 1750 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14] :type https :type-explicit-p t :path //emacsconf.org/2024/talks :format bracket :raw-link https://emacsconf.org/2024/talks :application nil :search-option nil) The videos have been uploaded) , thank-you notes have been sent, and the kiddo has decided to play a little Minecraft on her own, so now I get to write some quick notes on (link (:standard-properties [1891 nil 1921 1935 1937 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14] :type https :type-explicit-p t :path //emacsconf.org/2024 :format bracket :raw-link https://emacsconf.org/2024 :application nil :search-option nil) EmacsConf 2024) . ) (keyword (:standard-properties [1940 1940 nil nil 1964 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #13] :key TOC :value headlines local))) (headline (:standard-properties [1964 1964 1973 3117 3117 0 (:title) nil nil nil nil 2030 3115 2 posts.org<2> nil nil #12] :pre-blank 0 :raw-value Stats :title (Stats) :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :footnote-section-p [org-element-deferred org-element--headline-footnote-section-p nil nil] :archivedp [org-element-deferred org-element--headline-archivedp nil nil] :commentedp nil :CUSTOM_ID emacsconf-2024-notes-stats) (section (:standard-properties [1973 1973 1973 3117 3117 0 nil section nil nil nil 1973 3117 nil posts.org<2> nil nil #13]) (drawer (:standard-properties [2032 2043 2053 2177 2185 2 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14] :drawer-name results :results ()) (table (:standard-properties [2053 2053 2053 2177 2177 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type org :tblfm nil :value nil) (table-row (:standard-properties [2053 2053 2054 2083 2084 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #16] :type standard) (table-cell (:standard-properties [2054 nil 2055 2060 2076 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #17]) Talks) (table-cell (:standard-properties [2076 nil 2079 2081 2083 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #17]) 31)) (table-row (:standard-properties [2084 2084 2085 2114 2115 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #16] :type standard) (table-cell (:standard-properties [2085 nil 2086 2091 2107 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #17]) Hours) (table-cell (:standard-properties [2107 nil 2108 2112 2114 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #17]) 10.7)) (table-row (:standard-properties [2115 2115 2116 2145 2146 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #16] :type standard) (table-cell (:standard-properties [2116 nil 2117 2136 2138 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #17]) Q&A web conferences) (table-cell (:standard-properties [2138 nil 2141 2143 2145 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #17]) 21)) (table-row (:standard-properties [2146 2146 2147 2176 2177 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #16] :type standard) (table-cell (:standard-properties [2147 nil 2148 2153 2169 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #17]) Hours) (table-cell (:standard-properties [2169 nil 2171 2174 2176 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #17]) 7.8)))) (plain-list (:standard-properties [2185 2185 2185 2311 2312 1 nil nil nil nil nil nil nil nil posts.org<2> nil ((2185 0 - nil nil nil 2267) (2197 2 - nil nil nil 2232) (2232 2 - nil nil nil 2267) (2267 0 - nil nil nil 2311) (2277 2 - nil nil nil 2311)) #14] :type unordered) (item (:standard-properties [2185 2185 2187 2267 2267 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((2185 0 - nil nil nil 2267) (2197 2 - nil nil nil 2232) (2232 2 - nil nil nil 2267) (2267 0 - nil nil nil 2311) (2277 2 - nil nil nil 2311)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [2187 2187 2187 2197 2197 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Saturday: ) (plain-list (:standard-properties [2197 2197 2197 2267 2267 0 nil nil nil nil nil nil nil nil posts.org<2> nil ((2185 0 - nil nil nil 2267) (2197 2 - nil nil nil 2232) (2232 2 - nil nil nil 2267) (2267 0 - nil nil nil 2311) (2277 2 - nil nil nil 2311)) #16] :type unordered) (item (:standard-properties [2197 2197 2201 2232 2232 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((2185 0 - nil nil nil 2267) (2197 2 - nil nil nil 2232) (2232 2 - nil nil nil 2267) (2267 0 - nil nil nil 2311) (2277 2 - nil nil nil 2311)) #17] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [2201 2201 2201 2232 2232 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #18]) gen: 177 peak + 14 peak lowres )) (item (:standard-properties [2232 2232 2236 2267 2267 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((2185 0 - nil nil nil 2267) (2197 2 - nil nil nil 2232) (2232 2 - nil nil nil 2267) (2267 0 - nil nil nil 2311) (2277 2 - nil nil nil 2311)) #17] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [2236 2236 2236 2267 2267 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #18]) dev: 226 peak + 79 peak lowres )))) (item (:standard-properties [2267 2267 2269 2311 2311 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((2185 0 - nil nil nil 2267) (2197 2 - nil nil nil 2232) (2232 2 - nil nil nil 2267) (2267 0 - nil nil nil 2311) (2277 2 - nil nil nil 2311)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [2269 2269 2269 2277 2277 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Sunday: ) (plain-list (:standard-properties [2277 2277 2277 2311 2311 0 nil nil nil nil nil nil nil nil posts.org<2> nil ((2185 0 - nil nil nil 2267) (2197 2 - nil nil nil 2232) (2232 2 - nil nil nil 2267) (2267 0 - nil nil nil 2311) (2277 2 - nil nil nil 2311)) #16] :type unordered) (item (:standard-properties [2277 2277 2281 2311 2311 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((2185 0 - nil nil nil 2267) (2197 2 - nil nil nil 2232) (2232 2 - nil nil nil 2267) (2267 0 - nil nil nil 2311) (2277 2 - nil nil nil 2311)) #17] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [2281 2281 2281 2311 2311 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #18]) gen: 89 peak + 10 peak lowres ))))) (paragraph (:standard-properties [2312 2312 2312 2334 2335 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) Server configuration: ) (table (:standard-properties [2335 2335 2335 2865 2866 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14] :type org :tblfm nil :value nil) (table-row (:standard-properties [2335 2335 2336 2440 2441 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [2336 nil 2337 2341 2344 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) meet) (table-cell (:standard-properties [2344 nil 2345 2365 2367 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 16GB 8core dedicated) (table-cell (:standard-properties [2367 nil 2368 2412 2440 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) peak 409% CPU (100% is 1 CPU), average 69.4%)) (table-row (:standard-properties [2441 2441 2442 2546 2547 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [2442 nil 2443 2448 2450 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) front) (table-cell (:standard-properties [2450 nil 2451 2468 2473 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 32GB 8core shared) (table-cell (:standard-properties [2473 nil 2474 2505 2546 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) peak 70.66% CPU (100% is 1 CPU))) (table-row (:standard-properties [2547 2547 2548 2652 2653 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [2548 nil 2549 2553 2556 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) live) (table-cell (:standard-properties [2556 nil 2557 2575 2579 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 64GB 16core shared) (table-cell (:standard-properties [2579 nil 2580 2622 2652 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) peak 552% CPU (100% is 1 CPU) average 144%)) (table-row (:standard-properties [2653 2653 2654 2758 2759 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [2654 nil 2655 2658 2662 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) res) (table-cell (:standard-properties [2662 nil 2663 2674 2685 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 46GB 12core) (table-cell (:standard-properties [2685 nil 2686 2756 2758 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) peak 81.54% total CPU (100% is 12 CPUs); each OBS ~250%), mem 7GB used)) (table-row (:standard-properties [2759 2759 2760 2864 2865 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [2760 nil 2761 2766 2768 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) media) (table-cell (:standard-properties [2768 nil 2769 2778 2791 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 3GB 1core) (table-cell (:standard-properties [2791 nil 2863 2863 2864 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16])))) (paragraph (:standard-properties [2866 2866 2866 2892 2893 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) YouTube livestream stats: ) (table (:standard-properties [2893 2893 2893 3117 3117 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14] :type org :tblfm nil :value nil) (table-row (:standard-properties [2893 2893 2894 2920 2921 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [2894 nil 2895 2900 2907 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Shift) (table-cell (:standard-properties [2907 nil 2908 2912 2914 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Peak) (table-cell (:standard-properties [2914 nil 2915 2918 2920 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Avg)) (table-row (:standard-properties [2921 2921 nil nil 2949 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type rule)) (table-row (:standard-properties [2949 2949 2950 2976 2977 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [2950 nil 2951 2961 2963 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Gen Sat AM) (table-cell (:standard-properties [2963 nil 2966 2968 2970 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 46) (table-cell (:standard-properties [2970 nil 2972 2974 2976 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 28)) (table-row (:standard-properties [2977 2977 2978 3004 3005 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [2978 nil 2979 2989 2991 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Gen Sat PM) (table-cell (:standard-properties [2991 nil 2994 2996 2998 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 24) (table-cell (:standard-properties [2998 nil 3000 3002 3004 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 16)) (table-row (:standard-properties [3005 3005 3006 3032 3033 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [3006 nil 3007 3017 3019 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Dev Sat AM) (table-cell (:standard-properties [3019 nil 3022 3024 3026 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 15) (table-cell (:standard-properties [3026 nil 3029 3030 3032 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 7)) (table-row (:standard-properties [3033 3033 3034 3060 3061 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [3034 nil 3035 3045 3047 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Dev Sat PM) (table-cell (:standard-properties [3047 nil 3050 3052 3054 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 20) (table-cell (:standard-properties [3054 nil 3056 3058 3060 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 12)) (table-row (:standard-properties [3061 3061 3062 3088 3089 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [3062 nil 3063 3073 3075 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Gen Sun AM) (table-cell (:standard-properties [3075 nil 3078 3080 3082 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 28) (table-cell (:standard-properties [3082 nil 3084 3086 3088 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 17)) (table-row (:standard-properties [3089 3089 3090 3116 3117 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [3090 nil 3091 3101 3103 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Gen Sun PM) (table-cell (:standard-properties [3103 nil 3106 3108 3110 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 26) (table-cell (:standard-properties [3110 nil 3112 3114 3116 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 18))))) (headline (:standard-properties [3117 3117 3129 4375 4375 0 (:title) nil nil nil nil 3189 4373 2 posts.org<2> nil nil #12] :pre-blank 0 :raw-value Timeline :title (Timeline) :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :footnote-section-p [org-element-deferred org-element--headline-footnote-section-p nil nil] :archivedp [org-element-deferred org-element--headline-archivedp nil nil] :commentedp nil :CUSTOM_ID emacsconf-2024-notes-timeline) (section (:standard-properties [3129 3129 3129 4375 4375 0 nil section nil nil nil 3129 4375 nil posts.org<2> nil nil #13]) (table (:standard-properties [3191 3191 3191 3563 3564 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14] :type org :tblfm nil :value nil) (table-row (:standard-properties [3191 3191 3192 3252 3253 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [3192 nil 3193 3211 3216 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Call for proposals) (table-cell (:standard-properties [3216 nil 3217 3233 3252 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) (timestamp (:standard-properties [3217 nil nil nil 3233 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #17] :type inactive :range-type nil :raw-value [2024-06-30 Sun] :year-start 2024 :month-start 6 :day-start 30 :hour-start nil :minute-start nil :year-end 2024 :month-end 6 :day-end 30 :hour-end nil :minute-end nil)))) (table-row (:standard-properties [3253 3253 3254 3314 3315 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [3254 nil 3255 3267 3278 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) CFP deadline) (table-cell (:standard-properties [3278 nil 3279 3295 3314 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) (timestamp (:standard-properties [3279 nil nil nil 3295 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #17] :type inactive :range-type nil :raw-value [2024-09-20 Fri] :year-start 2024 :month-start 9 :day-start 20 :hour-start nil :minute-start nil :year-end 2024 :month-end 9 :day-end 20 :hour-end nil :minute-end nil)))) (table-row (:standard-properties [3315 3315 3316 3376 3377 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [3316 nil 3317 3338 3340 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Speaker notifications) (table-cell (:standard-properties [3340 nil 3341 3357 3376 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) (timestamp (:standard-properties [3341 nil nil nil 3357 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #17] :type inactive :range-type nil :raw-value [2024-09-27 Fri] :year-start 2024 :month-start 9 :day-start 27 :hour-start nil :minute-start nil :year-end 2024 :month-end 9 :day-end 27 :hour-end nil :minute-end nil)))) (table-row (:standard-properties [3377 3377 3378 3438 3439 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [3378 nil 3379 3395 3402 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Publish schedule) (table-cell (:standard-properties [3402 nil 3403 3419 3438 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) (timestamp (:standard-properties [3403 nil nil nil 3419 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #17] :type inactive :range-type nil :raw-value [2024-10-25 Fri] :year-start 2024 :month-start 10 :day-start 25 :hour-start nil :minute-start nil :year-end 2024 :month-end 10 :day-end 25 :hour-end nil :minute-end nil)))) (table-row (:standard-properties [3439 3439 3440 3500 3501 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [3440 nil 3441 3458 3464 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Video target date) (table-cell (:standard-properties [3464 nil 3465 3481 3500 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) (timestamp (:standard-properties [3465 nil nil nil 3481 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #17] :type inactive :range-type nil :raw-value [2024-11-08 Fri] :year-start 2024 :month-start 11 :day-start 8 :hour-start nil :minute-start nil :year-end 2024 :month-end 11 :day-end 8 :hour-end nil :minute-end nil)))) (table-row (:standard-properties [3501 3501 3502 3562 3563 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [3502 nil 3503 3512 3526 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) EmacsConf) (table-cell (:standard-properties [3526 nil 3527 3560 3562 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) (timestamp (:standard-properties [3527 nil nil nil 3543 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #17] :type inactive :range-type nil :raw-value [2024-12-07 Sat] :year-start 2024 :month-start 12 :day-start 7 :hour-start nil :minute-start nil :year-end 2024 :month-end 12 :day-end 7 :hour-end nil :minute-end nil)) - (timestamp (:standard-properties [3544 nil nil nil 3560 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #17] :type inactive :range-type nil :raw-value [2024-12-07 Sat] :year-start 2024 :month-start 12 :day-start 7 :hour-start nil :minute-start nil :year-end 2024 :month-end 12 :day-end 7 :hour-end nil :minute-end nil))))) (paragraph (:standard-properties [3564 3564 3564 3886 3887 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) We did early acceptances again this year. That was nice. I wasn't sure about committing longer periods of time early in the scheduling process, so I usually tried to nudge people to plan a 20-minute video with the option of possibly doing more, and I okayed longer talks once we figured out what the schedule looked like. ) (paragraph (:standard-properties [3887 3887 3887 4374 4375 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) There were 82 days between the call for proposals and the CFP deadline, another 49 days from that to the video target date, and 29 days between the video target date and EmacsConf. It felt like there was a good amount of time for proposals and videos. Six videos came in before or on the target date. The rest trickled in afterwards, which was fine because we wanted to keep things low-pressure for the speakers. We had enough capacity to process and caption the videos as they came in. ))) (headline (:standard-properties [4375 4375 4383 5166 5166 0 (:title) nil nil nil nil 4439 5164 2 posts.org<2> nil nil #12] :pre-blank 0 :raw-value Data :title (Data) :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :footnote-section-p [org-element-deferred org-element--headline-footnote-section-p nil nil] :archivedp [org-element-deferred org-element--headline-archivedp nil nil] :commentedp nil :CUSTOM_ID emacsconf-2024-notes-data) (section (:standard-properties [4383 4383 4383 5166 5166 0 nil section nil nil nil 4383 5166 nil posts.org<2> nil nil #13]) (paragraph (:standard-properties [4441 4441 4441 4556 4557 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) We continued to use an Org file to store the talk information. It would be great to add some validation functions: ) (plain-list (:standard-properties [4557 4557 4557 4906 4907 1 nil nil nil nil nil nil nil nil posts.org<2> nil ((4557 0 - nil nil nil 4603) (4603 0 - nil nil nil 4653) (4653 0 - nil nil nil 4706) (4706 0 - nil nil nil 4804) (4804 0 - nil nil nil 4844) (4844 0 - nil nil nil 4906)) #14] :type unordered) (item (:standard-properties [4557 4557 4561 4603 4603 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((4557 0 - nil nil nil 4603) (4603 0 - nil nil nil 4653) (4653 0 - nil nil nil 4706) (4706 0 - nil nil nil 4804) (4804 0 - nil nil nil 4844) (4844 0 - nil nil nil 4906)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [4561 4561 4561 4603 4603 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Check permissions and ownership for files )) (item (:standard-properties [4603 4603 4607 4653 4653 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((4557 0 - nil nil nil 4603) (4603 0 - nil nil nil 4653) (4653 0 - nil nil nil 4706) (4706 0 - nil nil nil 4804) (4804 0 - nil nil nil 4844) (4844 0 - nil nil nil 4906)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [4607 4607 4607 4653 4653 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Check case sensitivity for Q&A type detection )) (item (:standard-properties [4653 4653 4657 4706 4706 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((4557 0 - nil nil nil 4603) (4603 0 - nil nil nil 4653) (4653 0 - nil nil nil 4706) (4706 0 - nil nil nil 4804) (4804 0 - nil nil nil 4844) (4844 0 - nil nil nil 4906)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [4657 4657 4657 4706 4706 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Check BBB redirect pages to make sure they exist )) (item (:standard-properties [4706 4706 4710 4804 4804 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((4557 0 - nil nil nil 4603) (4603 0 - nil nil nil 4653) (4653 0 - nil nil nil 4706) (4706 0 - nil nil nil 4804) (4804 0 - nil nil nil 4844) (4844 0 - nil nil nil 4906)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [4710 4710 4710 4804 4804 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Check transcripts for ` because that messes up formatting; consider escaping for the wiki )) (item (:standard-properties [4804 4804 4808 4844 4844 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((4557 0 - nil nil nil 4603) (4603 0 - nil nil nil 4653) (4653 0 - nil nil nil 4706) (4706 0 - nil nil nil 4804) (4804 0 - nil nil nil 4844) (4844 0 - nil nil nil 4906)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [4808 4808 4808 4844 4844 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Check files are public and readable )) (item (:standard-properties [4844 4844 4848 4906 4906 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((4557 0 - nil nil nil 4603) (4603 0 - nil nil nil 4653) (4653 0 - nil nil nil 4706) (4706 0 - nil nil nil 4804) (4804 0 - nil nil nil 4844) (4844 0 - nil nil nil 4906)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [4848 4848 4848 4906 4906 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Check captioned by comment vs caption status vs captioner ))) (paragraph (:standard-properties [4907 4907 4907 5165 5166 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) Speakers uploaded their files via (link (:standard-properties [4941 nil 4985 4996 4998 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //github.com/psi-4ward/psitransfer :format bracket :raw-link https://github.com/psi-4ward/psitransfer :application nil :search-option nil) PsiTransfer) again. I didn't get around to setting up the FTP server. I should probably rename ftp-upload.emacsconf.org to upload.emacsconf.org so that people don't get confused. ))) (headline (:standard-properties [5166 5166 5183 7779 7779 0 (:title) nil nil nil nil 5248 7777 2 posts.org<2> nil nil #12] :pre-blank 0 :raw-value Communication :title (Communication) :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :footnote-section-p [org-element-deferred org-element--headline-footnote-section-p nil nil] :archivedp [org-element-deferred org-element--headline-archivedp nil nil] :commentedp nil :CUSTOM_ID emacsconf-2024-notes-communication) (section (:standard-properties [5183 5183 5183 7779 7779 0 nil section nil nil nil 5183 7779 nil posts.org<2> nil nil #13]) (paragraph (:standard-properties [5250 5250 5250 6764 6765 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) As usual, we announced the EmacsConf call for proposals on (link (:standard-properties [5309 nil 5384 5398 5400 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //lists.gnu.org/archive/html/emacs-tangents/2024-06/msg00004.html :format bracket :raw-link https://lists.gnu.org/archive/html/emacs-tangents/2024-06/msg00004.html :application nil :search-option nil) emacs-tangents) , (link (:standard-properties [5402 nil 5463 5473 5475 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //sachachua.com/blog/2024/07/2024-07-01-emacs-news/ :format bracket :raw-link https://sachachua.com/blog/2024/07/2024-07-01-emacs-news/ :application nil :search-option nil) Emacs News) , (link (:standard-properties [5477 nil 5537 5554 5556 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //lists.gnu.org/mailman/listinfo/emacsconf-discuss :format bracket :raw-link https://lists.gnu.org/mailman/listinfo/emacsconf-discuss :application nil :search-option nil) emacsconf-discuss) , (link (:standard-properties [5558 nil 5632 5645 5647 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //lists.gnu.org/archive/html/emacsconf-org/2024-06/msg00000.html :format bracket :raw-link https://lists.gnu.org/archive/html/emacsconf-org/2024-06/msg00000.html :application nil :search-option nil) emacsconf-org) , (link (:standard-properties [5649 nil nil nil 5675 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //reddit.com/r/emacs :format plain :raw-link https://reddit.com/r/emacs :application nil :search-option nil)) . (link (:standard-properties [5677 nil 5734 5749 5751 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //systemcrafters.net/live-streams/july-12-2024/ :format bracket :raw-link https://systemcrafters.net/live-streams/july-12-2024/ :application nil :search-option nil) System Crafters) , (link (:standard-properties [5753 nil 5789 5795 5797 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //irreal.org/blog/?p=12280 :format bracket :raw-link https://irreal.org/blog/?p=12280 :application nil :search-option nil) Irreal) , and (link (:standard-properties [5803 nil 5864 5874 5876 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //emacs-apac.gitlab.io/announcements/november-2024/ :format bracket :raw-link https://emacs-apac.gitlab.io/announcements/november-2024/ :application nil :search-option nil) Emacs APAC) , mentioned it, and people also posted about EmacsConf on (link (:standard-properties [5934 nil 5976 5984 5986 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //mastodon.social/tags/emacsconf :format bracket :raw-link https://mastodon.social/tags/emacsconf :application nil :search-option nil) Mastodon) , (link (:standard-properties [5988 nil 6050 6051 6053 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //x.com/search?q=%23emacsconf&src=typed_query&f=live :format bracket :raw-link https://x.com/search?q=%23emacsconf&src=typed_query&f=live :application nil :search-option nil) X) , (link (:standard-properties [6055 nil 6093 6100 6102 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //bsky.app/hashtag/emacsconf :format bracket :raw-link https://bsky.app/hashtag/emacsconf :application nil :search-option nil) BlueSky) , and (link (:standard-properties [6108 nil 6197 6205 6207 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //www.facebook.com/story.php?story_fbid=538504738701826&id=100076269125316&_rdr :format bracket :raw-link https://www.facebook.com/story.php?story_fbid=538504738701826&id=100076269125316&_rdr :application nil :search-option nil) Facebook) . (link (:standard-properties [6209 nil 6252 6274 6276 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //toot.si/@len/113392360015917614 :format bracket :raw-link https://toot.si/@len/113392360015917614 :application nil :search-option nil) @len@toot.si suggested) submitting EmacsConf to (link (:standard-properties [6301 nil nil nil 6320 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //foss.events :format plain :raw-link https://foss.events :application nil :search-option nil)) , so I did. There was some other (link (:standard-properties [6353 nil 6452 6481 6484 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //www.reddit.com/r/emacs/comments/1h5c778/which_emacsconf_2024_talks_have_your_attention/ :format bracket :raw-link https://www.reddit.com/r/emacs/comments/1h5c778/which_emacsconf_2024_talks_have_your_attention/ :application nil :search-option nil) EmacsConf-related discussions) in r/emacs. (link (:standard-properties [6496 nil 6585 6600 6603 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //200ok.ch/posts/2024-09-16_announcing_emacsconf__official_swiss_satellite.html :format bracket :raw-link https://200ok.ch/posts/2024-09-16_announcing_emacsconf__official_swiss_satellite.html :application nil :search-option nil) 200ok and Ardeo) organized an in-person meetup in Switzerland, and (link (:standard-properties [6653 nil 6726 6760 6762 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //dogodki.kompot.si/events/00a6f9ee-9087-400d-9d9b-d51b98561424 :format bracket :raw-link https://dogodki.kompot.si/events/00a6f9ee-9087-400d-9d9b-d51b98561424 :application nil :search-option nil) emacs.si got together in Ljubljana) . ) (paragraph (:standard-properties [6765 6765 6765 7077 7078 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) For communicating with speakers and volunteers, I used lots of mail merge ( (link (:standard-properties [6840 nil nil nil 6870 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type emacsconf-el :type-explicit-p t :path emacsconf-mail.el :format plain :raw-link emacsconf-el:emacsconf-mail.el :application nil :search-option nil)) ). Most of the templates only needed a little tweaking from last year's code. I added a function to help me double-check delivery, since the batches that I tried to send via async sometimes ran into errors. ) (paragraph (:standard-properties [7078 7078 7078 7164 7165 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) Next time, I think it could be interesting to add more blog posts and Mastodon toots. ) (paragraph (:standard-properties [7165 7165 7165 7229 7230 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) Also, maybe it would be good to get in touch with podcasts like ) (plain-list (:standard-properties [7230 7230 7230 7571 7572 1 nil nil nil nil nil nil nil nil posts.org<2> nil ((7230 0 - nil nil nil 7281) (7281 0 - nil nil nil 7380) (7380 0 - nil nil nil 7431) (7431 0 - nil nil nil 7471) (7471 0 - nil nil nil 7523) (7523 0 - nil nil nil 7571)) #14] :type unordered) (item (:standard-properties [7230 7230 7232 7281 7281 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((7230 0 - nil nil nil 7281) (7281 0 - nil nil nil 7380) (7380 0 - nil nil nil 7431) (7431 0 - nil nil nil 7471) (7471 0 - nil nil nil 7523) (7523 0 - nil nil nil 7571)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [7232 7232 7232 7281 7281 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) (link (:standard-properties [7232 nil 7263 7278 7280 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #17] :type https :type-explicit-p t :path //systemcrafters.net/ :format bracket :raw-link https://systemcrafters.net/ :application nil :search-option nil) System Crafters) )) (item (:standard-properties [7281 7281 7283 7380 7380 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((7230 0 - nil nil nil 7281) (7281 0 - nil nil nil 7380) (7380 0 - nil nil nil 7431) (7431 0 - nil nil nil 7471) (7471 0 - nil nil nil 7523) (7523 0 - nil nil nil 7571)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [7283 7283 7283 7380 7380 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) (link (:standard-properties [7283 nil 7359 7377 7379 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #17] :type https :type-explicit-p t :path //www.youtube.com/playlist?list=PLbFVcOQ-YH_LRP687N0YeN78YZmBp5wqF :format bracket :raw-link https://www.youtube.com/playlist?list=PLbFVcOQ-YH_LRP687N0YeN78YZmBp5wqF :application nil :search-option nil) This Week in Linux) )) (item (:standard-properties [7380 7380 7382 7431 7431 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((7230 0 - nil nil nil 7281) (7281 0 - nil nil nil 7380) (7380 0 - nil nil nil 7431) (7431 0 - nil nil nil 7471) (7471 0 - nil nil nil 7523) (7523 0 - nil nil nil 7571)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [7382 7382 7382 7431 7431 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) (link (:standard-properties [7382 nil 7413 7428 7430 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #17] :type https :type-explicit-p t :path //linuxunplugged.com/ :format bracket :raw-link https://linuxunplugged.com/ :application nil :search-option nil) Linux Unplugged) )) (item (:standard-properties [7431 7431 7433 7471 7471 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((7230 0 - nil nil nil 7281) (7281 0 - nil nil nil 7380) (7380 0 - nil nil nil 7431) (7431 0 - nil nil nil 7471) (7471 0 - nil nil nil 7523) (7523 0 - nil nil nil 7571)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [7433 7433 7433 7471 7471 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) (link (:standard-properties [7433 nil 7460 7468 7470 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #17] :type http :type-explicit-p t :path //asknoahshow.com/ :format bracket :raw-link http://asknoahshow.com/ :application nil :search-option nil) Ask Noah) )) (item (:standard-properties [7471 7471 7473 7523 7523 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((7230 0 - nil nil nil 7281) (7281 0 - nil nil nil 7380) (7380 0 - nil nil nil 7431) (7431 0 - nil nil nil 7471) (7471 0 - nil nil nil 7523) (7523 0 - nil nil nil 7571)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [7473 7473 7473 7523 7523 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) (link (:standard-properties [7473 nil 7504 7520 7522 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #17] :type https :type-explicit-p t :path //linuxafterdark.net/ :format bracket :raw-link https://linuxafterdark.net/ :application nil :search-option nil) Linux After Dark) )) (item (:standard-properties [7523 7523 7525 7571 7571 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((7230 0 - nil nil nil 7281) (7281 0 - nil nil nil 7380) (7380 0 - nil nil nil 7431) (7431 0 - nil nil nil 7471) (7471 0 - nil nil nil 7523) (7523 0 - nil nil nil 7571)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [7525 7525 7525 7571 7571 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) (link (:standard-properties [7525 nil 7551 7568 7570 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #17] :type https :type-explicit-p t :path //anonradio.net/ :format bracket :raw-link https://anonradio.net/ :application nil :search-option nil) Lispy Gopher Show) ))) (paragraph (:standard-properties [7572 7572 7572 7672 7673 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) to give a heads up on EmacsConf before it happens and also let them know when videos are available. ) (paragraph (:standard-properties [7673 7673 7673 7778 7779 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) We continued to use (link (:standard-properties [7693 nil 7721 7727 7730 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //www.mumble.info/ :format bracket :raw-link https://www.mumble.info/ :application nil :search-option nil) Mumble) for backstage coordination. It worked out well. ))) (headline (:standard-properties [7779 7779 7791 11019 11019 0 (:title) nil nil nil nil 7851 11017 2 posts.org<2> nil nil #12] :pre-blank 0 :raw-value Schedule :title (Schedule) :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :footnote-section-p [org-element-deferred org-element--headline-footnote-section-p nil nil] :archivedp [org-element-deferred org-element--headline-archivedp nil nil] :commentedp nil :CUSTOM_ID emacsconf-2024-notes-schedule) (section (:standard-properties [7791 7791 7791 11019 11019 0 nil section nil nil nil 7791 11019 nil posts.org<2> nil nil #13]) (paragraph (:standard-properties [7853 7853 7853 8089 8090 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) The schedule worked out to two days of talks, with two tracks on the first day, and about 15-20 minutes between each talk. We were able to adapt to late submissions, last-minute cancellations, and last-minute switches from Q&A to live. ) (paragraph (:standard-properties [8090 8090 8090 8474 8475 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) We added an open mic session on Sunday to fill in the time from a last-minute cancellation. That worked out nicely and it might be a good idea to schedule in that time next year. It was also good to move some of the usual closing remarks earlier. We were able to wrap up in a timely manner, which was great for some hosts and participants because they didn't have to stay up so late. ) (paragraph (:standard-properties [8475 8475 8475 8782 8783 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) Sunday was single-track, so it was nice and relaxed. I was a little worried that people might get bored if the current talk wasn't relevant to their interests, but everyone managed just fine. I probably should have remembered that Emacs people are good at turning extra time into more configuration tweaks. ) (paragraph (:standard-properties [8783 8783 8783 9101 9102 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) Most of the scheduling was determined by people's time constraints, so I didn't worry too much about making the talks flow logically. I accidentally forgot to note down one speaker's time constraints, but he caught it when we e-mailed the draft schedule and I was able to move things around for a better time for him. ) (paragraph (:standard-properties [9102 9102 9102 9500 9501 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) There was a tiny bit of technical confusion because the automated schedule publishing on res had case-sensitive matching ( (code (:standard-properties [9224 nil nil nil 9242 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :value case-fold-search)) was set to (code (:standard-properties [9254 nil nil nil 9259 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :value nil)) ), so if a talk was set to "Live" Q&A, it didn't announce it as a live talk because it was looking for (code (:standard-properties [9362 nil nil nil 9368 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :value live)) . Whoops. I've added that configuration setting to my (code (:standard-properties [9422 nil nil nil 9450 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :value emacsconf-stream-config.el)) , so the ansible scripts should get it next time. ) (paragraph (:standard-properties [9501 9501 9501 10021 10022 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) I asked Leo and Corwin if they wanted to manually control the talks this year. They opted to leave it automatically managed by crontab so that they wouldn't have to worry as much about timekeeping. It worked reliably. Hooray for automation! The only scheduling hiccup was because I turned off the crontab so that we could do Saturday closing remarks when we wanted to and I forgot to reenable autopilot the next day. We noticed when the opening remarks didn't start right on the dot, and I got everything back on track. ) (paragraph (:standard-properties [10022 10022 10022 10305 10306 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) Like last year, I scheduled the dev track to start a little later than the gen track. That made for a less frantic morning. Also, this year we scheduled Sunday morning to start with more IRC Q&A instead of live Q&A. We didn't notice any bandwidth issues on Sunday morning this time. ) (paragraph (:standard-properties [10306 10306 10306 10499 10500 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) It would be nice to have Javascript countdowns in some kind of web interface to make it easier for hosts, especially if we can update it with the actual time the current video will end in MPV. ) (paragraph (:standard-properties [10500 10500 10500 10646 10647 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) I can also update the (link (:standard-properties [10522 nil nil nil 10555 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type emacsconf-el :type-explicit-p t :path emacsconf-stream.el :format plain :raw-link emacsconf-el:emacsconf-stream.el :application nil :search-option nil)) code to make it easier to automatically count down to the next talk or to a specific talk. ) (paragraph (:standard-properties [10647 10647 10647 10795 10796 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) We have Javascript showing local time on the individual talk pages, but it would be nice to localize the times on all the schedule/watch pages too. ) (paragraph (:standard-properties [10796 10796 10796 11018 11019 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) Most of my stuff (scheduling, publishing, etc.) is handled by automation with just a little bit of manual nudging every so often, so it might be possible to organize an event that's more friendly to Europe/APAC timezones. ))) (headline (:standard-properties [11019 11019 11038 14417 14417 0 (:title) nil nil nil nil 11105 14415 2 posts.org<2> nil nil #12] :pre-blank 0 :raw-value Recorded videos :title (Recorded videos) :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :footnote-section-p [org-element-deferred org-element--headline-footnote-section-p nil nil] :archivedp [org-element-deferred org-element--headline-archivedp nil nil] :commentedp nil :CUSTOM_ID emacsconf-2024-notes-recorded-videos) (section (:standard-properties [11038 11038 11038 14417 14417 0 nil section nil nil nil 11038 14417 nil posts.org<2> nil nil #13]) (paragraph (:standard-properties [11107 11107 11107 11495 11496 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) As usual, we strongly encouraged speakers to record videos to lower everyone's stress levels and allow for captioning by volunteers, so that's what most speakers did. We were able to handle a few last-minute submissions as well as a live talk. Getting videos also meant we could publish them as each talk went live, including automatically putting the videos and transcripts on the wiki. ) (paragraph (:standard-properties [11496 11496 11496 11744 11745 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) We didn't have obvious video encoding cut-offs, so re-encoding in a screen was a reliable way to avoid interruptions this year. Also, no one complained about tiny text or low resolution, so the talk preparation instructions seem to be working out. ) (paragraph (:standard-properties [11745 11745 11745 12180 12181 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) Automatically normalizing the audio with ffmpeg-normalize didn't work out, so Leo Vivier did a last-minute scramble to normalize the audio the day before the conference. Maybe that's something that volunteers can help with during the lead-up to the conference, or maybe I can finally figure out how to fit that into my process. I don't have much time or patience to listen to things, but it would be nice to get that sorted out early. ) (paragraph (:standard-properties [12181 12181 12181 12417 12418 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) Next year we can try remixing the audio to mono. One of the talks had some audio moving around, which was a little distracting. Also, some people listen to the talks in one ear, so it would be good to drop things down to mono for them. ) (paragraph (:standard-properties [12418 12418 12418 12724 12725 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) We think 60fps videos stressed the res server a bit, resulting in dropped frames. Next year, we can downsample those to 30fps and add a note to the talk preparation instructions. The hosts also suggested looking into setting up streaming from each host's computer instead of using our shared VNC sessions. ) (paragraph (:standard-properties [12725 12725 12725 12847 12848 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) There was some colour smearing and weirdness when we played some videos with mpv on res. Upgrading MPV to v0.38 fixed it. ) (paragraph (:standard-properties [12848 12848 12848 12974 12975 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) Some people requested dark mode (light text on dark background), so maybe we can experiment with recommending that next year. ) (paragraph (:standard-properties [12975 12975 12975 13307 13308 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) I did a last-minute change to the shell scripts to load resources from the cache directory instead of the assets/stream directory, but I didn't get all of the file references, so sometimes the test videos played or the introductions didn't have captions. On the plus side, I learned how to use (code (:standard-properties [13269 nil nil nil 13273 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :value j)) in MPV to reload a subtitle file. ) (paragraph (:standard-properties [13308 13308 13308 13610 13611 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) Sometimes we needed to play the videos manually. If we get the hang of starting MPV in a screen or tmux session, it might be easier for hosts to check how much time is left, or to restart a video at a specific point if needed. Leo said he'll work on figuring out the configuration and the Lua scripts. ) (paragraph (:standard-properties [13611 13611 13611 14165 14166 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) I uploaded all the videos to YouTube and scheduled them. That was nice because then I didn't have to keep updating things during the conference. It turns out that Toobnix also has a way to schedule uploads. I just need to upload it as unlisted first, and then choose Scheduled from the visibility. I wonder if (link (:standard-properties [13921 nil 13981 13993 13996 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //www.npmjs.com/package/%40peertube%2Fpeertube-cli :format bracket :raw-link https://www.npmjs.com/package/%40peertube%2Fpeertube-cli :application nil :search-option nil) peertube-cli) can be extended to schedule things. Anyway, since I didn't know about that during the conference, I just used (code (:standard-properties [14106 nil nil nil 14138 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :value emacsconf-publish-upload-talk)) function to upload videos. ) (paragraph (:standard-properties [14166 14166 14166 14416 14417 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) It was fun playing (link (:standard-properties [14185 nil 14232 14296 14299 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //www.youtube.com/watch?v=urcL86UpqZc :format bracket :raw-link https://www.youtube.com/watch?v=urcL86UpqZc :application nil :search-option nil) Interview with an Emacs Enthusiast in 2023 [Colorized] - YouTube) at lunch. I put together some captions for it after the conference, so maybe we can play it with captions next year. ))) (headline (:standard-properties [14417 14417 14443 15162 15162 0 (:title) nil nil nil nil 14517 15160 2 posts.org<2> nil nil #12] :pre-blank 0 :raw-value Recorded introductions :title (Recorded introductions) :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :footnote-section-p [org-element-deferred org-element--headline-footnote-section-p nil nil] :archivedp [org-element-deferred org-element--headline-archivedp nil nil] :commentedp nil :CUSTOM_ID emacsconf-2024-notes-recorded-introductions) (section (:standard-properties [14443 14443 14443 15162 15162 0 nil section nil nil nil 14443 15162 nil posts.org<2> nil nil #13]) (paragraph (:standard-properties [14519 14519 14519 14819 14820 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) We record introductions so that hosts don't have to worry about how to say things on air. I should probably send the intro check e-mail earlier--maybe on the original video target date, even if speakers haven't submitted their videos yet. This will reduce the last-minute scramble to correct intros. ) (paragraph (:standard-properties [14820 14820 14820 14994 14995 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) When I switched the shell scripts to use the cache directory, I forgot to get it to do the intros from that directory as well, so some of the uncorrected intros were played. ) (paragraph (:standard-properties [14995 14995 14995 15161 15162 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) I forgot to copy the intro VTTs to the cache directory. This should be handled by the subed-record process for creating intros, so it'll be all sorted out next year. ))) (headline (:standard-properties [15162 15162 15176 16756 16756 0 (:title) nil nil nil nil 15238 16754 2 posts.org<2> nil nil #12] :pre-blank 0 :raw-value Captioning :title (Captioning) :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :footnote-section-p [org-element-deferred org-element--headline-footnote-section-p nil nil] :archivedp [org-element-deferred org-element--headline-archivedp nil nil] :commentedp nil :CUSTOM_ID emacsconf-2024-notes-captioning) (section (:standard-properties [15176 15176 15176 16756 16756 0 nil section nil nil nil 15176 16756 nil posts.org<2> nil nil #13]) (paragraph (:standard-properties [15240 15240 15240 16015 16016 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) We used (link (:standard-properties [15248 nil 15286 15294 15297 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //github.com/m-bain/whisperX :format bracket :raw-link https://github.com/m-bain/whisperX :application nil :search-option nil) WhisperX) for speech-to-text this year. It did a great job at preparing the first drafts of captions that our wonderful army of volunteer captioners could then edit. WhisperX's built-in voice activity detection cut down a lot on the hallucinations that (link (:standard-properties [15540 nil 15577 15591 15594 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //github.com/openai/whisper :format bracket :raw-link https://github.com/openai/whisper :application nil :search-option nil) OpenAI Whisper) had during periods of silence in last year's captions, and there was only one instance of WhisperX missing a chunk of text from a speaker that I needed to manually fill in. I upgraded to a Lenovo P52 with 64GB RAM, so I was able to handle last-minute caption processing on my computer. It might be handy to have a smaller model ready for those last-minute requests, or have something ready to go for the commercial APIs. ) (paragraph (:standard-properties [16016 16016 16016 16585 16586 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) The timestamps were a little bit off. It was really helpful that speakers and volunteers used the backstage area to check video quality. I used (link (:standard-properties [16160 nil 16197 16203 16206 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //www.readbeyond.it/aeneas/ :format bracket :raw-link https://www.readbeyond.it/aeneas/ :application nil :search-option nil) Aeneas) to re-align the text, but Aeneas was also confused by silences. I've added some code to (link (:standard-properties [16294 nil 16329 16334 16337 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //github.com/sachac/subed :format bracket :raw-link https://github.com/sachac/subed :application nil :search-option nil) subed) so that I can realign regions of subtitles using Aeneas or WhisperX timestamps, and I also wrote some code to (link (:standard-properties [16447 nil 16544 16581 16583 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //sachachua.com/blog/2024/11/checking-caption-timing-by-skimming-with-emacs-lisp-or-js/ :format bracket :raw-link https://sachachua.com/blog/2024/11/checking-caption-timing-by-skimming-with-emacs-lisp-or-js/ :application nil :search-option nil) skim timestamps for easy verification) . ) (paragraph (:standard-properties [16586 16586 16586 16755 16756 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) Anush V experimented with using machine learning for (link (:standard-properties [16639 nil 16677 16698 16700 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //gitlab.com/jun8git/sub-seg :format bracket :raw-link https://gitlab.com/jun8git/sub-seg :application nil :search-option nil) subtitle segmentation) , so that might be something to explore going forward. ))) (headline (:standard-properties [16756 16756 16788 19618 19618 0 (:title) nil nil nil nil 16868 19616 2 posts.org<2> nil nil #12] :pre-blank 0 :raw-value BigBlueButton web conference :title (BigBlueButton web conference) :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :footnote-section-p [org-element-deferred org-element--headline-footnote-section-p nil nil] :archivedp [org-element-deferred org-element--headline-archivedp nil nil] :commentedp nil :CUSTOM_ID emacsconf-2024-notes-bigbluebutton-web-conference) (section (:standard-properties [16788 16788 16788 19618 19618 0 nil section nil nil nil 16788 19618 nil posts.org<2> nil nil #13]) (paragraph (:standard-properties [16870 16870 16870 17815 17816 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) This year we set up a new (link (:standard-properties [16896 nil 16931 16944 16947 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //demo.bigbluebutton.org/ :format bracket :raw-link https://demo.bigbluebutton.org/ :application nil :search-option nil) BigBlueButton) web conferencing server. The server with our previous BigBlueButton instance had been donated by a defunct nonprofit, so it finally got removed on October 27. After investigating whether Jitsi or Galene might be a good fit for EmacsConf, we decided to continue with BigBlueButton. There were some concerns about (link (:standard-properties [17259 nil 17318 17332 17335 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //github.com/bigbluebutton/bbb-install/issues/261 :format bracket :raw-link https://github.com/bigbluebutton/bbb-install/issues/261 :application nil :search-option nil) non-free Mongo) for BBB versions >= 2.3 and < 3, so I installed BBB 3.0. This was hard to get working on a Docker on the existing res server. (link (:standard-properties [17461 nil 17516 17526 17529 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //emacsconf.org/2024/organizers-notebook/#bbb :format bracket :raw-link https://emacsconf.org/2024/organizers-notebook/#bbb :application nil :search-option nil) We decided) it was worth spinning up an additional Linode virtual private server. It turned out that BBB refused to run on anything smaller than 8GB/4core, so I scaled up to that during testing, scaled back down to 1GB/1core in between, and scaled up to 16GB/8core dedicated during the conference. ) (paragraph (:standard-properties [17816 17816 17816 18043 18044 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) I'm still not 100% sure I set everything up correctly or that everything was stable. Maybe next year BBB 3.0 will be better-tested, someone more sysad-y can doublecheck the setup, or we can try (link (:standard-properties [18010 nil 18033 18039 18041 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //galene.org/ :format bracket :raw-link https://galene.org/ :application nil :search-option nil) Galene) . ) (paragraph (:standard-properties [18044 18044 18044 18339 18340 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) One of the benefits of upgrading to BBB 3.0 was that we could use the smart layout feature to drag the webcam thumbnails to the side of the shared screen. This made shared screens much easier to read. I haven't automated this yet, but it was easy enough for us to do via the shared VNC session. ) (paragraph (:standard-properties [18340 18340 18340 18708 18709 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) On the plus side, it was pretty straightforward to use the Rails console to create all the rooms. We used moderator access codes to give all the speakers moderator access. Mysteriously, superadmins didn't automatically have moderator access to all the rooms even if they were logged in, so we needed to add host access by hand so that they could start the recordings. ) (paragraph (:standard-properties [18709 18709 18709 18969 18970 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) Since we self-hosted and were budgeting more for the full-scale node, I didn't feel comfortable scaling it up to production size until a few days before the conference. I sent the access codes with the check-in e-mails to give speakers time to try things out. ) (paragraph (:standard-properties [18970 18970 18970 19130 19131 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) (link (:standard-properties [18970 nil 19097 19126 19128 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //sachachua.com/blog/2023/12/emacsconf-backstage-figuring-out-our-maximum-number-of-simultaneous-bigbluebutton-users/ :format bracket :raw-link https://sachachua.com/blog/2023/12/emacsconf-backstage-figuring-out-our-maximum-number-of-simultaneous-bigbluebutton-users/ :application nil :search-option nil) Compared to last year's stats) : ) (table (:standard-properties [19131 19131 19131 19509 19510 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14] :type org :tblfm nil :value nil) (table-row (:standard-properties [19131 19131 19132 19184 19185 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [19132 nil 19169 19169 19170 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16])) (table-cell (:standard-properties [19170 nil 19171 19175 19177 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 2023) (table-cell (:standard-properties [19177 nil 19178 19182 19184 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 2024)) (table-row (:standard-properties [19185 19185 nil nil 19239 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type rule)) (table-row (:standard-properties [19239 19239 19240 19292 19293 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [19240 nil 19241 19273 19278 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Max number of simultaneous users) (table-cell (:standard-properties [19278 nil 19279 19281 19285 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 62) (table-cell (:standard-properties [19285 nil 19287 19290 19292 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 107)) (table-row (:standard-properties [19293 19293 19294 19346 19347 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [19294 nil 19295 19330 19332 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Max number of simultaneous meetings) (table-cell (:standard-properties [19332 nil 19333 19334 19339 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 6) (table-cell (:standard-properties [19339 nil 19343 19344 19346 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 7)) (table-row (:standard-properties [19347 19347 19348 19400 19401 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [19348 nil 19349 19384 19386 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Max number of people in one meeting) (table-cell (:standard-properties [19386 nil 19387 19389 19393 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 27) (table-cell (:standard-properties [19393 nil 19396 19398 19400 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 25)) (table-row (:standard-properties [19401 19401 19402 19454 19455 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [19402 nil 19403 19422 19440 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Total unique people) (table-cell (:standard-properties [19440 nil 19441 19443 19447 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 84) (table-cell (:standard-properties [19447 nil 19449 19452 19454 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 102)) (table-row (:standard-properties [19455 19455 19456 19508 19509 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [19456 nil 19457 19477 19494 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Total unique talking) (table-cell (:standard-properties [19494 nil 19495 19497 19501 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 36) (table-cell (:standard-properties [19501 nil 19504 19506 19508 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 40))) (paragraph (:standard-properties [19510 19510 19510 19617 19618 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) (Max number of simultaneous users wasn't deduplicated, since we need that number for server load planning) ))) (headline (:standard-properties [19618 19618 19645 20534 20534 0 (:title) nil nil nil nil 19720 20532 2 posts.org<2> nil nil #12] :pre-blank 0 :raw-value Tech checks and hosting :title (Tech checks and hosting) :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :footnote-section-p [org-element-deferred org-element--headline-footnote-section-p nil nil] :archivedp [org-element-deferred org-element--headline-archivedp nil nil] :commentedp nil :CUSTOM_ID emacsconf-2024-notes-tech-checks-and-hosting) (section (:standard-properties [19645 19645 19645 20534 20534 0 nil section nil nil nil 19645 20534 nil posts.org<2> nil nil #13]) (paragraph (:standard-properties [19722 19722 19722 19902 19903 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) FlowyCoder did a great job getting everyone checked in, especially once I figured out the right checklist to use. We used people's emergency contact information a couple of times. ) (paragraph (:standard-properties [19903 19903 19903 20265 20266 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) Corwin and Leo were able to jump in and out of the different streams for hosting. Sometimes they were both in the same Q&A session, which made it more conversational especially when they were covering for technical issues. We had a couple of crashes even though the tech checks went fine, so that was weird. Maybe something's up with BBB 3.0 or how I set it up. ) (paragraph (:standard-properties [20266 20266 20266 20533 20534 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) Next time, we can consider asking speakers what kind of facilitation style they like. A chatty host? Someone who focuses on reading the questions and then gets out of the way? Speakers reading their own questions and the host focusing on timekeeping/troubleshooting? ))) (headline (:standard-properties [20534 20534 20547 22382 22382 0 (:title) nil nil nil nil 20608 22380 2 posts.org<2> nil nil #12] :pre-blank 0 :raw-value Streaming :title (Streaming) :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :footnote-section-p [org-element-deferred org-element--headline-footnote-section-p nil nil] :archivedp [org-element-deferred org-element--headline-archivedp nil nil] :commentedp nil :CUSTOM_ID emacsconf-2024-notes-streaming) (section (:standard-properties [20547 20547 20547 22382 22382 0 nil section nil nil nil 20547 22382 nil posts.org<2> nil nil #13]) (paragraph (:standard-properties [20610 20610 20610 20809 20810 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) I experimented with setting up the live0 streaming node as a 64GB 32core dedicated CPU server, but that was overkill, so we went back down to 64GB 16core and it still didn't approach the CPU limits. ) (paragraph (:standard-properties [20810 20810 20810 21067 21068 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) The 480p stream seemed stable, hooray! I had set it up last year to automatically kick in as soon as I started streaming to Icecast, and that worked out. I think I changed a loop to be (code (:standard-properties [20995 nil nil nil 21007 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :value while true)) instead of making it try 5 times, so that probably helped. ) (paragraph (:standard-properties [21068 21068 21068 21447 21448 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) I couldn't get Toobnix livestreaming to work this year. On the plus side, that meant that I could use OBS to directly stream to YouTube instead of trying to set up multicasting. I set up one YouTube livestreaming event for each shift and added the RTMP keys to our shift checklists so that I could update the settings before starting the stream. That was pretty straightforward. ) (paragraph (:standard-properties [21448 21448 21448 22023 22024 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) This year, I wrote a little randomizer function to display things on the countdown screen. At first I just dumped in (link (:standard-properties [21565 nil nil nil 21620 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //www.gnu.org/fun/jokes/gnuemacs.acro.exp.en.html :format plain :raw-link https://www.gnu.org/fun/jokes/gnuemacs.acro.exp.en.html :application nil :search-option nil)) , but some of those were not quite what I was looking for. (... Probably should've read them all first!) Then I added random packages from GNU ELPA and NonGNU ELPA, and that was more fun. I might add MELPA next time too. The code for dumping random packages is probably worth putting into a different blog post, since it's the sort of thing people might like to add to their dashboards or screensavers. ) (paragraph (:standard-properties [22024 22024 22024 22164 22165 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) I ran into some C-s annoyances in screen even with flow control turned off, so it might be a good idea to switch to tmux instead of screen. ) (paragraph (:standard-properties [22165 22165 22165 22381 22382 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) Next year, I think it might be a good idea to make intro images for each talk. Then we can use that as the opening slide in BigBlueButton (unless they're already sharing something else) as well as a video thumbnail. ))) (headline (:standard-properties [22382 22382 22396 22976 22976 0 (:title) nil nil nil nil 22458 22974 2 posts.org<2> nil nil #12] :pre-blank 0 :raw-value Publishing :title (Publishing) :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :footnote-section-p [org-element-deferred org-element--headline-footnote-section-p nil nil] :archivedp [org-element-deferred org-element--headline-archivedp nil nil] :commentedp nil :CUSTOM_ID emacsconf-2024-notes-publishing) (section (:standard-properties [22396 22396 22396 22976 22976 0 nil section nil nil nil 22396 22976 nil posts.org<2> nil nil #13]) (paragraph (:standard-properties [22460 22460 22460 22704 22705 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) The automated process for publishing talks and transcripts to the wiki occasionally needed nudging when someone else had committed a change to the wiki. I thought I had a (code (:standard-properties [22631 nil nil nil 22642 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :value git pull)) in there somewhere, but maybe I need to look at it some more. ) (paragraph (:standard-properties [22705 22705 22705 22975 22976 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) I forgot to switch the conference publishing phase and enable the inclusion of Etherpads, but fortunately Ihor noticed. I did some last-minute hacking to add them in, and then I remembered the variables I needed to set. Just need to add it to our process documentation. ))) #9 (headline (:standard-properties [23859 23859 23866 24458 24458 0 (:title) nil nil nil nil 23921 24456 2 posts.org<2> nil nil #12] :pre-blank 0 :raw-value IRC :title (IRC) :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :footnote-section-p [org-element-deferred org-element--headline-footnote-section-p nil nil] :archivedp [org-element-deferred org-element--headline-archivedp nil nil] :commentedp nil :CUSTOM_ID emacsconf-2024-notes-irc) (section (:standard-properties [23866 23866 23866 24458 24458 0 nil section nil nil nil 23866 24458 nil posts.org<2> nil nil #13]) (paragraph (:standard-properties [23923 23923 23923 24074 24075 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) We remembered to give the libera.chat people a heads-up before the conference, so we didn't run into usage limits for (link (:standard-properties [24041 nil nil nil 24067 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //chat.emacsconf.org :format plain :raw-link https://chat.emacsconf.org :application nil :search-option nil)) . Yay! ) (paragraph (:standard-properties [24075 24075 24075 24332 24333 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) Aside from writing (code (:standard-properties [24094 nil nil nil 24114 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :value [org-element-deferred org-element--substring (1 19) t])) ( (link (:standard-properties [24116 nil 24149 24165 24167 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type emacsconf-el :type-explicit-p t :path emacsconf-erc.el :format bracket :raw-link emacsconf-el:emacsconf-erc.el :application nil :search-option nil) emacsconf-erc.el) ) to make it easier to add text from IRC to the Etherpad, I didn't tinker much with the IRC setup for this year. It continued to be a solid platform for discussion. ) (paragraph (:standard-properties [24333 24333 24333 24457 24458 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) I think a keyboard shortcut for inserting a talk's URL could be handy and should be pretty easy to add to my Embark keymap. ))) (headline (:standard-properties [24458 24458 24480 26746 26746 0 (:title) nil nil nil nil 24550 26744 2 posts.org<2> nil nil #12] :pre-blank 0 :raw-value Extracting the Q&A :title (Extracting the Q&A) :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :footnote-section-p [org-element-deferred org-element--headline-footnote-section-p nil nil] :archivedp [org-element-deferred org-element--headline-archivedp nil nil] :commentedp nil :CUSTOM_ID emacsconf-2024-notes-extracting-the-q-a) (section (:standard-properties [24480 24480 24480 26746 26746 0 nil section nil nil nil 24480 26746 nil posts.org<2> nil nil #13]) (paragraph (:standard-properties [24552 24552 24552 24861 24862 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) We sometimes forgot to start the recording for the Q&A until a few minutes into the talk. I considered extracting the Q&A recordings from the Icecast dump or YouTube stream recordings in order to get those first few minutes, but decided it wasn't worth it since people could generally figure out the answers. ) (paragraph (:standard-properties [24862 24862 24862 25203 25204 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) Getting the recordings off BigBlueButton was easier this year because I configured it with (link (:standard-properties [24953 nil 25065 25105 25107 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //docs.bigbluebutton.org/3.0/administration/customize/#install-additional-recording-processing-formats :format bracket :raw-link https://docs.bigbluebutton.org/3.0/administration/customize/#install-additional-recording-processing-formats :application nil :search-option nil) video as an additional processing format) , so we could grab one file per session instead of combining the different streams with ffmpeg. ) (paragraph (:standard-properties [25204 25204 25204 25490 25491 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) I did a quick pass of the Q&A transcripts and chat logs to see if people mentioned anything that they might want to take out. I also copied IRC messages and the pads, and I copied over the answers from the transcripts using the new (code (:standard-properties [25436 nil nil nil 25479 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :value [org-element-deferred org-element--substring (1 42) t])) function. ) (paragraph (:standard-properties [25491 25491 25491 25905 25906 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) Audio mixing was uneven. It might be nice to figure out separate audio recordings just in case ( (link (:standard-properties [25587 nil 25650 25656 25658 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //github.com/bigbluebutton/bigbluebutton/issues/12302 :format bracket :raw-link https://github.com/bigbluebutton/bigbluebutton/issues/12302 :application nil :search-option nil) #12302) , (link (:standard-properties [25660 nil 25723 25740 25742 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //groups.google.com/g/bigbluebutton-dev/c/oPzJy0mKOrw :format bracket :raw-link https://groups.google.com/g/bigbluebutton-dev/c/oPzJy0mKOrw :application nil :search-option nil) bigbluebutton-dev) ). We ended up not tinkering with the audio for the Q&A, so next time, I can probably upload them without waiting to see if anyone wants to fiddle with the audio. ) (paragraph (:standard-properties [25906 25906 25906 26073 26074 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) Trimming the Q&A was pretty straightforward. I added a (code (:standard-properties [25961 nil nil nil 25985 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :value [org-element-deferred org-element--substring (1 22) t])) function to (link (:standard-properties [25997 nil 26032 26037 26039 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //github.com/sachac/subed :format bracket :raw-link https://github.com/sachac/subed :application nil :search-option nil) subed) so that I can trim files easily. ) (paragraph (:standard-properties [26074 26074 26074 26252 26253 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) Thanks to my completion functions for adding section headings based on comments, it was easy to index the Q&A this year. I didn't even put it up backstage for people to work on. ) (paragraph (:standard-properties [26253 26253 26253 26511 26512 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) Nudged by (link (:standard-properties [26263 nil 26318 26326 26328 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //mastodon.social/@ctietze/113627423761735937 :format bracket :raw-link https://mastodon.social/@ctietze/113627423761735937 :application nil :search-option nil) @ctietze) , I'm experimenting with adding sticky videos if Javascript is enabled so that it's easier to navigate using the transcript. There's still a bit of tinkering to do, but it's a start. ) (paragraph (:standard-properties [26512 26512 26512 26745 26746 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) I added some conference-related variables to a (code (:standard-properties [26559 nil nil nil 26576 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :value [org-element-deferred org-element--substring (1 15) t])) file so that I can more easily update things even for past conferences. This is mostly related to publishing the captions on the wiki pages, which I do with Emacs Lisp. ))) (headline (:standard-properties [26746 26746 26770 27572 27572 0 (:title) nil nil nil nil 26842 27570 2 posts.org<2> nil nil #12] :pre-blank 0 :raw-value Budget and donations :title (Budget and donations) :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :footnote-section-p [org-element-deferred org-element--headline-footnote-section-p nil nil] :archivedp [org-element-deferred org-element--headline-archivedp nil nil] :commentedp nil :CUSTOM_ID emacsconf-2024-notes-budget-and-donations) (section (:standard-properties [26770 26770 26770 27572 27572 0 nil section nil nil nil 26770 27572 nil posts.org<2> nil nil #13]) (paragraph (:standard-properties [26844 26844 26844 26880 26881 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) Costs (USD, not including 13% tax): ) (table (:standard-properties [26881 26881 26881 27055 27056 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14] :type org :tblfm nil :value nil) (table-row (:standard-properties [26881 26881 26882 26938 26939 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [26882 nil 26883 26888 26890 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 52.54) (table-cell (:standard-properties [26890 nil 26891 26926 26938 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Extra costs for hosting in December)) (table-row (:standard-properties [26939 26939 26940 26996 26997 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [26940 nil 26942 26946 26948 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 3.11) (table-cell (:standard-properties [26948 nil 26949 26988 26996 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Extra costs for BBB testing in November)) (table-row (:standard-properties [26997 26997 26998 27054 27055 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [26998 nil 27001 27004 27006 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 120) (table-cell (:standard-properties [27006 nil 27007 27052 27054 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Hosting costs year-round (two Linode nanodes)))) (paragraph (:standard-properties [27056 27056 27056 27107 27108 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) Total of USD 175.65 + tax, or USD 198.48 for 2024. ) (paragraph (:standard-properties [27108 27108 27108 27298 27299 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) The Free Software Foundation also provided (link (:standard-properties [27151 nil 27182 27201 27204 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //media.emacsconf.org :format bracket :raw-link https://media.emacsconf.org :application nil :search-option nil) media.emacsconf.org) for serving media files. Ry P provided res.emacsconf.org for OBS streaming over VNC sessions. ) (paragraph (:standard-properties [27299 27299 27299 27571 27572 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) Amin Bandali was away during the conference weekend and no one else knew how to get the list of donors and current donation stats from the FSF Working Together program on short notice. Next time, we can get that sorted out beforehand so that we can thank donors properly. ))) (headline (:standard-properties [27572 27572 27598 30144 30144 0 (:title) nil nil nil nil 27672 30142 2 posts.org<2> nil nil #12] :pre-blank 0 :raw-value Documentation and time :title (Documentation and time) :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :footnote-section-p [org-element-deferred org-element--headline-footnote-section-p nil nil] :archivedp [org-element-deferred org-element--headline-archivedp nil nil] :commentedp nil :CUSTOM_ID emacsconf-2024-notes-documentation-and-time) (section (:standard-properties [27598 27598 27598 30144 30144 0 nil section nil nil nil 27598 30144 nil posts.org<2> nil nil #13]) (paragraph (:standard-properties [27674 27674 27674 27959 27960 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) I think my biggest challenge was having less time to prepare for EmacsConf this year because the kiddo wanted more of my attention. In many ways, the automation that I'd been gradually building up paid off. We were able to pull together EmacsConf even though I had limited focus time. ) (paragraph (:standard-properties [27960 27960 27960 28041 28042 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) Here's my Emacs-related time data (including Emacs News and tweaking my config): ) (table (:standard-properties [28042 28042 28042 28466 28467 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14] :type org :tblfm nil :value nil) (table-row (:standard-properties [28042 28042 28043 28147 28148 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [28043 nil 28044 28048 28050 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Year) (table-cell (:standard-properties [28050 nil 28052 28055 28057 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Jan) (table-cell (:standard-properties [28057 nil 28059 28062 28064 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Feb) (table-cell (:standard-properties [28064 nil 28065 28070 28072 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) March) (table-cell (:standard-properties [28072 nil 28073 28078 28080 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) April) (table-cell (:standard-properties [28080 nil 28082 28085 28087 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) May) (table-cell (:standard-properties [28087 nil 28088 28092 28094 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) June) (table-cell (:standard-properties [28094 nil 28095 28099 28101 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) July) (table-cell (:standard-properties [28101 nil 28103 28106 28108 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Aug) (table-cell (:standard-properties [28108 nil 28109 28113 28115 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Sept) (table-cell (:standard-properties [28115 nil 28118 28121 28123 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Oct) (table-cell (:standard-properties [28123 nil 28126 28129 28131 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Nov) (table-cell (:standard-properties [28131 nil 28134 28137 28139 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Dec) (table-cell (:standard-properties [28139 nil 28140 28145 28147 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Total)) (table-row (:standard-properties [28148 28148 nil nil 28254 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type rule)) (table-row (:standard-properties [28254 28254 28255 28359 28360 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [28255 nil 28256 28260 28262 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 2023) (table-cell (:standard-properties [28262 nil 28263 28267 28269 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 23.4) (table-cell (:standard-properties [28269 nil 28270 28274 28276 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 15.9) (table-cell (:standard-properties [28276 nil 28278 28282 28284 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 16.2) (table-cell (:standard-properties [28284 nil 28286 28290 28292 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 11.2) (table-cell (:standard-properties [28292 nil 28294 28297 28299 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 4.4) (table-cell (:standard-properties [28299 nil 28300 28304 28306 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 11.5) (table-cell (:standard-properties [28306 nil 28308 28311 28313 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 6.5) (table-cell (:standard-properties [28313 nil 28314 28318 28320 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 13.3) (table-cell (:standard-properties [28320 nil 28321 28325 28327 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 36.6) (table-cell (:standard-properties [28327 nil 28329 28333 28335 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 86.6) (table-cell (:standard-properties [28335 nil 28337 28341 28343 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 93.2) (table-cell (:standard-properties [28343 nil 28344 28349 28351 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 113.0) (table-cell (:standard-properties [28351 nil 28354 28357 28359 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 432)) (table-row (:standard-properties [28360 28360 28361 28465 28466 0 nil table-row nil nil nil nil nil nil posts.org<2> nil nil #15] :type standard) (table-cell (:standard-properties [28361 nil 28362 28366 28368 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 2024) (table-cell (:standard-properties [28368 nil 28369 28373 28375 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 71.2) (table-cell (:standard-properties [28375 nil 28376 28380 28382 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 12.0) (table-cell (:standard-properties [28382 nil 28385 28388 28390 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 5.6) (table-cell (:standard-properties [28390 nil 28393 28396 28398 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 6.6) (table-cell (:standard-properties [28398 nil 28400 28403 28405 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 3.3) (table-cell (:standard-properties [28405 nil 28407 28410 28412 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 9.6) (table-cell (:standard-properties [28412 nil 28413 28417 28419 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 11.0) (table-cell (:standard-properties [28419 nil 28421 28424 28426 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 4.7) (table-cell (:standard-properties [28426 nil 28427 28431 28433 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 36.0) (table-cell (:standard-properties [28433 nil 28435 28439 28441 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 40.3) (table-cell (:standard-properties [28441 nil 28443 28447 28449 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 52.3) (table-cell (:standard-properties [28449 nil 28451 28455 28457 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 67.7) (table-cell (:standard-properties [28457 nil 28460 28463 28465 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) 320))) (paragraph (:standard-properties [28467 28467 28467 28617 28618 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) (and here's a (link (:standard-properties [28481 nil 28573 28612 28614 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //sachachua.com/blog/2023/12/analyzing-my-emacs-time-over-the-last-11-years-or-so/ :format bracket :raw-link https://sachachua.com/blog/2023/12/analyzing-my-emacs-time-over-the-last-11-years-or-so/ :application nil :search-option nil) longer-term analysis going back to 2012) .) ) (paragraph (:standard-properties [28618 28618 28618 29188 29189 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) I spent 92.6 hours total in October and November 2024 doing Emacs-related things, compared to 179.8 hours the previous year -- so, around half the time. Part of the 2023 total was related to preparing my presentation for EmacsConf, so I was much more familiar with my scripts then. Apparently, there was still a lot more that I needed to document. As I scrambled to get EmacsConf sorted out, I captured quick tasks/notes for the things I need to add to our organizers notebook. Now I get to go through all those notes in my inbox. Maybe next year will be even smoother. ) (paragraph (:standard-properties [29189 29189 29189 29713 29714 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) On the plus side, all the process-related improvements meant that the other volunteers could jump in pretty much whenever they wanted, including during the conference itself. I didn't want to impose firm commitments on people or bug them too much by e-mail, so we kept things very chill in terms of scheduling and planning. If people were available, we had stuff people could help with. If people were busy, that was fine, we could manage. This was nice, especially when I applied the same sort of chill approach to myself. ) (paragraph (:standard-properties [29714 29714 29714 30143 30144 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) I'd like to eventually get to the point of being able to mostly follow my checklists and notes from the start of the conference planning process to the end. I've been moving notes from year-specific organizer notebooks to the main (link (:standard-properties [29945 nil 29991 30011 30013 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //emacsconf.org/organizers-notebook/ :format bracket :raw-link https://emacsconf.org/organizers-notebook/ :application nil :search-option nil) organizers' notebook) . I plan to keep that one as the main file for notes and processes, and then to have specific dates and notes in the yearly ones. ))) (headline (:standard-properties [30144 30144 30155 31757 31757 0 (:title) nil nil nil nil 30157 31755 2 posts.org<2> nil nil #12] :pre-blank 1 :raw-value Thanks :title (Thanks) :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :footnote-section-p [org-element-deferred org-element--headline-footnote-section-p nil nil] :archivedp [org-element-deferred org-element--headline-archivedp nil nil] :commentedp nil) (section (:standard-properties [30155 30155 30155 31757 31757 0 nil section nil nil nil 30155 31757 nil posts.org<2> nil nil #13]) (plain-list (:standard-properties [30155 30155 30155 31756 31757 1 nil planning nil nil nil nil nil nil posts.org<2> nil ((30155 0 - nil nil nil 30308) (30308 0 - nil nil nil 30416) (30416 0 - nil nil nil 30542) (30542 0 - nil nil nil 30692) (30692 0 - nil nil nil 30772) (30772 0 - nil nil nil 30838) (30838 0 - nil nil nil 30936) (30936 0 - nil nil nil 30971) (30971 0 - nil nil nil 31044) (31044 0 - nil nil nil 31138) (31138 0 - nil nil nil 31369) (31369 0 - nil nil nil 31734) (31734 0 - nil nil nil 31756)) #14] :type unordered) (item (:standard-properties [30155 30155 30157 30308 30308 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((30155 0 - nil nil nil 30308) (30308 0 - nil nil nil 30416) (30416 0 - nil nil nil 30542) (30542 0 - nil nil nil 30692) (30692 0 - nil nil nil 30772) (30772 0 - nil nil nil 30838) (30838 0 - nil nil nil 30936) (30936 0 - nil nil nil 30971) (30971 0 - nil nil nil 31044) (31044 0 - nil nil nil 31138) (31138 0 - nil nil nil 31369) (31369 0 - nil nil nil 31734) (31734 0 - nil nil nil 31756)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [30157 30157 30157 30308 30308 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Thank you to all the speakers, volunteers, and participants, and to all those other people in our lives who make it possible through time and support. )) (item (:standard-properties [30308 30308 30310 30416 30416 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((30155 0 - nil nil nil 30308) (30308 0 - nil nil nil 30416) (30416 0 - nil nil nil 30542) (30542 0 - nil nil nil 30692) (30692 0 - nil nil nil 30772) (30772 0 - nil nil nil 30838) (30838 0 - nil nil nil 30936) (30936 0 - nil nil nil 30971) (30971 0 - nil nil nil 31044) (31044 0 - nil nil nil 31138) (31138 0 - nil nil nil 31369) (31369 0 - nil nil nil 31734) (31734 0 - nil nil nil 31756)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [30310 30310 30310 30416 30416 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Thanks to Leo Vivier and Corwin Brust for hosting the sessions, and to FlowyCoder for checking people in. )) (item (:standard-properties [30416 30416 30418 30542 30542 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((30155 0 - nil nil nil 30308) (30308 0 - nil nil nil 30416) (30416 0 - nil nil nil 30542) (30542 0 - nil nil nil 30692) (30692 0 - nil nil nil 30772) (30772 0 - nil nil nil 30838) (30838 0 - nil nil nil 30936) (30936 0 - nil nil nil 30971) (30971 0 - nil nil nil 31044) (31044 0 - nil nil nil 31138) (31138 0 - nil nil nil 31369) (31369 0 - nil nil nil 31734) (31734 0 - nil nil nil 31756)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [30418 30418 30418 30542 30542 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Thanks to our proposal review volunteers James Howell, JC Helary, and others for helping with the early acceptance process. )) (item (:standard-properties [30542 30542 30544 30692 30692 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((30155 0 - nil nil nil 30308) (30308 0 - nil nil nil 30416) (30416 0 - nil nil nil 30542) (30542 0 - nil nil nil 30692) (30692 0 - nil nil nil 30772) (30772 0 - nil nil nil 30838) (30838 0 - nil nil nil 30936) (30936 0 - nil nil nil 30971) (30971 0 - nil nil nil 31044) (31044 0 - nil nil nil 31138) (31138 0 - nil nil nil 31369) (31369 0 - nil nil nil 31734) (31734 0 - nil nil nil 31756)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [30544 30544 30544 30692 30692 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Thanks to our captioning volunteers: Mark Lewin, Rodrigo Morales, Anush, annona, and James Howell, and some speakers who captioned their own talks. )) (item (:standard-properties [30692 30692 30694 30772 30772 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((30155 0 - nil nil nil 30308) (30308 0 - nil nil nil 30416) (30416 0 - nil nil nil 30542) (30542 0 - nil nil nil 30692) (30692 0 - nil nil nil 30772) (30772 0 - nil nil nil 30838) (30838 0 - nil nil nil 30936) (30936 0 - nil nil nil 30971) (30971 0 - nil nil nil 31044) (31044 0 - nil nil nil 31138) (31138 0 - nil nil nil 31369) (31369 0 - nil nil nil 31734) (31734 0 - nil nil nil 31756)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [30694 30694 30694 30772 30772 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Thanks to Leo Vivier for fiddling with the audio to get things nicely synced. )) (item (:standard-properties [30772 30772 30774 30838 30838 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((30155 0 - nil nil nil 30308) (30308 0 - nil nil nil 30416) (30416 0 - nil nil nil 30542) (30542 0 - nil nil nil 30692) (30692 0 - nil nil nil 30772) (30772 0 - nil nil nil 30838) (30838 0 - nil nil nil 30936) (30936 0 - nil nil nil 30971) (30971 0 - nil nil nil 31044) (31044 0 - nil nil nil 31138) (31138 0 - nil nil nil 31369) (31369 0 - nil nil nil 31734) (31734 0 - nil nil nil 31756)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [30774 30774 30774 30838 30838 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Thanks to volunteers who kept the mailing lists free from spam. )) (item (:standard-properties [30838 30838 30840 30936 30936 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((30155 0 - nil nil nil 30308) (30308 0 - nil nil nil 30416) (30416 0 - nil nil nil 30542) (30542 0 - nil nil nil 30692) (30692 0 - nil nil nil 30772) (30772 0 - nil nil nil 30838) (30838 0 - nil nil nil 30936) (30936 0 - nil nil nil 30971) (30971 0 - nil nil nil 31044) (31044 0 - nil nil nil 31138) (31138 0 - nil nil nil 31369) (31369 0 - nil nil nil 31734) (31734 0 - nil nil nil 31756)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [30840 30840 30840 30936 30936 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Thanks to Bhavin Gandhi, Christopher Howard, Joseph Turner, and screwlisp for quality-checking. )) (item (:standard-properties [30936 30936 30938 30971 30971 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((30155 0 - nil nil nil 30308) (30308 0 - nil nil nil 30416) (30416 0 - nil nil nil 30542) (30542 0 - nil nil nil 30692) (30692 0 - nil nil nil 30772) (30772 0 - nil nil nil 30838) (30838 0 - nil nil nil 30936) (30936 0 - nil nil nil 30971) (30971 0 - nil nil nil 31044) (31044 0 - nil nil nil 31138) (31138 0 - nil nil nil 31369) (31369 0 - nil nil nil 31734) (31734 0 - nil nil nil 31756)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [30938 30938 30938 30971 30971 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Thanks to shoshin for the music. )) (item (:standard-properties [30971 30971 30973 31044 31044 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((30155 0 - nil nil nil 30308) (30308 0 - nil nil nil 30416) (30416 0 - nil nil nil 30542) (30542 0 - nil nil nil 30692) (30692 0 - nil nil nil 30772) (30772 0 - nil nil nil 30838) (30838 0 - nil nil nil 30936) (30936 0 - nil nil nil 30971) (30971 0 - nil nil nil 31044) (31044 0 - nil nil nil 31138) (31138 0 - nil nil nil 31369) (31369 0 - nil nil nil 31734) (31734 0 - nil nil nil 31756)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [30973 30973 30973 31044 31044 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Thanks to Amin Bandali for help with infrastructure and communication. )) (item (:standard-properties [31044 31044 31046 31138 31138 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((30155 0 - nil nil nil 30308) (30308 0 - nil nil nil 30416) (30416 0 - nil nil nil 30542) (30542 0 - nil nil nil 30692) (30692 0 - nil nil nil 30772) (30772 0 - nil nil nil 30838) (30838 0 - nil nil nil 30936) (30936 0 - nil nil nil 30971) (30971 0 - nil nil nil 31044) (31044 0 - nil nil nil 31138) (31138 0 - nil nil nil 31369) (31369 0 - nil nil nil 31734) (31734 0 - nil nil nil 31756)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [31046 31046 31046 31138 31138 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Thanks to Ry P for the server that we're using for OBS streaming and for processing videos. )) (item (:standard-properties [31138 31138 31140 31369 31369 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((30155 0 - nil nil nil 30308) (30308 0 - nil nil nil 30416) (30416 0 - nil nil nil 30542) (30542 0 - nil nil nil 30692) (30692 0 - nil nil nil 30772) (30772 0 - nil nil nil 30838) (30838 0 - nil nil nil 30936) (30936 0 - nil nil nil 30971) (30971 0 - nil nil nil 31044) (31044 0 - nil nil nil 31138) (31138 0 - nil nil nil 31369) (31369 0 - nil nil nil 31734) (31734 0 - nil nil nil 31756)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [31140 31140 31140 31369 31369 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Thanks to the Free Software Foundation for Emacs itself, the mailing lists, the media.emacsconf.org server, and handling donations on our behalf through the FSF Working Together program. (link (:standard-properties [31327 nil nil nil 31368 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #17] :type https :type-explicit-p t :path //www.fsf.org/working-together/fund :format plain :raw-link https://www.fsf.org/working-together/fund :application nil :search-option nil)) )) (item (:standard-properties [31369 31369 31371 31734 31734 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((30155 0 - nil nil nil 30308) (30308 0 - nil nil nil 30416) (30416 0 - nil nil nil 30542) (30542 0 - nil nil nil 30692) (30692 0 - nil nil nil 30772) (30772 0 - nil nil nil 30838) (30838 0 - nil nil nil 30936) (30936 0 - nil nil nil 30971) (30971 0 - nil nil nil 31044) (31044 0 - nil nil nil 31138) (31138 0 - nil nil nil 31369) (31369 0 - nil nil nil 31734) (31734 0 - nil nil nil 31756)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [31371 31371 31371 31734 31734 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Thanks to the many users and contributers and project teams that create all the awesome free software we use, especially: BigBlueButton, Etherpad, Icecast, OBS, TheLounge, libera.chat, ffmpeg, OpenAI Whisper, WhisperX, the aeneas forced alignment tool, PsiTransfer, subed, and many, many other tools and services we used to prepare and host this years conference )) (item (:standard-properties [31734 31734 31736 31756 31756 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((30155 0 - nil nil nil 30308) (30308 0 - nil nil nil 30416) (30416 0 - nil nil nil 30542) (30542 0 - nil nil nil 30692) (30692 0 - nil nil nil 30772) (30772 0 - nil nil nil 30838) (30838 0 - nil nil nil 30936) (30936 0 - nil nil nil 30971) (30971 0 - nil nil nil 31044) (31044 0 - nil nil nil 31138) (31138 0 - nil nil nil 31369) (31369 0 - nil nil nil 31734) (31734 0 - nil nil nil 31756)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [31736 31736 31736 31756 31756 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) Thanks to everyone! ))))) (headline (:standard-properties [31757 31757 31768 32989 32989 0 (:title) nil nil nil nil 31827 32987 2 posts.org<2> nil nil #12] :pre-blank 0 :raw-value Overall :title (Overall) :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :footnote-section-p [org-element-deferred org-element--headline-footnote-section-p nil nil] :archivedp [org-element-deferred org-element--headline-archivedp nil nil] :commentedp nil :CUSTOM_ID emacsconf-2024-notes-overall) (section (:standard-properties [31768 31768 31768 32989 32989 0 nil section nil nil nil 31768 32989 nil posts.org<2> nil nil #13]) (paragraph (:standard-properties [31829 31829 31829 32047 32048 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) Good experience. Lots of fun. I'd love to do it again next year. EmacsConf feels like a nice, cozy get-together where people share the cool things they've been working on and thinking about. People had fun! They said: ) (plain-list (:standard-properties [32048 32048 32048 32329 32330 1 nil nil nil nil nil nil nil nil posts.org<2> nil ((32048 0 - nil nil nil 32142) (32142 0 - nil nil nil 32228) (32228 0 - nil nil nil 32329)) #14] :type unordered) (item (:standard-properties [32048 32048 32050 32142 32142 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((32048 0 - nil nil nil 32142) (32142 0 - nil nil nil 32228) (32228 0 - nil nil nil 32329)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [32050 32050 32050 32142 32142 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) "emacsconf is absolutely knocking it out of the park when it comes to conference logistics" )) (item (:standard-properties [32142 32142 32144 32228 32228 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((32048 0 - nil nil nil 32142) (32142 0 - nil nil nil 32228) (32228 0 - nil nil nil 32329)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [32144 32144 32144 32228 32228 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) "I think this conference has defined the terms for a successful online conference." )) (item (:standard-properties [32228 32228 32230 32329 32329 0 (:tag) item nil nil nil nil nil nil posts.org<2> nil ((32048 0 - nil nil nil 32142) (32142 0 - nil nil nil 32228) (32228 0 - nil nil nil 32329)) #15] :bullet - :checkbox nil :counter nil :pre-blank 0 :tag nil) (paragraph (:standard-properties [32230 32230 32230 32329 32329 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #16]) "EmacsConf is one of the big highlights of my year every year. Thank you a ton for running this 😊" ))) (paragraph (:standard-properties [32330 32330 32330 32409 32410 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) It's one of the highlights of my year too. =) Looking forward to the next one! ) (paragraph (:standard-properties [32410 32410 32410 32685 32686 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) In the meantime, y'all can stay connected via (link (:standard-properties [32456 nil 32507 32517 32519 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //sachachua.com/blog/category/emacs-news/ :format bracket :raw-link https://sachachua.com/blog/category/emacs-news/ :application nil :search-option nil) Emacs News) , (link (:standard-properties [32521 nil 32550 32580 32582 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //emacs-berlin.org/ :format bracket :raw-link https://emacs-berlin.org/ :application nil :search-option nil) meetups (online and in person)) , (link (:standard-properties [32584 nil 32617 32633 32635 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //planet.emacslife.com/ :format bracket :raw-link https://planet.emacslife.com/ :application nil :search-option nil) Planet Emacslife) , and now (link (:standard-properties [32645 nil 32666 32674 32676 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #15] :type https :type-explicit-p t :path //emacs.tv/ :format bracket :raw-link https://emacs.tv/ :application nil :search-option nil) emacs.tv) . Enjoy! ) (paragraph (:standard-properties [32686 32686 32686 32989 32989 0 nil nil nil nil nil nil nil nil posts.org<2> nil nil #14]) p.s. I'd love to learn from other people's conference blog posts, EmacsConf or otherwise. I'm particularly interested in virtual conferences and how we can tinker with them to make them even better. I'm having a hard time finding posts; please feel free to send me links to ones you've liked or written!))))] :pre-blank 0 :raw-value Etherpad :title (Etherpad) :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :footnote-section-p [org-element-deferred org-element--headline-footnote-section-p nil nil] :archivedp [org-element-deferred org-element--headline-archivedp nil nil] :commentedp nil :CUSTOM_ID emacsconf-2024-notes-etherpad) #6)]) (paragraph (:standard-properties [23050 23050 23050 23296 23297 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #6]) We used (link (:standard-properties [23058 nil 23083 23091 23094 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #7] :type https :type-explicit-p t :path //etherpad.org/ :format bracket :raw-link https://etherpad.org/ :application nil :search-option nil) Etherpad) 1.9.7 to collect Q&A again this year. I didn't upgrade to Etherpad v2.x because I couldn't figure out how to get it running within the time I set aside for it, but maybe that's something for next year. ) #3 (paragraph (:standard-properties [23587 23587 23587 23700 23701 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #6]) Next year, I'll add pronouns and pronunciations to the Etherpad template so that hosts can refer to them easily. ) (paragraph (:standard-properties [23701 23701 23701 23858 23859 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #6]) If I rejig the template to move the next/previous links so that notes can be added to the end, I might be able to use the Etherpad API to add text from IRC. ))]) I wrote some Elisp to copy the current ERC line (unwrapped) for easier pasting into Etherpad. That worked out really well, and it let me keep up with copying questions from IRC to the pad in between other bits of running around. ( (code (:standard-properties [23527 nil nil nil 23548 1 nil nil nil nil nil nil nil nil posts.org<2> nil nil #3] :value emacsconf-erc-copy)) in #0 ) )] :type emacsconf-el :type-explicit-p t :path emacsconf-erc.el :format bracket :raw-link emacsconf-el:emacsconf-erc.el :application nil :search-option nil)))

Next year, I'll add pronouns and pronunciations to the Etherpad template so that hosts can refer to them easily.

If I rejig the template to move the next/previous links so that notes can be added to the end, I might be able to use the Etherpad API to add text from IRC.

IRC

We remembered to give the libera.chat people a heads-up before the conference, so we didn't run into usage limits for https://chat.emacsconf.org. Yay!

Aside from writing emacsconf-erc-copy (emacsconf-erc.el) to make it easier to add text from IRC to the Etherpad, I didn't tinker much with the IRC setup for this year. It continued to be a solid platform for discussion.

I think a keyboard shortcut for inserting a talk's URL could be handy and should be pretty easy to add to my Embark keymap.

Extracting the Q&A

We sometimes forgot to start the recording for the Q&A until a few minutes into the talk. I considered extracting the Q&A recordings from the Icecast dump or YouTube stream recordings in order to get those first few minutes, but decided it wasn't worth it since people could generally figure out the answers.

Getting the recordings off BigBlueButton was easier this year because I configured it with video as an additional processing format, so we could grab one file per session instead of combining the different streams with ffmpeg.

I did a quick pass of the Q&A transcripts and chat logs to see if people mentioned anything that they might want to take out. I also copied IRC messages and the pads, and I copied over the answers from the transcripts using the new emacsconf-extract-subed-copy-section-text function.

Audio mixing was uneven. It might be nice to figure out separate audio recordings just in case (#12302, bigbluebutton-dev). We ended up not tinkering with the audio for the Q&A, so next time, I can probably upload them without waiting to see if anyone wants to fiddle with the audio.

Trimming the Q&A was pretty straightforward. I added a subed-crop-media-file function to subed so that I can trim files easily.

Thanks to my completion functions for adding section headings based on comments, it was easy to index the Q&A this year. I didn't even put it up backstage for people to work on.

Nudged by @ctietze, I'm experimenting with adding sticky videos if Javascript is enabled so that it's easier to navigate using the transcript. There's still a bit of tinkering to do, but it's a start.

I added some conference-related variables to a .dir-locals.el file so that I can more easily update things even for past conferences. This is mostly related to publishing the captions on the wiki pages, which I do with Emacs Lisp.

Budget and donations

Costs (USD, not including 13% tax):

52.54 Extra costs for hosting in December
3.11 Extra costs for BBB testing in November
120 Hosting costs year-round (two Linode nanodes)

Total of USD 175.65 + tax, or USD 198.48 for 2024.

The Free Software Foundation also provided media.emacsconf.org for serving media files. Ry P provided res.emacsconf.org for OBS streaming over VNC sessions.

Amin Bandali was away during the conference weekend and no one else knew how to get the list of donors and current donation stats from the FSF Working Together program on short notice. Next time, we can get that sorted out beforehand so that we can thank donors properly.

Documentation and time

I think my biggest challenge was having less time to prepare for EmacsConf this year because the kiddo wanted more of my attention. In many ways, the automation that I'd been gradually building up paid off. We were able to pull together EmacsConf even though I had limited focus time.

Here's my Emacs-related time data (including Emacs News and tweaking my config):

Year Jan Feb March April May June July Aug Sept Oct Nov Dec Total
2023 23.4 15.9 16.2 11.2 4.4 11.5 6.5 13.3 36.6 86.6 93.2 113.0 432
2024 71.2 12.0 5.6 6.6 3.3 9.6 11.0 4.7 36.0 40.3 52.3 67.7 320

(and here's a longer-term analysis going back to 2012.)

I spent 92.6 hours total in October and November 2024 doing Emacs-related things, compared to 179.8 hours the previous year – so, around half the time. Part of the 2023 total was related to preparing my presentation for EmacsConf, so I was much more familiar with my scripts then. Apparently, there was still a lot more that I needed to document. As I scrambled to get EmacsConf sorted out, I captured quick tasks/notes for the things I need to add to our organizers notebook. Now I get to go through all those notes in my inbox. Maybe next year will be even smoother.

On the plus side, all the process-related improvements meant that the other volunteers could jump in pretty much whenever they wanted, including during the conference itself. I didn't want to impose firm commitments on people or bug them too much by e-mail, so we kept things very chill in terms of scheduling and planning. If people were available, we had stuff people could help with. If people were busy, that was fine, we could manage. This was nice, especially when I applied the same sort of chill approach to myself.

I'd like to eventually get to the point of being able to mostly follow my checklists and notes from the start of the conference planning process to the end. I've been moving notes from year-specific organizer notebooks to the main organizers' notebook. I plan to keep that one as the main file for notes and processes, and then to have specific dates and notes in the yearly ones.

Thanks

  • Thank you to all the speakers, volunteers, and participants, and to all those other people in our lives who make it possible through time and support.
  • Thanks to Leo Vivier and Corwin Brust for hosting the sessions, and to FlowyCoder for checking people in.
  • Thanks to our proposal review volunteers James Howell, JC Helary, and others for helping with the early acceptance process.
  • Thanks to our captioning volunteers: Mark Lewin, Rodrigo Morales, Anush, annona, and James Howell, and some speakers who captioned their own talks.
  • Thanks to Leo Vivier for fiddling with the audio to get things nicely synced.
  • Thanks to volunteers who kept the mailing lists free from spam.
  • Thanks to Bhavin Gandhi, Christopher Howard, Joseph Turner, and screwlisp for quality-checking.
  • Thanks to shoshin for the music.
  • Thanks to Amin Bandali for help with infrastructure and communication.
  • Thanks to Ry P for the server that we're using for OBS streaming and for processing videos.
  • Thanks to the Free Software Foundation for Emacs itself, the mailing lists, the media.emacsconf.org server, and handling donations on our behalf through the FSF Working Together program. https://www.fsf.org/working-together/fund
  • Thanks to the many users and contributers and project teams that create all the awesome free software we use, especially: BigBlueButton, Etherpad, Icecast, OBS, TheLounge, libera.chat, ffmpeg, OpenAI Whisper, WhisperX, the aeneas forced alignment tool, PsiTransfer, subed, and many, many other tools and services we used to prepare and host this years conference
  • Thanks to everyone!

Overall

Good experience. Lots of fun. I'd love to do it again next year. EmacsConf feels like a nice, cozy get-together where people share the cool things they've been working on and thinking about. People had fun! They said:

  • "emacsconf is absolutely knocking it out of the park when it comes to conference logistics"
  • "I think this conference has defined the terms for a successful online conference."
  • "EmacsConf is one of the big highlights of my year every year. Thank you a ton for running this 😊"

It's one of the highlights of my year too. =) Looking forward to the next one!

In the meantime, y'all can stay connected via Emacs News, meetups (online and in person), Planet Emacslife, and now emacs.tv. Enjoy!

p.s. I'd love to learn from other people's conference blog posts, EmacsConf or otherwise. I'm particularly interested in virtual conferences and how we can tinker with them to make them even better. I'm having a hard time finding posts; please feel free to send me links to ones you've liked or written!

View org source for this post

EmacsConf backstage: Makefile targets

Posted: - Modified: | emacsconf

[2024-11-16 Sat]: Removed highlight_words from whisperx call.

We like to use pre-recorded videos at EmacsConf to minimize technical risks. This also means we can caption them beforehand, stream them with open captions, and publish them as soon as the talk goes live.

Here's the process:

  1. Speakers upload their videos in whatever format they like. We use PsiTransfer to accept the uploaded files.
  2. We rename the files to have the talk title and speaker name in the filename, like emacsconf-2024-emacs30--emacs-30-highlights--philip-kaludercic--original.mov.
  3. We use FFmpeg to reencode them to WEBM so that everything is available in a free format, and we replace the --original.* part with --reencoded.webm. We copy this to --main.webm as a starting point.
  4. We extract the audio and save it to --reencoded.opus.
  5. We use ffmpeg-normalize to normalize the audio and save it to --normalized.opus.
  6. We use WhisperX to get a reasonable starting point for captions, which we save to --reencoded.vtt. I remove the underlines and the tsv and srt files.
  7. Someone edits the captions. We save edited captions as --main.vtt.
  8. --normalized.opus and --main.vtt get combined into --main.webm.

I've been slowly learning how to set up Makefile rules to automate more and more of this. Let's go through parts of the roles/prerec/templates/Makefile.

Make the reencoded webm from the original MP4, MOV, MKV, or WEBM

Here's the rule that makes a --reencoded.webm based on the original mp4, mov, mkv, or webm.

VIDEO_EXTS = mp4 mkv webm mov
source_patterns = $(foreach ext,$(VIDEO_EXTS),$(1)--original.$(ext))
emacsconf-%--reencoded.webm: SOURCES = $(call source_patterns, emacsconf-$*)
emacsconf-%--reencoded.webm:
  $(eval SOURCE := $(lastword $(sort $(wildcard $(SOURCES)))))
  @if [ -z "$(SOURCE)" ]; then \
    echo "No source file found for $@"; \
    echo "Tried: $(SOURCES)"; \
    exit 1; \
  fi
  @echo "Using source: $(SOURCE)"
  ./reencode-in-screen.sh "$(SOURCE)"

Reencoding can take a while and it's prone to me accidentally breaking it, so we stick it in a GNU screen so that I don't accidentally quit it. This is reencode-in-screen.sh:

#!/bin/bash
ORIGINAL=$1
BASE="${ORIGINAL%--original.*}"
REENCODED="${BASE}--reencoded.webm"
SLUG=$(echo "$ORIGINAL" | perl -ne '/^emacsconf-[0-9]*-(.*?)--/ && print $1')
LOCK=".lock-$SLUG"

if [ ! -f "$REENCODED" ]; then
    if [  -f "$LOCK" ]; then
        echo "$LOCK already exists, waiting for it"
    else
        touch "$LOCK"
        screen -dmS reencode-$SLUG /bin/bash -c "reencode.sh \"$ORIGINAL\" \"$REENCODED\" && thumbnail.sh \"$MAIN\" && rm \"$LOCK\""
        echo "Processing $REENCODED in reencode-$SLUG"
    fi
fi

which calls roles/prerec/templates/reencode.sh. Here's the templatized version from Ansible:

#!/usr/bin/env bash

set -euo pipefail

# Defaults
q={{ reencode_quality }}
cpu={{ reencode_cpu }}
time_limit=""
print_only=false
limit_resolution={{ res_y }}
limit_fps={{ fps }}

while getopts :q:c:t:s OPT; do
    case $OPT in
        q|+q)
            q="$OPTARG"
            ;;
        c|+c)
            cpu="$OPTARG"
            ;;
        t|+t)
            time_limit="-to $OPTARG"
            ;;
        s)
            print_only=true
            ;;
        *)
            echo "usage: `basename $0` [+-q ARG] [+-c ARG} [--] ARGS..."
            exit 2
    esac
done
shift `expr $OPTIND - 1`
OPTIND=1

input="$1"
output="${2:-$(echo $input | sed 's/--original.*/--reencoded.webm/')}"

command="$(cat<<EOF
ffmpeg -y -i "$input" $time_limit \
       -vf "scale='-1':'min($limit_resolution,ih)',
            fps='$limit_fps'" \
       -c:v libvpx-vp9 -b:v 0 -crf $q -an \
       -row-mt 1 -tile-columns 2 -tile-rows 2 -cpu-used $cpu -g 240 \
       -pass 1 -f webm -threads $cpu /dev/null &&
    ffmpeg -y -i "$input" $time_limit \
           -vf "scale='-1':'min($limit_resolution,ih)',
                fps='$limit_fps'" \
               -c:v libvpx-vp9 -b:v 0 -crf $q -c:a libopus \
               -row-mt 1 -tile-columns 2 -tile-rows 2 -cpu-used $cpu \
               -pass 2 -threads $cpu -- "$output"
EOF
)"

if [ $print_only == true ]; then
    echo "$command"
else
    eval "$command"
fi

Process the audio and captions

Processing the audio is relatively straightforward.

emacsconf-%--reencoded.opus: emacsconf-%--reencoded.webm
  ffmpeg -i "$<" -c:a copy "$@"

emacsconf-%--normalized.opus: emacsconf-%--reencoded.opus
  ffmpeg-normalize "$<" -ofmt opus -c:a libopus -o "$@"

emacsconf-%--reencoded.vtt: emacsconf-%--reencoded.opus
  whisperx --model large-v2 --align_model WAV2VEC2_ASR_LARGE_LV60K_960H --compute_type int8 --print_progress True --max_line_width 50 --segment_resolution chunk --max_line_count 1 --language en "$<"

After this, we need to manually process the --reencoded.vtt and then eventually save the edited version as --main.vtt.

Combine the video, audio, and subtitles

The next part of the Makefile creates the --main.webm from the reencoded, normalized, and edited files, or from just the --reencoded.webm if that's all that's available.

emacsconf-%--main.webm: emacsconf-%--reencoded.webm emacsconf-%--normalized.opus emacsconf-%--main.vtt
  ffmpeg -i emacsconf-$*--reencoded.webm -i emacsconf-$*--normalized.opus -i emacsconf-$*--main.vtt \
    -map 0:v -map 1:a -c:v copy -c:a copy \
    -map 2 -c:s webvtt -y \
    $@

emacsconf-%--main.webm: emacsconf-%--reencoded.webm
  cp "$<" "$@"

This works because the Makefile picks the most specific set of dependencies.

Making all the files based on the original ones that are available

Finally, we need some rules to make various things. We do this with a wildcard match for all the original files, and then we make a list without the --original.*. After that, we can just use addsuffix to add the different file endings.

PRERECS_ORIGINAL := $(wildcard emacsconf-*--original.*)
PREFIXES := $(shell for f in $(PRERECS_ORIGINAL); do echo "$${f%--original.*}"; done)
PRERECS_REENCODED := $(addsuffix --reencoded.webm, $(PREFIXES))
PRERECS_OPUS := $(addsuffix --reencoded.opus, $(PREFIXES))
PRERECS_NORMAL := $(addsuffix --normalized.opus, $(PREFIXES))
PRERECS_MAIN := $(addsuffix --main.webm, $(PREFIXES))
PRERECS_CAPTIONS := $(addsuffix --reencoded.vtt, $(PREFIXES))

all: reencoded opus normal main
reencoded: $(PRERECS_REENCODED)
opus: $(PRERECS_OPUS)
normal: $(PRERECS_NORMAL)
captions: $(PRERECS_CAPTIONS)
main: $(PRERECS_MAIN)

I sometimes do the captions on my computer, so I've left them out of the all target.

Seems to be doing all right so far. It's nice having the Makefile figure out what's changed and what needs to be updated.

View org source for this post

EmacsConf backstage: making lots of intro videos with subed-record

| emacsconf, subed, emacs

Summary (735 words): Emacs is a handy audio/video editor. subed-record can combine multiple audio files and images to create multiple output videos.

Watch on YouTube

It's nice to feel like you're saying someone's name correctly. We ask EmacsConf speakers to introduce themselves in the first few seconds of their video, but people often forget to do that, so that's okay. We started recording introductions for EmacsConf 2022 so that stream hosts don't have to worry about figuring out pronunciation while they're live. Here's how I used subed-record to turn my recordings into lots of little videos.

First, I generated the title images by using Emacs Lisp to replace text in a template SVG and then using Inkscape to convert the SVG into a PNG. Each image showed information for the previous talk as well as the upcoming talk. (emacsconf-stream-generate-in-between-pages)

emacsconf.svg.png
Figure 1: Sample title image

Then I generated the text for each talk based on the title, the speaker names, pronunciation notes, pronouns, and type of Q&A. Each introduction generally followed the pattern, "Next we have title by speakers. Details about Q&A." (emacsconf-pad-expand-intro and emacsconf-subed-intro-subtitles below)

00:00:00.000 --> 00:00:00.999
#+OUTPUT: sat-open.webm
[[file:/home/sacha/proj/emacsconf/2023/assets/in-between/sat-open.svg.png]]
Next, we have "Saturday opening remarks".

00:00:05.000 --> 00:00:04.999
#+OUTPUT: adventure.webm
[[file:/home/sacha/proj/emacsconf/2023/assets/in-between/adventure.svg.png]]
Next, we have "An Org-Mode based text adventure game for learning the basics of Emacs, inside Emacs, written in Emacs Lisp", by Chung-hong Chan. He will answer questions via Etherpad.

I copied the text into an Org note in my inbox, which Syncthing copied over to the Orgzly Revived app on my Android phone. I used Google Recorder to record the audio. I exported the m4a audio file and a rough transcript, copied them back via Syncthing, and used subed-record to edit the audio into a clean audio file without oopses.

Each intro had a set of captions that started with a NOTE comment. The NOTE comment specified the following:

  • #+AUDIO:: the audio source to use for the timestamped captions that follow
  • [[file:...]]: the title image I generated for each talk. When subed-record-compile-video sees a comment with a link to an image, video, or animated GIF, it takes that visual and uses it for the span of time until the next visual.
  • #+OUTPUT: the file to create.
NOTE #+OUTPUT: hyperdrive.webm
[[file:/home/sacha/proj/emacsconf/2023/assets/in-between/hyperdrive.svg.png]]
#+AUDIO: intros-2023-11-21-cleaned.opus

00:00:15.680 --> 00:00:17.599
Next, we have "hyperdrive.el:

00:00:17.600 --> 00:00:21.879
Peer-to-peer filesystem in Emacs", by Joseph Turner

00:00:21.880 --> 00:00:25.279
and Protesilaos Stavrou (also known as Prot).

00:00:25.280 --> 00:00:27.979
Joseph will answer questions via BigBlueButton,

00:00:27.980 --> 00:00:31.080
and Prot might be able to join depending on the weather.

00:00:31.081 --> 00:00:33.439
You can join using the URL from the talk page

00:00:33.440 --> 00:00:36.320
or ask questions through Etherpad or IRC.

NOTE
#+OUTPUT: steno.webm
[[file:/home/sacha/proj/emacsconf/2023/assets/in-between/steno.svg.png]]
#+AUDIO: intros-2023-11-19-cleaned.opus

00:03:23.260 --> 00:03:25.480
Next, we have "Programming with steno",

00:03:25.481 --> 00:03:27.700
by Daniel Alejandro Tapia.

NOTE
#+AUDIO: intro-2023-11-29-cleaned.opus

00:00:13.620 --> 00:00:16.580
You can ask your questions via Etherpad and IRC.

00:00:16.581 --> 00:00:18.079
We'll send them to the speaker

00:00:18.080 --> 00:00:19.919
and post the answers in the talk page

00:00:19.920 --> 00:00:21.320
after the conference.

I could then call subed-record-compile-video to create the videos for all the intros, or mark a region with C-SPC and then subed-record-compile-video only the intros inside that region.

Sample intro

Using Emacs to edit the audio and compile videos worked out really well because it made it easy to change things.

  • Changing pronunciation or titles: For EmacsConf 2023, I got the recordings sorted out in time for the speakers to correct my pronunciation if they wanted to. Some speakers also changed their talk titles midway. If I wanted to redo an intro, I just had to rerecord that part, run it through my subed-record audio cleaning process, add an #+AUDIO: comment specifying which file I want to take the audio from, paste it into my main intros.vtt, and recompile the video.
  • Cancelling talks: One of the talks got cancelled, so I needed to update the images for the talk before it and the talk after it. I regenerated the title images and recompiled the videos. I didn't even need to figure out which talk needed to be updated - it was easy enough to just recompile all of them.
  • Changing type of Q&A: For example, some speakers needed to switch from answering questions live to answering them after the conference. I could just delete the old instructions, paste in the instructions from elsewhere in my intros.vtt (making sure to set #+AUDIO to the file if it came from a different take), and recompile the video.

And of course, all the videos were captioned. Bonus!

So that's how using Emacs to edit and compile simple videos saved me a lot of time. I don't know how I'd handle this otherwise. 47 video projects that might all need to be updated if, say, I changed the template? Yikes. Much better to work with text. Here are the technical details.

Generating the title images

I used Inkscape to add IDs to our template SVG so that I could edit them with Emacs Lisp. From emacsconf-stream.el:

emacsconf-stream-generate-in-between-pages: Generate the title images.
(defun emacsconf-stream-generate-in-between-pages (&optional info)
  "Generate the title images."
  (interactive)
  (setq info (or emacsconf-schedule-draft (emacsconf-publish-prepare-for-display (emacsconf-filter-talks (or info (emacsconf-get-talk-info))))))
  (let* ((by-track (seq-group-by (lambda (o) (plist-get o :track)) info))
         (dir (expand-file-name "in-between" emacsconf-stream-asset-dir))
         (template (expand-file-name "template.svg" dir)))
    (unless (file-directory-p dir)
      (make-directory dir t))
    (mapc (lambda (track)
            (let (prev)
              (mapc (lambda (talk)
                      (let ((dom (xml-parse-file template)))
                        (mapc (lambda (entry)
                                (let ((prefix (car entry)))
                                  (emacsconf-stream-svg-set-text dom (concat prefix "title")
                                                 (plist-get (cdr entry) :title))
                                  (emacsconf-stream-svg-set-text dom (concat prefix "speakers")
                                                 (plist-get (cdr entry) :speakers))
                                  (emacsconf-stream-svg-set-text dom (concat prefix "url")
                                                 (and (cdr entry) (concat emacsconf-base-url (plist-get (cdr entry) :url))))
                                  (emacsconf-stream-svg-set-text
                                   dom
                                   (concat prefix "qa")
                                   (pcase (plist-get (cdr entry) :q-and-a)
                                     ((rx "live") "Live Q&A after talk")
                                     ((rx "pad") "Etherpad")
                                     ((rx "IRC") "IRC Q&A after talk")
                                     (_ "")))))
                              (list (cons "previous-" prev)
                                    (cons "current-" talk)))
                        (with-temp-file (expand-file-name (concat (plist-get talk :slug) ".svg") dir)
                          (dom-print dom))
                        (shell-command
                         (concat "inkscape --export-type=png -w 1280 -h 720 --export-background-opacity=0 "
                                 (shell-quote-argument (expand-file-name (concat (plist-get talk :slug) ".svg")
                                                                         dir)))))
                      (setq prev talk))
                    (emacsconf-filter-talks (cdr track)))))
          by-track)))

emacsconf-stream-svg-set-text: Update DOM to set the tspan in the element with ID to TEXT.
(defun emacsconf-stream-svg-set-text (dom id text)
  "Update DOM to set the tspan in the element with ID to TEXT.
If the element doesn't have a tspan child, use the element itself."
  (if (or (null text) (string= text ""))
      (let ((node (dom-by-id dom id)))
        (when node
          (dom-set-attribute node 'style "visibility: hidden")
          (dom-set-attribute (dom-child-by-tag node 'tspan) 'style "fill: none; stroke: none")))
    (setq text (svg--encode-text text))
    (let ((node (or (dom-child-by-tag
                     (car (dom-by-id dom id))
                     'tspan)
                    (dom-by-id dom id))))
      (cond
       ((null node)
        (error "Could not find node %s" id))                      ; skip
       ((= (length node) 2)
        (nconc node (list text)))
       (t (setf (elt node 2) text))))))

Generating the script

From emacsconf-pad.el:

emacsconf-pad-expand-intro: Make an intro for TALK.
(defun emacsconf-pad-expand-intro (talk)
  "Make an intro for TALK."
  (cond
   ((null (plist-get talk :speakers))
    (format "Next, we have \"%s\"." (plist-get talk :title)))
   ((plist-get talk :intro-note)
    (plist-get talk :intro-note))
   (t
    (let ((pronoun (pcase (plist-get talk :pronouns)
                     ((rx "she") "She")
                     ((rx "\"ou\"" "Ou"))
                     ((or 'nil "nil" (rx string-start "he") (rx "him")) "He")
                     ((rx "they") "They")
                     (_ (or (plist-get talk :pronouns) "")))))
      (format "Next, we have \"%s\", by %s%s.%s"
              (plist-get talk :title)
              (replace-regexp-in-string ", \\([^,]+\\)$"
                                        ", and \\1"
                                        (plist-get talk :speakers))
              (emacsconf-surround " (" (plist-get talk :pronunciation) ")" "")
              (pcase (plist-get talk :q-and-a)
                ((or 'nil "") "")
                ((rx "after") " You can ask questions via Etherpad and IRC. We'll send them to the speaker, and we'll post the answers on the talk page afterwards.")
                ((rx "live")
                 (format " %s will answer questions via BigBlueButton. You can join using the URL from the talk page or ask questions through Etherpad or IRC."
                         pronoun
                         ))
                ((rx "pad")
                 (format " %s will answer questions via Etherpad."
                         pronoun
                         ))
                ((rx "IRC")
                 (format " %s will answer questions via IRC in the #%s channel."
                         pronoun
                         (plist-get talk :channel)))))))))

And from emacsconf-subed.el:

emacsconf-subed-intro-subtitles: Create the introduction as subtitles.
(defun emacsconf-subed-intro-subtitles ()
  "Create the introduction as subtitles."
  (interactive)
  (subed-auto-insert)
  (let ((emacsconf-publishing-phase 'conference))
    (mapc
     (lambda (sub) (apply #'subed-append-subtitle nil (cdr sub)))
     (seq-map-indexed
      (lambda (talk i)
        (list
         nil
         (* i 5000)
         (1- (* i 5000))
         (format "#+OUTPUT: %s.webm\n[[file:%s]]\n%s"
                 (plist-get talk :slug)
                 (expand-file-name
                  (concat (plist-get talk :slug) ".svg.png")
                  (expand-file-name "in-between" emacsconf-stream-asset-dir))
                 (emacsconf-pad-expand-intro talk))))
      (emacsconf-publish-prepare-for-display (emacsconf-get-talk-info))))))

View org source for this post

EmacsConf backstage: Trimming the BigBlueButton recordings based on YouTube duration

| emacsconf, emacs, youtube, video

I wanted to get the Q&A sessions up quickly after the conference, so I uploaded them to YouTube and added them to the EmacsConf 2023 playlist. I used YouTube's video editor to roughly guess where to trim them based on the waveforms. I needed to actually trim the source videos, though, so that our copies would be up to date and I could use those for the Toobnix uploads.

My first task was to figure out which videos needed to be trimmed to match the YouTube edits. First, I retrieved the video details using the API and the code that I added to emacsconf-extract.el.

(setq emacsconf-extract-youtube-api-video-details (emacsconf-extract-youtube-get-video-details emacsconf-extract-youtube-api-playlist-items))

Then I made a table comparing the file duration with the YouTube duration, showing rows only if the difference was more than 3 minutes.

(append
 '(("type" "slug" "file duration" "youtube duration" "diff"))
 (let ((threshold-secs (* 3 60))) ; don't sweat small differences
   (seq-mapcat
    (lambda (talk)
      (seq-keep
       (lambda (row)
         (when (plist-get talk (cadr row))
           (let* ((video (emacsconf-extract-youtube-find-url-video-in-list
                          (plist-get talk (cadr row))
                          emacsconf-extract-youtube-api-video-details))
                  (video-duration (if (and video (emacsconf-extract-youtube-duration-msecs video))
                                      (/ (emacsconf-extract-youtube-duration-msecs video) 1000.0)))
                  (file-duration (ceiling
                                  (/ (compile-media-get-file-duration-ms (emacsconf-talk-file talk (format "--%s.webm" (car row))))
                                     1000.0))))
             (when (and video-duration (> (abs (- file-duration video-duration)) threshold-secs))
               (list (car row)
                     (plist-get talk :slug)
                     (and file-duration (format-seconds "%h:%z%.2m:%.2s" file-duration))
                     (and video-duration (format-seconds "%h:%z%.2m:%.2s" video-duration))
                     (emacsconf-format-seconds
                      (abs (- file-duration video-duration))))))))
       '(("main" :youtube-url)
         ("answers" :qa-youtube-url))))
    (emacsconf-publish-prepare-for-display (emacsconf-get-talk-info)))))

Then I got the commands to trim the videos.

 (mapconcat (lambda (row)
              (let ((talk (emacsconf-resolve-talk (elt row 1))))
                (format "ffmpeg -y -i %s--%s.webm -t %s -c copy %s--%s--trimmed.webm"
                        (plist-get talk :file-prefix)
                        (car row)
                        (concat (elt row 3) ".000")
                        (plist-get talk :file-prefix)
                        (car row))))
            (cdr to-trim)
            "\n"))

After quickly checking the results, I copied them over to the original videos, updated the video data in my conf.org, and republished the info pages in the wiki.

The time I spent on figuring out how to talk to the YouTube API feels like it's paying off.

EmacsConf backstage: Figuring out our maximum number of simultaneous BigBlueButton users

| emacsconf

[2023-12-30 Sat] Update: fix total number of unique users; I flipped the assoc so that the car is the user ID and the cdr is the name

A few people have generously donated money to EmacsConf, so now we're thinking of how to use that money effectively to scale EmacsConf up or help people be happier.

One of the things I'd like to improve is our BigBlueButton web conferencing setup, since fiddling with the screen layout was a little annoying this year. We're using BigBlueButton 2.2, which was released in 2020. The current version is 2.7 and has a few improvements that I think would be very useful.

  • Better layouts mean that webcams can be on the left side, leaving more space for the presentation, which means a more pleasant viewing experience and less manual fiddling with the sizes of things.
  • Built-in timers could help speakers and hosts easily stay on track.
  • A unified WEBM export (instead of separate videos for webcams and screensharing) means less post-processing with ffmpeg, and probably a better layout too.
  • The option to share system audio when using a Chromium-based browser means easier multimedia presentations, since setting up audio loopbacks can be tricky.

We'd love to use those improvements at the next EmacsConf, and they might be handy for the handful of other Emacs meetups who use our BigBlueButton setup from time to time. I think reducing the mental load from managing screen layouts might be an important step towards making it possible to have a third track.

The current BigBlueButton is a 6-core 3.4GHz virtual machine with 8 GB RAM. During EmacsConf 2023, the CPU load stayed at around 35%, with 4 GB memory used. It idles at 3% CPU and about 3 GB RAM. We have ssh access to an account with sudo, but no higher-level access in case that breaks or in case we mess up upgrading the underlying Ubuntu distribution too, which we should because it's reached its support end-of-life.

BigBlueButton's website recommends installing 2.7 on a clean, dedicated system instead of trying to do the upgrade in place. It requires a major version upgrade to at least Ubuntu 20.04, and it recommends 16 GB memory and 8 CPU cores.

System administration isn't my current cup of tea, and the other organizers might be busy.

Some choices we're thinking about are:

  • Continue with our current 2.2 setup, just hack better layouts into it with Tampermonkey or something: probably not a very good choice from the perspective of being a good citizen of the Internet, since the system's out of date
  • Try to upgrade in place and hope we don't break anything: one of the other organizers is willing to add this to his maybe-do list
  • Install 2.7 on a new node, try to migrate to it to figure out the process, and then maybe consider spinning up a new node during EmacsConf, adding it to our hosting costs budget
  • Pay for BigBlueButton hosting: might be worth it if no one wants to take on the responsibility for managing BBB ourselves
  • Switch to hosted Jitsi: recording might be trickier

Commercial BigBlueButton hosts tend to charge based on the number of simultaneous users and the number of rooms.

It's been nice having one room per group of speakers because then we can e-mail speakers their personal URL for testing and checking in, the scripts can join the correct room automatically, we never have to worry about time, and all the recordings are split up. In previous years, we rotated among a set of five rooms, but then we needed to keep track of who was using which rooms. I think going with multiple rooms makes sense.

So it mostly comes down to the number of simultaneous users. I rsynced /var/bbb/recording/raw and cross-referenced each talk with its BBB meeting using slugs I'd added to the meeting title, disambiguating them as needed. Then I could use the following function from emacsconf-extract.el:

Report on simultaneous users
(defun emacsconf-extract-bbb-report ()
  (let* ((max 0)
         (participant-count 0)
         (meeting-count 0)
         (max-meetings 0)
         (max-participants 0)
         meeting-participants
         (meeting-events
          (sort
           (seq-mapcat
            (lambda (talk)
              (when (plist-get talk :bbb-meeting-id)
                (let ((dom (xml-parse-file (emacsconf-extract-bbb-raw-events-file-name talk)))
                      participants talking meeting-events)
                  (mapc (lambda (o)
                          (pcase (dom-attr o 'eventname)
                            ("ParticipantJoinEvent"
                             (cl-pushnew (cons (dom-text (dom-by-tag o 'userId))
                                               (dom-text (dom-by-tag o 'name)))
                                         participants)
                             (push (cons (string-to-number (dom-text (dom-by-tag o 'timestampUTC)))
                                         (dom-attr o 'eventname))
                                   meeting-events))
                            ("ParticipantLeftEvent"
                             (when (string= (dom-attr o 'module) "PARTICIPANT")
                               (push (cons (string-to-number (dom-text (dom-by-tag o 'timestampUTC)))
                                           (dom-attr o 'eventname))
                                     meeting-events)))
                            ("ParticipantTalkingEvent"
                             (cl-pushnew (assoc-default (dom-text (dom-by-tag o 'participant)) participants) talking))
                            ((or
                              "CreatePresentationPodEvent"
                              "EndAndKickAllEvent")
                             (push (cons (string-to-number (dom-text (dom-by-tag o 'timestampUTC)))
                                         (dom-attr o 'eventname))
                                   meeting-events))))
                        (dom-search dom (lambda (o) (dom-attr o 'eventname))))
                  (cl-pushnew (list :slug (plist-get talk :slug)
                                    :participants participants
                                    :talking talking)
                              meeting-participants)
                  meeting-events)))
            (emacsconf-get-talk-info))
           (lambda (a b) (< (car a) (car b))))))
    (dolist (event meeting-events)
      (pcase (cdr event)
        ("CreatePresentationPodEvent" (cl-incf meeting-count) (when (> meeting-count max-meetings) (setq max-meetings meeting-count)))
        ("ParticipantJoinEvent" (cl-incf participant-count) (when (> participant-count max-participants) (setq max-participants participant-count)))
        ("ParticipantLeftEvent" (cl-decf participant-count))
        ("EndAndKickAllEvent" (cl-decf meeting-count))))
    `((,(length meeting-participants) "Number of meetings analyzed")
      (,max-participants "Max number of simultaneous users")
      (,max-meetings "Max number of simultaneous meetings")
      (,(apply 'max (mapcar (lambda (o) (length (plist-get o :participants))) meeting-participants)) "Max number of people in one meeting")
      (,(length (seq-uniq (seq-mapcat (lambda (o) (mapcar #'cdr (plist-get o :participants))) meeting-participants))) "Total unique users")
      (,(length (seq-uniq (seq-mapcat (lambda (o) (plist-get o :talking)) meeting-participants))) "Total unique talking"))))

31 Number of meetings analyzed
62 Max number of simultaneous users
6 Max number of simultaneous meetings
27 Max number of people in one meeting
84 Total unique users
36 Total unique talking

The number of simultaneous users is pretty manageable. Most people watch the stream, which we broadcast via Icecast, so those numbers aren't reflected here. I think we tended to have between 100-200 viewers on Icecast.

For that kind of usage, some hosting options are:

  • BigBlueButton hosting:

    Host Monthly Concurrent users Notes
    BiggerBlueButton USD 40 150 I'd need to check if we can have more than 10 created rooms if only at most 10 are used concurrently
    Web Hosting Zone USD 49 100  
    Myna Parrot USD 60 75 USD 150/month + USD 15 setup fee if we want to use our own URL
    BigBlueButton.host USD 85 80  
    BigBlueMeeting USD 125 100  
    BBB On Demand     8 vCPU 32 GB RAM: USD 1.20/hour, USD 0.05/hour when stopped: USD 86 for 3 days
    BBB On Demand   100 USD 2.40/hour: USD 173 for 3 days
  • Virtual private server: We'd need to set up and manage this ourselves. We could probably run it for one week before to give speakers time to do their tech-checks and one week after to give me time to pull the recordings. The other servers are on Linode, so it might make sense to keep it there too and manage it all in one place.

    Type Monthly  
    dedicated 8 GB 4-core USD 72 USD 0.108/hour, so USD 36 if we run it for two weeks
    dedicated CPU 16 GB 8-core USD 144 USD 0.216/hour, so USD 72 if we run it for two weeks

It would be nice if we could just do the upgrade and get it back onto our current server (also, fixing up our current server with a proper SMTP setup so that it could send out things like password reminder emails), although the current BigBlueButton server was donated by a defunct organization so it might be a good idea to have a backup plan for it anyway.

It would also be nice to add it to our Ansible configuration so that we could install BigBlueButton that way, maybe based on ansible-role-bigbluebutton. But again, not my current cup of tea, so it will need to wait until someone can step up to do it or I get around to it.

The Free Software Foundation feels strongly about software as a service substitute. They're okay with virtual private servers, but I'm not sure how far their moral objection goes when it comes to using and paying for free/libre/opensource software as a service, like BigBlueButton. I'm personally okay with paying for services, especially if they're based on free software. Since EmacsConf is committed to using free software and not requiring people to use non-free software, that might be something the other organizers can weigh in on. If someone feels strongly enough about it, maybe they'll work on it. I think it can be hard enough for people to find the time for stuff they like, so if no one particularly likes doing this sort of stuff, I'm okay with scaling down or paying for something that's ready to go.

Anyway, at least we have the numbers for decisions!

View org source for this post

EmacsConf backstage: Using Spookfox to publish YouTube and Toobnix video drafts

| emacsconf, emacs, spookfox, youtube, video

I ran into quota limits when uploading videos to YouTube with a command-line tool, so I uploaded videos by selecting up to 15 videos at a time using the web-based interface. Each video was a draft, though, and I was having a hard time updating its visibility through the API. I think it eventually worked, but in the meantime, I used this very hacky hack to look for the "Edit Draft" button and click through the screens to publish them.

emacsconf-extract-youtube-publish-video-drafts-with-spookfox: Look for drafts and publish them.
(defun emacsconf-extract-youtube-publish-video-drafts-with-spookfox ()
  "Look for drafts and publish them."
  (while (not (eq (spookfox-js-injection-eval-in-active-tab
                   "document.querySelector('.edit-draft-button div') != null" t) :false))
    (progn
      (spookfox-js-injection-eval-in-active-tab
       "document.querySelector('.edit-draft-button div').click()" t)
      (sleep-for 2)
      (spookfox-js-injection-eval-in-active-tab
       "document.querySelector('#step-title-3').click()" t)
      (when (spookfox-js-injection-eval-in-active-tab
             "document.querySelector('tp-yt-paper-radio-button[name=\"PUBLIC\"] #radioLabel').click()" t)
        (spookfox-js-injection-eval-in-active-tab
         "document.querySelector('#done-button').click()" t)
        (while (not (eq  (spookfox-js-injection-eval-in-active-tab
                          "document.querySelector('#close-button .label') == null" t)
                         :false))
          (sleep-for 1))

        (spookfox-js-injection-eval-in-active-tab
         "document.querySelector('#close-button .label').click()" t)
        (sleep-for 1)))))

Another example of a hacky Spookfox workaround was publishing the unlisted videos. I couldn't figure out how to properly authenticate with the Toobnix (Peertube) API to change the visibility of videos. Peertube uses AngularJS components in the front end, so using .click() on the input elements didn't seem to trigger anything. I found out that I needed to use .dispatchEvent(new Event('input')) to tell the dropdown for the visibility to display the options. source

emacsconf-extract-toobnix-publish-video-from-edit-page: Messy hack to set a video to public and store the URL.
(defun emacsconf-extract-toobnix-publish-video-from-edit-page ()
  "Messy hack to set a video to public and store the URL."
  (interactive)
  (spookfox-js-injection-eval-in-active-tab "document.querySelector('label[for=privacy]').scrollIntoView(); document.querySelector('label[for=privacy]').closest('.form-group').querySelector('input').dispatchEvent(new Event('input'));" t)
  (sit-for 1)
  (spookfox-js-injection-eval-in-active-tab "document.querySelector('span[title=\"Anyone can see this video\"]').click()" t)
  (sit-for 1)
  (spookfox-js-injection-eval-in-active-tab "document.querySelector('button.orange-button').click()" t)(sit-for 3)
  (emacsconf-extract-store-url)
  (shell-command "xdotool key Alt+Tab sleep 1 key Ctrl+w Alt+Tab"))

It's a little nicer using Spookfox to automate browser interactions than using xdotool, since I can get data out of it too. I could also have used Puppeteer from either Python or NodeJS, but it's nice staying with Emacs Lisp. Spookfox has some Javascript limitations (can't close windows, etc.), so I might still use bits of xdotool or Puppeteer to work around that. Still, it's nice to now have an idea of how to talk to AngularJS components.

EmacsConf backstage: Making a (play)list, checking it twice

| emacs, emacsconf, spookfox, youtube, video

I wanted the EmacsConf 2023 Youtube and Toobnix playlists to mostly reflect the schedule of the conference by track, with talks followed by their Q&A sessions (if recorded).

The list

I used Emacs Lisp to generate a list of videos in the order I wanted. That Sunday closing remarks aren't actually in the playlists because they're combined with the Q&A for my session on how we run Emacsconf.

emacsconf-extract-check-playlists: Return a table for checking playlist order.
(defun emacsconf-extract-check-playlists ()
  "Return a table for checking playlist order."
  (let ((pos 0))
    (seq-mapcat (lambda (o)
                  (delq
                   nil
                   (list
                    (when (emacsconf-talk-file o "--main.webm")
                      (cl-incf pos)
                      (list pos
                            (plist-get o :title)
                            (org-link-make-string
                             (plist-get o :youtube-url)
                             "YouTube")
                            (org-link-make-string
                             (plist-get o :toobnix-url)
                             "Toobnix")))
                    (when (emacsconf-talk-file o "--answers.webm")
                      (cl-incf pos)
                      (list pos (concat "Q&A: " (plist-get o :title))
                            (org-link-make-string
                             (plist-get o :qa-youtube-url)
                             "YouTube")
                            (org-link-make-string
                             (plist-get o :qa-toobnix-url)
                             "Toobnix"))))))
                (emacsconf-publish-prepare-for-display (emacsconf-get-talk-info)))))

1 An Org-Mode based text adventure game for learning the basics of Emacs, inside Emacs, written in Emacs Lisp YouTube Toobnix
2 Authoring and presenting university courses with Emacs and a full libre software stack YouTube Toobnix
3 Q&A: Authoring and presenting university courses with Emacs and a full libre software stack YouTube Toobnix
4 Teaching computer and data science with literate programming tools YouTube Toobnix
5 Q&A: Teaching computer and data science with literate programming tools YouTube Toobnix
6 Who needs Excel? Managing your students qualifications with org-table YouTube Toobnix
7 one.el: the static site generator for Emacs Lisp Programmers YouTube Toobnix
8 Q&A: one.el: the static site generator for Emacs Lisp Programmers YouTube Toobnix
9 Emacs turbo-charges my writing YouTube Toobnix
10 Q&A: Emacs turbo-charges my writing YouTube Toobnix
11 Why Nabokov would use Org-Mode if he were writing today YouTube Toobnix
12 Q&A: Why Nabokov would use Org-Mode if he were writing today YouTube Toobnix
13 Collaborative data processing and documenting using org-babel YouTube Toobnix
14 How I play TTRPGs in Emacs YouTube Toobnix
15 Q&A: How I play TTRPGs in Emacs YouTube Toobnix
16 Org-Mode workflow: informal reference tracking YouTube Toobnix
17 (Un)entangling projects and repos YouTube Toobnix
18 Emacs development updates YouTube Toobnix
19 Emacs core development: how it works YouTube Toobnix
20 Top 10 ways Hyperbole amps up Emacs YouTube Toobnix
21 Using Koutline for stream of thought journaling YouTube Toobnix
22 Parallel text replacement YouTube Toobnix
23 Q&A: Parallel text replacement YouTube Toobnix
24 Eat and Eat powered Eshell, fast featureful terminal inside Emacs YouTube Toobnix
25 The browser in a buffer YouTube Toobnix
26 Speedcubing in Emacs YouTube Toobnix
27 Emacs MultiMedia System (EMMS) YouTube Toobnix
28 Q&A: Emacs MultiMedia System (EMMS) YouTube Toobnix
29 Programming with steno YouTube Toobnix
30 Mentoring VS-Coders as an Emacsian (or How to show not tell people about the wonders of Emacs) YouTube Toobnix
31 Q&A: Mentoring VS-Coders as an Emacsian (or How to show not tell people about the wonders of Emacs) YouTube Toobnix
32 Emacs saves the Web (maybe) YouTube Toobnix
33 Q&A: Emacs saves the Web (maybe) YouTube Toobnix
34 Sharing Emacs is Caring Emacs: Emacs education and why I embraced video YouTube Toobnix
35 Q&A: Sharing Emacs is Caring Emacs: Emacs education and why I embraced video YouTube Toobnix
36 MatplotLLM, iterative natural language data visualization in org-babel YouTube Toobnix
37 Enhancing productivity with voice computing YouTube Toobnix
38 Q&A: Enhancing productivity with voice computing YouTube Toobnix
39 LLM clients in Emacs, functionality and standardization YouTube Toobnix
40 Q&A: LLM clients in Emacs, functionality and standardization YouTube Toobnix
41 Improving compiler diagnostics with overlays YouTube Toobnix
42 Q&A: Improving compiler diagnostics with overlays YouTube Toobnix
43 Editor Integrated REPL Driven Development for all languages YouTube Toobnix
44 REPLs in strange places: Lua, LaTeX, LPeg, LPegRex, TikZ YouTube Toobnix
45 Literate Documentation with Emacs and Org Mode YouTube Toobnix
46 Q&A: Literate Documentation with Emacs and Org Mode YouTube Toobnix
47 Windows into Freedom YouTube Toobnix
48 Bringing joy to Scheme programming YouTube Toobnix
49 Q&A: Bringing joy to Scheme programming YouTube Toobnix
50 GNU Emacs: A World of Possibilities YouTube Toobnix
51 Q&A: GNU Emacs: A World of Possibilities YouTube Toobnix
52 A modern Emacs look-and-feel without pain YouTube Toobnix
53 The Emacsen family, the design of an Emacs and the importance of Lisp YouTube Toobnix
54 Q&A: The Emacsen family, the design of an Emacs and the importance of Lisp YouTube Toobnix
55 emacs-gc-stats: Does garbage collection actually slow down Emacs? YouTube Toobnix
56 Q&A: emacs-gc-stats: Does garbage collection actually slow down Emacs? YouTube Toobnix
57 hyperdrive.el: Peer-to-peer filesystem in Emacs YouTube Toobnix
58 Q&A: hyperdrive.el: Peer-to-peer filesystem in Emacs YouTube Toobnix
59 Writing a language server in OCaml for Emacs, fun, and profit YouTube Toobnix
60 Q&A: Writing a language server in OCaml for Emacs, fun, and profit YouTube Toobnix
61 What I learned by writing test cases for GNU Hyperbole YouTube Toobnix
62 Q&A: What I learned by writing test cases for GNU Hyperbole YouTube Toobnix
63 EmacsConf.org: How we use Org Mode and TRAMP to organize and run a multi-track conference YouTube Toobnix
64 Q&A: EmacsConf.org: How we use Org Mode and TRAMP to organize and run a multi-track conference YouTube Toobnix
65 Saturday opening remarks YouTube Toobnix
66 Saturday closing remarks YouTube Toobnix
67 Sunday opening remarks YouTube Toobnix
68 Sunday closing remarks YouTube Toobnix

YouTube

I bulk-added the Youtube videos to the playlist. The videos were not in order because I uploaded some late submissions and forgotten videos, which then got added to the end of the list.

I tried using the API to sort the playlist. This got it most of the way there, and then I sorted the rest by hand.

emacsconf-extract-youtube-api-sort-playlist: Try to roughly sort the playlist.
(defun emacsconf-extract-youtube-api-sort-playlist (&optional dry-run-only)
  "Try to roughly sort the playlist."
  (interactive)
  (setq emacsconf-extract-youtube-api-playlist (seq-find (lambda (o) (let-alist o (string= .snippet.title (concat emacsconf-name " " emacsconf-year))))
                                        (assoc-default 'items emacsconf-extract-youtube-api-playlists)))
  (setq emacsconf-extract-youtube-api-playlist-items
        (emacsconf-extract-youtube-api-paginated-request (concat "https://youtube.googleapis.com/youtube/v3/playlistItems?part=snippet,contentDetails,status&forMine=true&order=date&maxResults=100&playlistId="
                                                (url-hexify-string (assoc-default 'id emacsconf-extract-youtube-api-playlist)))))
  (let* ((playlist-info emacsconf-extract-youtube-api-playlists)
         (playlist-items emacsconf-extract-youtube-api-playlist-items)
         (info (emacsconf-publish-prepare-for-display (emacsconf-get-talk-info)))
         (slugs (seq-map (lambda (o) (plist-get o :slug)) info))
         (position (1- (length playlist-items)))
         result)
    ;; sort items
    (mapc (lambda (talk)
            (when (plist-get talk :qa-youtube-id)
              ;; move the q & a
              (let ((video-object (emacsconf-extract-youtube-find-url-video-in-list
                                   (plist-get talk :qa-youtube-url)
                                   playlist-items)))
                (let-alist video-object
                  (cond
                   ((null video-object)
                    (message "Could not find video for %s" (plist-get talk :slug)))
                   ;; not in the right position, try to move it
                   ((< .snippet.position position)
                    (let ((video-id .id)
                          (playlist-id .snippet.playlistId)
                          (resource-id .snippet.resourceId))
                      (message "Trying to move %s Q&A to %d from %d" (plist-get talk :slug) position .snippet.position)
                      (add-to-list 'result (list (plist-get talk :slug) "answers" .snippet.position position))
                      (unless dry-run-only
                        (plz 'put "https://www.googleapis.com/youtube/v3/playlistItems?part=snippet"
                          :headers `(("Authorization" . ,(url-oauth-auth "https://youtube.googleapis.com/youtube/v3/"))
                                     ("Accept" . "application/json")
                                     ("Content-Type" . "application/json"))
                          :body (json-encode
                                 `((id . ,video-id)
                                   (snippet
                                    (playlistId . ,playlist-id)
                                    (resourceId . ,resource-id)
                                    (position . ,position))))))))))
                (setq position (1- position))))
            ;; move the talk if needed
            (let ((video-object
                   (emacsconf-extract-youtube-find-url-video-in-list
                    (plist-get talk :youtube-url)
                    playlist-items)))
              (let-alist video-object
                (cond
                 ((null video-object)
                  (message "Could not find video for %s" (plist-get talk :slug)))
                 ;; not in the right position, try to move it
                 ((< .snippet.position position)
                  (let ((video-id .id)
                        (playlist-id .snippet.playlistId)
                        (resource-id .snippet.resourceId))
                    (message "Trying to move %s to %d from %d" (plist-get talk :slug) position .snippet.position)
                    (add-to-list 'result (list (plist-get talk :slug) "main" .snippet.position position))
                    (unless dry-run-only
                      (plz 'put "https://www.googleapis.com/youtube/v3/playlistItems?part=snippet"
                        :headers `(("Authorization" . ,(url-oauth-auth "https://youtube.googleapis.com/youtube/v3/"))
                                   ("Accept" . "application/json")
                                   ("Content-Type" . "application/json"))
                        :body (json-encode
                               `((id . ,video-id)
                                 (snippet
                                  (playlistId . ,playlist-id)
                                  (resourceId . ,resource-id)
                                  (position . ,position))))))
                    ))))
              (setq position (1- position))))
          (nreverse info))
    result))

I needed to sort some of the videos manually. Trying to scroll by dragging items to the top of the currently-displayed section of the list was slow, and dropping the item near the top of the list so that I could pick it up again after paging up was a little disorienting. Fortunately, keyboard scrolling with page-up and page-down worked even while dragging an item, so that was what I ended up doing: select the item and then page-up while dragging.

YouTube doesn't display numbers for the playlist positions, but this will add them. The numbers don't dynamically update when the list is reordered, so I just re-ran the code after moving things around.

emacsconf-extract-youtube-spookfox-add-playlist-numbers: Number the playlist for easier checking.
(defun emacsconf-extract-youtube-spookfox-add-playlist-numbers ()
  "Number the playlist for easier checking.
Related: `emacsconf-extract-check-playlists'."
  (interactive)
  (spookfox-js-injection-eval-in-active-tab "[...document.querySelectorAll('ytd-playlist-video-renderer')].forEach((o, i) => { o.querySelector('.number')?.remove(); let div = document.createElement('div'); div.classList.add('number'); div.textContent = i; o.prepend(div) }))" t))

2023-12-11_12-57-25.png
Figure 1: Adding numbers to the Youtube playlist

In retrospect, I could probably have just cleared the playlist and then added the videos using the in the right order instead of fiddling with inserting things.

Toobnix (Peertube)

Toobnix (Peertube) doesn't seem to have a way to bulk-add videos to a playlist (or even to bulk-set their visibility). I started trying to figure out how to use the API, but I got stuck because my token didn't seem to let me access unlisted videos or do other things that required proper authentication. Anyway, I came up with this messy hack to open the videos in sequence and add them to the playlist using Spookfox.

(defun emacsconf-extract-toobnix-set-up-playlist ()
  (interactive)
  (mapcar
   (lambda (o)
     (when (plist-get o :toobnix-url)
       (browse-url (plist-get o :toobnix-url))
       (read-key "press a key when page is loaded")
       (spookfox-js-injection-eval-in-active-tab "document.querySelector('.action-button-save').click()" t)
       (spookfox-js-injection-eval-in-active-tab "document.querySelector('my-peertube-checkbox').click()" t)
       (read-key "press a key when saved to playlist"))
     (when (plist-get o :qa-toobnix-url)
       (browse-url (plist-get o :qa-toobnix-url))
       (read-key "press a key when page is loaded")
       (spookfox-js-injection-eval-in-active-tab "document.querySelector('.action-button-save').click()" t)
       (spookfox-js-injection-eval-in-active-tab "document.querySelector('my-peertube-checkbox').click()" t)
       (read-key "press a key when saved to playlist")))
   (emacsconf-publish-prepare-for-display (emacsconf-get-talk-info))))

Maybe next year, I might be able to figure out how to use the APIs to do this stuff automatically.

This code is in emacsconf-extract.el.