Talk status

Time Talk Speaker Tech Prerecorded Preference
9 Opening remarks Amin Bandali (bandali)
Community update Sacha Chua (sachac) 9:31
Emacs devel update John Wiegley (johnw) Y
9:30-10:15 GNU Emacs for All Sachin Patil (psachin) will record
10:15-10:45 How a Completely Blind Manager/Developer Uses Emacs Every Day Parham Doustdar (Parham) Y
10:45-11:15 Managing your life with org-mode and other tools Marcin Swieczkowski (Marcin) Y
Lightning 11:15-12
Play and control your music with Emacs Damien Cassou (DamienCassou) 9:41 Prerec
How to record executable notes with eev - and how to play them back Eduardo Ochs (edrx) Y 19:23 Zurich
notmuch new(s) David Bremner (bremner) done 8:02 Prerec
Browsing from Emacs Aaron Jacobs (ajacobs) done 8:54 Prerec
Ledger-mode Miguel Suárez and Quiliro Ordóñez (quiliro) done 6:54 Prerec
Playing Emacs like an instrument Zen Monk Alain M. Lafon (munen) done 12:14 Prerec
A.I. that Helps Play the Game of Your Life Andrew J. Dougherty (aindilis) done 7:14 Prerec
Org-mode and FoilTeX Tom Faulkenberry done 8:06 Prerec
Use Org mode when away from the desktop Zen Monk Alain M. Lafon (munen) done 10:08 Done
12-12:45 Magit deep dive Jonathan Chu (jonathanchu) Y
12:45-1:30 Emacs as my Go To Script Language Howard Abrams (howard-abrams) Y
1:30-2:15 Continuously checking for quality of your packages Damien Cassou (DamienCassou) Y
3:15-4 Interactive Remote Debugging and Development with TRAMP Mode Matt Ray 35:24 Prerec
Lightning 2:15-3:15
Object oriented spreadsheets with example applications David O’Toole (dto) Y 10:02 Live
How Emacs became my awesome Java editing environment Torstein Krause Johansen (skybert) Y 9:08 Live
Porting org-shiftup/down as a separate module MetroWind 12:10 Live
Don’t wait! Write your own (yas)snippet Tony Aldon 8:11
Packaging emacs packages for Debian David Bremner (bremner) 9:49
Restclient and org-mode for Api Documentation and Testing Mackenzie Bligh 6:23 Prerec
Automate your workflow as a game developer Jānis Mancēvičs 8:55 Prerec
Equake mode Ben Slade 7:43 Prerec
Navigel to facilitate the creation of tabulated-list based UIs Damien Cassou (DamienCassou) 9:25 Prerec
VSCode is Better than Emacs Zaiste 9:31 Prerec
4-4:30 GNU Emacs as software freedom in practice Greg Farough (pref: they)
4:45-5:45 Emacs: The Editor for the Next Forty Years Perry E. Metzger (pmetzger) Y Prerec
4:30-4:45 Closing remarks Amin Bandali (bandali)

Before the conference

  • Amin: download all prerecorded videos and set up OBS scenes for easy switching (Emacs, Jitsi, video player)
  • Sacha: download all prerecorded videos and set up OBS scenes for easy switching (Emacs, Jitsi, video player)
  • Draft text to be pasted on Emacs Conference 2019 page for watching
  • Test if we can both stream to Icecast
  • Test if we can stream from Icecast to Youtube
  • Test if we can record Icecast stream
  • Test if Youtube recording works properly
  • Test playing a prerecorded video
  • Draft speaker instructions

Speaker instructions

  • Please use your favourite IRC client to join #emacsconf-org on on the day of the conference. It should be a low-traffic channel for coordinating with speakers. Check in with sachac and bandali by saying hi, mentioning your name/talk if it's not obvious from your nick. Sacha (or the backup organizer) will coordinate with you for a tech check before you speak, and will give you the go-ahead to join a Jitsi session for the main presentation.
  • You can also join #emacsconf if you'd like to keep an eye on the conversations, or #emacsconf-questions for a more moderated view.
  • Please wear earphones or headphones in order to minimize microphone feedback.
  • Some of our attendees are blind, so please try to verbally describe what you're showing on the screen. We will also ask volunteers to describe what's going on in the #emacsconf channel (or maybe


Plan for the conference day

  • Main organizer: Amin
  • Backup: Sacha
  • Other volunteers: bremner and ggoes - channel monitoring


  • Main organizer starts streaming an "Emacs Conference 2019 will start at ...." page.
  • Backup organizer sets up backup stream to Youtube
    • ffmpeg -i -c:a copy -c:v copy rtmp://
    • Start streaming
  • Main organizer and backup do tech check
  • Backup confirms Icecast stream can be seen
  • Backup confirms Youtube stream can be seen
  • Both organizers start recording, stop recording, and confirm recording playback.
    • Recording off Icecast: Main organizer
      • ffmpeg -i -c:a copy -c:v copy out.webm
    • Recording off YouTube: Backup organizer
    • Mirroring to secondary Icecast sever: volunteer
      • ffmpeg -i -c:a copy -c:v copy -content_type video/webm icecast://
  • Both organizers start recording again
  • Main organizer updates wiki with watching instructions
  • Backup organizer confirms watching instructions
  • Main organizer switches to agenda/opening image and does opening remarks
  • Backup organizer streams on phone so that she can monitor it while doing tech checks

