Dear all, Here are the meetup notes.
TL;DR: whisper.el + org-capture; multi-line table cells; page-view package; "double-capture" meeting notes workflow; export flow; performance of Org export. - As usual, we started from Emacs News https://sachachua.com/blog/2025/12/2025-12-08-emacs-news/ - I had some connection issues at the beginning. Had to re-connect and switch to mobile network. - Sacha shared her current tinkering with making use of whisper.el to quickly record org-capture notes - She ideally wants to use streaming to get things typed as she talks - https://github.com/ufal/SimulStreaming/tree/main/whisper_streaming - Ihor: There is also built-in streaming, but my personal experience is not great with it (quality of recognition drops) - One of the problems with non-streaming is that it is quite slow - We quickly figured that setting ~whisper-use-threads~ can help a lot. The default is using no more than 4 cores. Ramping it up to something closer to what CPU can handle can speed up recognition to levels that are comfortable. - In theory, one may also use GPU for even better performance - Ihor: I personally feel comfortable with whisper-use-threads=7 on my 5+ years old laptop without proper GPU (only built-in Intel that shares CPU resources) #+begin_src emacs-lisp (use-package whisper :straight (whisper :host github :repo "natrys/whisper.el") :bind ("<f6>" . whisper-run) :config (setq whisper-install-directory "~/Dist/" whisper-model "base" whisper-language "en" whisper-translate nil whisper-use-threads (- (num-processors) 1))) #+end_src - One interesting feature of whisper is --prompt "you can give it a hint about whether you want punctuation and capitalization, skip filler words or include them, etc." -- Sacha not fully trained on - Ihor: I just pass the output through LLM to fix recognition issues See ~yant/gptel-cleanup-voice-recognition~ in https://github.com/yantar92/emacs-config/blob/4309703807d6af547db6c9d304e5ceb21fd79cd4/config.org?plain=1#L8522-L8562 - org-user asked about working with Org tables that have very wide columns - There is indeed setting column width + collapsing columns via overlays (built-in) - Other solution is https://github.com/misohena/phscroll, although it is a bit of a hack and may be finicky when Org buffer is open in multiple windows - There is also M-x org-table-edit-field to edit field in separate table. Does not help with display, but editing is easier then. - We have also been discussing adding multiline cells to Org tables, but we haven't found a satisfactory and backwards-compatible syntax See https://list.orgmode.org/orgmode/878rkyarvm.fsf@localhost/ - If someone has ideas, feel free to write to the mailing list (reply to the linked thread or just post a new email; whatever is easier) - Org mode also supports Emacs' built-in table.el tables that do support multiline cells. Export will also work there. But not formulas. - Standard commands like M-left/right will not work there. You will need C-c ' to switch to table.el major mode buffer for editing. See documentation inside table.el file for more details about that major mode. It is fairly powerful. - Example table +---------------+---------------+---------------+ | just write | | | |here and it is | | | |multiline | | | +---------------+---------------+---------------+ | | | | | | | | | | | | +---------------+---------------+---------------+ - org-user also asked karthink about timeline for landing Org latex preview - karthink is short on free time to work on it, so no timelines - (he also has gptel backlog on top of other things) - I want a bit astray and recalled one of the gptel feature requests: calling ~gptel-send~ synchronously (useful to implement agents) https://github.com/karthink/gptel/issues/1158 - I have an ad-hoc solution to this - simply call gptel-send asynchronously followed by ~sleep-for~ loop. The callback for gptel will set a flag when the loop ends. - org-user asked about in-buffer completion dropdown I use. It is https://github.com/minad/corfu - We also briefly looked into https://github.com/bradmont/page-view - It looked fancy, but ruined my margin setup :) - Nick Anderson has a very specific capture workflow for meetings He has two separate place to clock meeting time and meeting notes #+begin_quote I have different capture templates for each meeting. I have a capture template for my "worklog" which goes to a note for today and clocks time. When I capture or meetings, it's an immediate finish and then i want to capture to my worklog so that from worklog I have a link to that meeting and then my time is clocked in worklog. I capture to the meeting and immediately capture to worklog (it's clocking time) yes, I follow the backlink back to the meeting note and keep taking notes. Each day I have a new worklog file. It links to all the other notes for things I did in the day, all worklog is for is holding clock time. (worklog/YYYY-MM-DD.org, meetings/org-meetup/YYYY-MM-DD.org) #+end_quote #+begin_src org ,* IN_PROGRESS Org Meetup :meeting: :properties: :prior_context: [[id:82a41521-2267-4c4d-bca4-e79d5ab6f6ee][Org meetup 2025-12-10]] :ID: edeb7194-1c2d-4e4a-a7ef-0ccd8066b2b0 :end: :LOGBOOK: CLOCK: [2025-12-10 Wed 10:39] CLOCK: [2025-12-10 Wed 10:19]--[2025-12-10 Wed 10:38] => 0:19 :END: Then that prior_context links to this node in the meeting specific file. ,** Org meetup 2025-12-10 :PROPERTIES: :ID: 82a41521-2267-4c4d-bca4-e79d5ab6f6ee :END: #+end_src - He does not use agenda, so I had a bit of a hard time getting the workflow :) - In any case, his workflow requires nested captures, which might be finicky - I did not suggest anything non-obvious other than generic (blindly) info about capture hooks. - karthink asked whether ~org-export-before-processing-functions~ runs in original Org buffer or in the working copy - All the details about export process are described in [[info:org#Advanced Export Configuration][org#Advanced Export Configuration]], step by step - Answer: in the copy - karthink also asked about performance of Org export. He is particularly concerned about storing ~buffer-string~ in variable + ~insert~ than in other place vs primitive and fast ~insert-buffer-substring~ (in ~org-element--generate-copy-script~) - ~insert-buffer-substring~ is indeed faster - But the question is whether ~buffer-string~ is the real bottleneck in the existing code. I'd say that there is little point trying small speed-ups randomly. We should rather focus on real performance bottlenecks. For me, it draws analogies with https://en.wikipedia.org/wiki/Amdahl's_law. The results of optimizing non-critical parts of the code may not worth the effort. - karthink that asked about an update on refactoring branch - it did not move at all as I just have enough time to keep up with bug reports and patches - The previous update still relevant: https://list.orgmode.org/orgmode/874j6zlhpu.fsf@localhost/ (more details) :chat: [17:04] yantar92 is now the presenter [17:04] [Sacha Chua : VIEWER]: Yay! Happy to see you. =) [17:04] [Sacha Chua : VIEWER]: (I was beginning to worry that I got my crontab wrong =) ) [17:09] [yantar92 : MODERATOR]: The latest Emacs News: https://sachachua.com/blog/2025/12/2025-12-08-emacs-news/ [17:10] [Nick Anderson : VIEWER]: Not sure if it's some kind of noise suppression but your audio is terribly choppy [17:10] [Sacha Chua : VIEWER]: your audio is choppy for me too =( [17:10] [Dave Marquardt : VIEWER]: Can confirm 😊 [17:11] [Nick Anderson : VIEWER]: works fine there [17:11] [Sacha Chua : VIEWER]: Yeah the server seems to have reasonable CPU load and memory [17:11] yantar92 is now the presenter [17:12] [Sacha Chua : VIEWER]: I can hear you better now [17:12] [Nick Anderson : VIEWER]: its better now [17:12] [Sacha Chua : VIEWER]: Also there were a bunch of Org-related talks at EmacsConf, fun! =) [17:13] [Sacha Chua : VIEWER]: I'm mulling over how to use whisper.el and org-capture to stick speech-to-text notes into an Org file =) [17:14] [Nick Anderson : VIEWER]: I use whisper.el [17:14] [Sacha Chua : VIEWER]: Yeah it should be pretty straightforward [17:14] [Nick Anderson : VIEWER]: every day [17:14] [Nick Anderson : VIEWER]: It's slow, but serviceable. [17:15] [Sacha Chua : VIEWER]: Nick: If you come across something that works with streaming output so that it's easier to keep track of what I was talking about, I'd love to hear about it! =) [17:15] [Nick Anderson : VIEWER]: thats what i am looking for too, there are somethings out but i haven't seen things stiched together [17:15] [Nick Anderson : VIEWER]: There was a new msft thing that i mean to look more into i think [17:16] [Sacha Chua : VIEWER]: I checked out SimulStreaming and that might be interesting but I haven't integrated it into Emacs yet. [17:17] [Nick Anderson : VIEWER]: 30 sec windows [17:17] [Sacha Chua : VIEWER]: Oooh, I think ideally I would press an org-capture-like key, start recording, press C-c C-c or something similar to finish the note, and have the transcription and saving happen asynchronously so I can get back to working on stuff. [17:18] [Nick Anderson : VIEWER]: yeah [17:18] [Nick Anderson : VIEWER]: i just want it to happen in real time 😁 [17:21] [Nick Anderson : VIEWER]: when i go rambling for a while i dont enjoy waiting for the transcription to finish. whisper.el works pretty well for short things. [17:21] [Nick Anderson : VIEWER]: 10s of seconds or minutes [17:21] [Nick Anderson : VIEWER]: is "long" for me [17:22] [Nick Anderson : VIEWER]: right now it seems to take about as long as i speak [17:23] [Sacha Chua : VIEWER]: I was also thinking of exploring a client-server model that can keep the language model in memory [17:23] [Nick Anderson : VIEWER]: hum im using base and language [17:23] [Nick Anderson : VIEWER]: OOOOOOH [17:23] [Nick Anderson : VIEWER]: yeah it's nil [17:23] [Sacha Chua : VIEWER]: oooooh I should try whisper-use-threads [17:23] [yantar92 : MODERATOR]: (use-package whisper :straight (whisper :host github :repo "natrys/whisper.el") :bind ("" . whisper-run) :config (setq whisper-install-directory "~/Dist/" whisper-model "base" whisper-language "en" whisper-translate nil whisper-use-threads (- (num-processors) 1))) [17:23] [Sacha Chua : VIEWER]: Oh it says default is whisper.cpp default (number of cores but max 4) [17:24] [Nick Anderson : VIEWER]: ok much better [17:24] [Nick Anderson : VIEWER]: Thanks [17:24] [Sacha Chua : VIEWER]: Ooooh, faster [17:25] [Nick Anderson : VIEWER]: ioll have to re-check for gpu [17:26] [Nick Anderson : VIEWER]: nice [17:26] [Sacha Chua : VIEWER]: Hmm, neat [17:27] [Sacha Chua : VIEWER]: (you probably mean speech recognition artefacts instead of speed recognition artefacts in your prompt) [17:28] [Sacha Chua : VIEWER]: Yeah, this year I learned how to use the initial_prompt for whisper to get it to more often spell Emacs correctly when transcribing the talks =) [17:28] [Sacha Chua : VIEWER]: Maybe it's in one of the arguments [17:28] [Nick Anderson : VIEWER]: yant/gptel-cleanup-voice-recognition: https://github.com/yantar92/emacs-config/blob/4309703807d6af547db6c9d304e5ceb21fd79cd4/config.org?plain=1#L8522-L8562 [17:29] [Sacha Chua : VIEWER]: Yeah, it does! [17:29] [Sacha Chua : VIEWER]: So you can give it a hint about whether you want punctuation and capitalization, skip filler words or include them, etc. [17:30] [Sacha Chua : VIEWER]: and technical terms [17:32] [org-user : VIEWER]: Any tips for Org tables that have wide columns, other than setting the width? [17:33] [Sacha Chua : VIEWER]: phscroll? [17:33] [Sacha Chua : VIEWER]: https://github.com/misohena/phscroll [17:34] [org-user : VIEWER]: phscroll looks interesting. Thanks! [17:34] [Sacha Chua : VIEWER]: Oh, it could be fun to have a records-like view of a single row [17:34] [org-user : VIEWER]: Exactly [17:34] [Sacha Chua : VIEWER]: so like, you pop the row out into a different buffer that has the headers and the row values, with shortcuts for going to the next/previous rows... [17:35] [Sacha Chua : VIEWER]: ... what, we have multiline tables now? [17:35] [Sacha Chua : VIEWER]: Neat! [17:36] [org-user : VIEWER]: Thanks, Ihor! [17:44] [yantar92 : MODERATOR]: https://list.orgmode.org/orgmode/878rkyarvm.fsf@localhost/ [17:46] [org-user : VIEWER]: Any timelines on the latex preview revamp? [17:49] [karthink : VIEWER]: Waiting for free time to work on it again, probably later this month [17:49] [karthink : VIEWER]: Yeah, there's also a gptel backlog [17:50] [karthink : VIEWER]: Yes, I think you were running sleep in a loop [17:51] [Nick Anderson : VIEWER]: I've got this thing that I've been thinking about for a while to do a double capture for helping my inter-linking. I have different capture templates for each meeting. I have a capture template for my "worklog" which goes to a note for today and clocks time. When I capturef or meetings, it's an immediate finish and then i want to capture to my worklog so that from worklog I have a link to that meeting and then my time is clocked in worklog. I guess probably use org-capture-after-finalize-hook [17:52] [Nick Anderson : VIEWER]: emacs news is more interesting 😁 [17:56] [org-user : VIEWER]: Ihor, what was providing the completion when you were editing the "straight" invocation (completion for the supported keywords etc) [17:59] [Nick Anderson : VIEWER]: /meetings/org-meetup-DATE.org and /worklog/YYYY-MM-DD.org with entries for things I do, one for example links to the org-meetup for this date. [17:59] [Nick Anderson : VIEWER]: all clocked time is in worklog/*.org files [17:59] [Nick Anderson : VIEWER]: yes, because I use %%a to link back to where i just was [18:00] [Nick Anderson : VIEWER]: so then worklog has an id link to the meeting [18:00] [Nick Anderson : VIEWER]: ? I dont understand what you mean in sequence [18:00] [Nick Anderson : VIEWER]: Right now it's manual yeah i capture for one, then i trigger captuer again [18:01] [Nick Anderson : VIEWER]: yeah thats what i was thinking after finalize hook but fishing for better ideas. [18:01] [Nick Anderson : VIEWER]: humm thanks [18:04] [yantar92 : MODERATOR]: https://github.com/minad/corfu [18:06] [yantar92 : MODERATOR]: https://github.com/bradmont/page-view [18:08] [Nick Anderson : VIEWER]: Just for trying to explain ... but doesn't need covered more I think ... Basically in my worklog I want this: # ``` # * IN_PROGRESS Org Meetup :meeting: # :properties: # :prior_context: [[id:82a41521-2267-4c4d-bca4-e79d5ab6f6ee][Org meetup 2025-12-10]] # :ID: edeb7194-1c2d-4e4a-a7ef-0ccd8066b2b0 # :end: # :LOGBOOK: # CLOCK: [2025-12-10 Wed 10:39] # CLOCK: [2025-12-10 Wed 10:19]--[2025-12-10 Wed 10:38] => 0:19 # :END: # ``` Then that prior_context links to this node in the meeting specific file. # ``` # ** Org meetup 2025-12-10 # :PROPERTIES: # :ID: 82a41521-2267-4c4d-bca4-e79d5ab6f6ee # :END: # ``` All I get from that is the link to this meeting file which happened today where I was clocking time without having to trigger another capture manually. [18:08] [yantar92 : MODERATOR]: https://orgmode.org/worg/org-contrib/babel/intro.html [18:09] [Nick Anderson : VIEWER]: yeop [18:10] [Nick Anderson : VIEWER]: yes, yes [18:11] [Nick Anderson : VIEWER]: I captrue to the meeting and immediately capture to worklog (it's clocking time) yes, i follow the backlink back to the meeting note and keep taking notes. [18:11] [Nick Anderson : VIEWER]: its just so that i can navigate around to specific context [18:11] [Nick Anderson : VIEWER]: im apparently bad ad explaining it shortly [18:12] [Nick Anderson : VIEWER]: its my custom workflow yes indeed [18:12] [Nick Anderson : VIEWER]: Each day i have a new worklog file. [18:13] [Nick Anderson : VIEWER]: it links to all the other notes for things i did in the day, all worklog is for is holidng clock time [18:13] [Nick Anderson : VIEWER]: and a short overview of all i did that day in the one file [18:13] [Nick Anderson : VIEWER]: in the worklog file [18:13] [Nick Anderson : VIEWER]: its just a heading [18:13] [Nick Anderson : VIEWER]: yep [18:13] [Nick Anderson : VIEWER]: worklog/YYYY-MM-DD.org [18:14] [Nick Anderson : VIEWER]: meetgins/org-meetup/YYYY-MM-DD.org [18:14] [Nick Anderson : VIEWER]: yes [18:14] [Nick Anderson : VIEWER]: something like that [18:16] [Nick Anderson : VIEWER]: yeah thats like backwards from what im doing [18:16] [Nick Anderson : VIEWER]: but also useful and something i also have and use [18:16] [Nick Anderson : VIEWER]: anyway, thank you [18:17] [Nick Anderson : VIEWER]: As I get interrupted I open new captures and then have to eventually unwind and finish them off [18:18] [Nick Anderson : VIEWER]: Which is probably related to why my notes are in a different file from the active captrue that is clocking the time [18:19] [Nick Anderson : VIEWER]: yeah i still dont use agenda 😁 [18:20] [karthink : VIEWER]: Quick question about org-export-before-processing-functions: Does this run in the current buffer or in the export buffer (copy of current Org buffer)? [18:21] [karthink : VIEWER]: Got it, thanks. [18:21] [yantar92 : MODERATOR]: [[info:org#Advanced Export Configuration][org#Advanced Export Configuration]] [18:22] [karthink : VIEWER]: Also, I was wondering: is insert-buffer-substring more efficient than running (buffer-string) and inserting the string into another buffer? It looks like it might be, in which case org-export's memory usage can be decreased a little [18:23] [karthink : VIEWER]: Since insert-buffer-substring copies bytes directly and doesn't create an intermediate string object -- at least that's my impression from a cursory look at the source. [18:25] [karthink : VIEWER]: org-element--generate-copy-script [18:25] [karthink : VIEWER]: Look for str in this function [18:26] [karthink : VIEWER]: It triggers once per export, right? [18:27] [karthink : VIEWER]: export is memory usage heavy, so I thought we could reduce some GC pressure [18:28] [karthink : VIEWER]: Essentially one `(buffer-string)` worth of memory [18:28] [karthink : VIEWER]: Yeah, just a thought for now [18:33] [karthink : VIEWER]: Any news on your Org refactoring attempt, Ihor? [18:34] [karthink : VIEWER]: I can relate [18:34] [org-user : VIEWER]: What would the refactoring achieve? [18:36] [org-user : VIEWER]: I can see why this would be time-consuming, but useful when done [18:36] [org-user : VIEWER]: Heh [18:39] [yantar92 : MODERATOR]: https://list.orgmode.org/orgmode/874j6zlhpu.fsf@localhost/ [18:39] [yantar92 : MODERATOR]: more details on refactoring [18:41] [oylenshpeegul : VIEWER]: Thank you! [18:41] [Dave Marquardt : VIEWER]: Thanks! :end: -- Ihor Radchenko // yantar92, Org mode maintainer, Learn more about Org mode at <https://orgmode.org/>. Support Org development at <https://liberapay.com/org-mode>, or support my work at <https://liberapay.com/yantar92>