Throughout the day

  • Backup checks #emacsconf-org channel and coordinates with speakers.
    • Planned talks: check if the speaker is available and can do a quick tech check
    • Lightning talks: Check who's ready to do their talk live with a quick tech check beforehand
      • All right, who wants to do the next lightning talk?
      • Please go to for a quick tech check.
      • When you're ready, close the tech check tab and go to ___.
  • Backup does tech check with speaker in a separate jitsi room and coordinates via IRC.
  • When ready, speaker joins main conference room and presents OR main organizer changes to a different room.
  • Backup organizer updates organizer's notebook with talk status
  • Backup organizer tweets talk info

Playing prerecorded videos

  • Main organizer introduces talk
  • Main organizer switches to OBS video player scene and plays video with video player
  • Main organizer posts "PLAYED: " in #emacsconf-org (so that it's easy to check which ones have been played already - maybe we should have a wiki page? /)</li> </ul> <h3>In case of...</h3> <h4>Technical issues / speakers not present</h4> <ul> <li>Main organizer makes brief announcement, then play prerecorded videos</li> <li>If there are no more prerecorded videos, possibly open the floor to participants and treat it as a hangout</li> </ul> <h4>Speaker talking too long</h4> <ul> <li>If the next live presenter is lined up, main organizer gently nudges speaker to wrap up in five minutes</li> <li>If no live presenter is lined up, backup organizer keeps checking the #emacsconf-org channel to see who will speak next, doing tech-check before giving the main organizer the go-ahead to nudge the speaker.</li> </ul> <p>We don't have to bump live presenters for a prerecorded presentation, because we can play all the prerecorded presentations at the end.</p> <h4>Disruptive people joining Jitsi room</h4> <ul> <li>Main organizer switches to technical difficulties message or different Jitsi room</li> <li>Backup coordinates with speaker to join a different room</li> </ul> <h4>Jitsi down</h4> <ul> <li>Main organizer describes technical difficulties and updates status page</li> <li>Main organizer plays prerecorded videos while backup organizer retries Jitsi with help from volunteers, coordinating via IRC</li> <li>TODO Back up plan in case Jitsi doesn't work? Say sorry and try again a different day?</li> </ul> <h3>After live presentations end</h3> <ul> <li>Main organizer makes closing remarks</li> <li>Main organizer plays remaining prerecorded videos</li> <li>After all prerecorded videos, main organizer says thank you, ends the stream, and ends the recording.</li> </ul> <h2>Lessons learned for next time</h2> <ul> <li>Indicate conference times and timezone in call for proposals.</li> <li>Consider anonymized conference submissions to reduce bias. Encourage people to do personal outreach if there are people they would like to invite to speak.</li> </ul> </div> </div> <div id="footer" class="pagefooter" role="contentinfo"> <div id="pageinfo"> <div id="backlinks"> Backlinks: <a href="../">2019</a> <a href="../../2020/planning/">2020/planning</a> <a href="../../2021/planning/">2021/planning</a> <a href="../../2022/planning/">2022/planning</a> <a href="../../2023/planning/">2023/planning</a> </div> <div class="pagecopyright"> <a name="pagecopyright"></a> Copyright © 2019 Sacha Chua </div> <div class="pagelicense"> <a name="pagelicense"></a> <p>Unless otherwise noted, the material on the EmacsConf wiki are <a href="../../COPYING/">dual-licensed under CC BY-SA 4.0 and GPLv3+</a>.</p> </div> <div class="pagedate"> Last edited <span class="date">Sunday 19 July 2020 at 19:55 (UTC)</span> <!-- Created <span class="date">Wednesday 13 May 2020 at 14:12 (UTC)</span> --> </div> </div> <!-- from EmacsConf --> </div> </div> <script> // @license magnet:?xt=urn:btih:90dc5c0be029de84e523b9b3922520e79e0e6f08&dn=cc0.txt txt CC0-1.0 // Copyright (C) 2021, 2022 Sacha Chua if (document.querySelector('.times')) { var dateOptions = {dateStyle: 'short', timeStyle: 'short'}; var localStart = (new Date(document.querySelector('.times').getAttribute('start'))).toLocaleString([], dateOptions); var localEnd = (new Date(document.querySelector('.times').getAttribute('end'))).toLocaleString([], dateOptions); var dateElem = document.createElement('div'); dateElem.appendChild(document.createTextNode('Your local time: ~ ' + localStart + ' to ~ ' + localEnd)); document.querySelector('.times').prepend(dateElem); if (document.querySelector('.times').querySelector('.others')) { document.querySelector('.times').querySelector('.others').style.display = 'none'; } } if (document.querySelector('.time-overlay')) { document.querySelectorAll('.time-overlay').forEach(function (o) { if (o.getAttribute('title')) return; var dateOptions = {dateStyle: 'short', timeStyle: 'short'}; var localStart, localEnd; if (o.getAttribute('start') && o.getAttribute('end')) { localStart = (new Date(o.getAttribute('start'))).toLocaleString([], dateOptions); localEnd = (new Date(o.getAttribute('end'))).toLocaleString([], dateOptions); o.setAttribute('title', 'Your local time: ~ ' + localStart + ' to ~ ' + localEnd); } else if (o.getAttribute('start')) { localStart = (new Date(o.getAttribute('start'))).toLocaleString([], dateOptions); o.setAttribute('title', 'Your local time: ~ ' + localStart); } }); } if (document.querySelector('a[name=transcript]')) { var transcriptLink = document.createElement('a'); transcriptLink.setAttribute('href', '#transcript'); transcriptLink.textContent = 'View transcript'; var video = document.querySelector('.mainVideo video'); if (video) { var resources = document.querySelector('.mainVideo video').closest('.vid').querySelector('.resources'); var transcriptDiv = document.createElement('div'); transcriptDiv.appendChild(transcriptLink) if (resources) { resources.prepend(transcriptDiv); } } } var chat = document.querySelector('.chat-iframe'); if (chat) { if (chat.getAttribute('data-track')) { chat.innerHTML = '<iframe src=",emacsconf-' + chat.getAttribute('data-track').replace(/[^A-Za-z]/g, '') + '" height="600" width="100%"></iframe>'; } else { chat.innerHTML = '<iframe src="" height="600" width="100%"></iframe>'; } } // @license-end </script> <script> // @license magnet:?xt=urn:btih:90dc5c0be029de84e523b9b3922520e79e0e6f08&dn=cc0.txt txt CC0-1.0 // Copyright (c) 2021 Sacha Chua - CC0 Public Domain function displayChapters(elem) { var i; var chapter; var list = document.createElement('ol'); list.setAttribute('class', 'chapters'); var link; var target = elem.getAttribute('data-target'); var video = document.getElementById(target); var track; if (video) { track = video.addTextTrack('chapters'); track.mode = 'hidden'; } var chapters = elem.textContent.split(/[ \t]*\n+[ \t]*/).forEach(function(line) { var m = (line.match(/^(((?:[0-9]+:)?[0-9]+:[0-9]+)(?:\.[0-9]+))[ \t]+(.*)/)); if (m) { var start = m[1]; var text = m[3]; chapter = document.createElement('li'); link = document.createElement('a'); link.setAttribute('href', '#'); link.setAttribute('data-video', target); link.setAttribute('data-start', start); link.setAttribute('data-start-s', parseSeconds(start)); link.appendChild(document.createTextNode(m[2] + ' ' + text)); link.onclick = handleSubtitleClick; chapter.appendChild(link); list.appendChild(chapter); if (track) { var time = parseSeconds(start); if (track.cues.length > 0) { track.cues[track.cues.length - 1].endTime = time - 1; } track.addCue(new VTTCue(time, time, text)); } } }) if (track && track.cues.length > 0) { video.addEventListener('durationchange', function() { track.cues[track.cues.length - 1].endTime = video.duration; }); track.addEventListener('cuechange', function() { if (!this.activeCues[0]) return; if (list.querySelector('.current')) { list.querySelector('.current').className = ''; } var chapter; if (chapter = list.querySelector('a[data-start-s="' + this.activeCues[0].startTime + '"]')) { chapter.parentNode.className = 'current'; } }); } elem.parentNode.replaceChild(list, elem); } document.querySelectorAll('pre.chapters').forEach(displayChapters); var video = document.querySelector('video.reload'); if (video) { var myVar = setInterval(reloadAsNeeded, 1000); var oldTime = ''; function reloadAsNeeded() { if ((video.paused != true && (video.currentTime - oldTime) == 0 && video.currentTime != 0)) { var source = video.querySelector('source'); var oldVideo = source.src; source.src = ''; source.src = oldVideo; video.load();; } oldTime = video.currentTime; }; } // @license-end // @license magnet:?xt=urn:btih:90dc5c0be029de84e523b9b3922520e79e0e6f08&dn=cc0.txt txt CC0-1.0 // Copyright (c) 2023 Sacha Chua - CC0 Public Domain function highlightTalks() { // highlight any talk mentioned in the highlight URL parameter var params = new URLSearchParams(; if (!params.get('highlight')) return; var talks = params.get('highlight').split(',').filter(function(o) { return o.match(/^[-a-z0-9]+$/); }); var regexp = new RegExp('/talks/(' + talks.join('|') + ')/?$'); document.querySelectorAll('a[href]').forEach(function(link) { console.debug(link.getAttribute('href'), link.getAttribute('href').match(regexp)); if (link.getAttribute('href').match(regexp)) { console.debug(link); link.classList.add('highlight'); } }); } addEventListener('DOMContentLoaded', highlightTalks); // @license-end </script> </body> </html>