bug#81526: 30.2; Emacs.app lacks class-based TCC usage-description keys, crashing subprocesses that touch privacy-gated frameworks
Stéphane Marks <[email protected]> Fri, 31 Jul 2026 19:55:44 +0200
| Newsgroups | gmane.emacs.bugs |
|---|---|
| Message-ID | <CAN+1HbpvnpP=O7fySemi3pC-zgfv2qFDDbk4xchjy9n4uK-1gQ@mail.gmail.com> |
On Fri, Jul 31, 2026 at 1:51 PM Mark Diekhans <[email protected]> wrote: > > bug report developed with assistance of AI, suggest change tested by a > human being > ## Summary > > `nextstep/templates/Info.plist.in` declares usage-description keys for > *file-access* TCC services > (Desktop, Documents, Downloads, Removable Volumes) and for Apple Events, > but none for the > *class-based* services — Photos, Camera, Microphone, Contacts, Calendars, > Reminders, Location, > Speech Recognition, Bluetooth. > > Any command-line program spawned from a shell hosted inside Emacs (`M-x > shell`, `M-x eshell`, > `vterm`, `ansi-term`, `M-x compile`, org-babel, …) that touches one of > those frameworks is killed > with `SIGABRT` instead of getting the normal system permission dialog — > even when the subprocess's > own bundle correctly declares the usage description. macOS's TCC subsystem > attributes the privacy > check to the *responsible process* up the parent chain, which for anything > launched from an > Emacs-hosted shell is Emacs.app itself. > > This was discovered while running `osxphotos`/PyObjC scripts from a shell > inside Emacs, but it is > not Python-specific: it reproduces with a bundle-less C program that only > touches > `Photos.framework`. > > ## Environment > > - macOS 26.5.2 (build 25F84), Mac16,11 (Apple M4 Pro) > - GNU Emacs 30.2 (build 2, aarch64-apple-darwin25.5.0, NS appkit-2685.60 > Version 26.5.1) > - Installed via MacPorts, port `emacs-app > @30.2_14+nativecomp+rsvg+treesitter` > - Bundle identifier `org.gnu.Emacs`; signature `adhoc`, > `TeamIdentifier=not set` > > ## What Emacs.app declares today > > ``` > $ plutil -p /Applications/MacPorts/Emacs.app/Contents/Info.plist | grep > UsageDescription > "NSAppleEventsUsageDescription" => "Emacs requires permission to > send AppleEvents to other applications." > "NSDesktopFolderUsageDescription" => "Emacs requires permission to > access the Desktop folder." > "NSDocumentsFolderUsageDescription" => "Emacs requires permission to > access the Documents folder." > "NSDownloadsFolderUsageDescription" => "Emacs requires permission to > access the Downloads folder." > "NSRemovableVolumesUsageDescription" => "Emacs requires permission to > access files on Removable Volumes." > ``` > > So the *class* of key is already accepted upstream — the class-based > services are simply absent. > > ## Minimal test case (isolates this from Python entirely) > > `photo_probe.m` — bundle-less, no `Info.plist` of its own, so its own > identity plays no role: > > ```objc > // Build: clang -framework Photos -framework Foundation -o photo_probe > photo_probe.m > #import <Foundation/Foundation.h> > #import <Photos/Photos.h> > > int main(int argc, const char *argv[]) { > @autoreleasepool { > NSLog(@"[photo_probe] pid=%d requesting Photos authorization...", > getpid()); > dispatch_semaphore_t sema = dispatch_semaphore_create(0); > [PHPhotoLibrary > requestAuthorizationForAccessLevel:PHAccessLevelReadWrite > > handler:^(PHAuthorizationStatus status) { > NSLog(@"[photo_probe] authorization status: %ld", > (long)status); > dispatch_semaphore_signal(sema); > }]; > dispatch_semaphore_wait(sema, dispatch_time(DISPATCH_TIME_NOW, 15 > * NSEC_PER_SEC)); > } > return 0; > } > ``` > > ## Steps to reproduce > > 1. `clang -framework Photos -framework Foundation -o photo_probe > photo_probe.m` > 2. From inside Emacs (`M-x shell`, `M-x eshell`, `vterm`, …) run > `./photo_probe`. > 3. From Terminal.app or iTerm2 directly — *not* nested inside Emacs — run > the same `./photo_probe`. > > ## Expected behavior > > In both cases macOS shows the system permission dialog, and the process > prints the resulting > `PHAuthorizationStatus` and exits 0. > > ## Actual behavior > > From a shell inside Emacs the process aborts immediately. Verified process > ancestry > (`bash` → `claude` → `Emacs`) and the resulting crash report: > > ``` > procName => photo_probe > parentProc => bash > responsibleProc => Emacs > coalitionName => org.gnu.Emacs > exception => EXC_CRASH / SIGABRT (shell reports exit 134) > termination => namespace TCC, code 0: > "This app has crashed because it attempted to access privacy-sensitive > data > without a usage description. The app's Info.plist must contain an > NSPhotoLibraryUsageDescription key with a string value explaining to > the > user how the app uses this data." > ``` > > Note `responsibleProc => Emacs`: TCC has attributed the request to > Emacs.app, not to > `photo_probe`, which is why the probe's own (absent) bundle identity is > irrelevant. > > From iTerm2 directly it behaves as expected. > > ## Root cause, and why the Terminal.app comparison is not the relevant one > > It is tempting to say "Terminal.app declares these keys and Emacs should > too", but that is factually > wrong — Terminal.app declares **zero** usage descriptions: > > ``` > $ plutil -p > /System/Applications/Utilities/Terminal.app/Contents/Info.plist | grep -c > UsageDescription > 0 > ``` > > Terminal.app instead carries an Apple-**private** entitlement: > > ``` > $ codesign -d --entitlements - /System/Applications/Utilities/Terminal.app > com.apple.private.tcc.allow-prompting => [kTCCServiceAll] > ``` > > That entitlement is not available to third-party applications, so it is > not an option for Emacs. > > The relevant precedent is a third-party terminal emulator that faced > exactly this problem and solved > it the only way available — by declaring the keys. iTerm2 3.6.8 declares > 14 of them, with wording > that explicitly attributes the request to a child process: > > ``` > $ plutil -p /Applications/iTerm.app/Contents/Info.plist | grep > UsageDescription > "NSAppleEventsUsageDescription" => "An application in iTerm2 > wants to use AppleScript." > "NSBluetoothAlwaysUsageDescription" => "An application in iTerm2 > wants to use Bluetooth." > "NSCalendarsUsageDescription" => "An application in iTerm2 > wants to use Calendar data." > "NSCameraUsageDescription" => "An application in iTerm2 > wants to use the camera." > "NSContactsUsageDescription" => "An application in iTerm2 > wants to use your contacts." > "NSLocalNetworkUsageDescription" => "An application in iTerm2 > wants to access the local network." > "NSMicrophoneUsageDescription" => "An application in iTerm2 > wants to use your microphone." > "NSPhotoLibraryUsageDescription" => "An application in iTerm2 > wants to use the photo library." > "NSRemindersUsageDescription" => "An application in iTerm2 > wants to use your reminders." > ... > ``` > > Emacs is routinely used the same way — as a host for interactive shells, > `M-x compile`, and > org-babel code execution — so it hits the same class of problem, currently > without the mitigation. > > ## Suggested fix > > Add the missing class-based usage-description keys to `nextstep/templates/ > Info.plist.in`, alongside > the file-access keys already there. `NSAppleEventsUsageDescription` and > the `*Folder*` / > `*RemovableVolumes*` keys are already present and must not be duplicated; > on master > `NSSpeechRecognitionUsageDescription` is present too. Minimum useful set > to add: > > - `NSPhotoLibraryUsageDescription`, `NSPhotoLibraryAddUsageDescription` > - `NSCameraUsageDescription` > - `NSMicrophoneUsageDescription` > - `NSContactsUsageDescription` > - `NSCalendarsUsageDescription`, `NSCalendarsFullAccessUsageDescription` > - `NSRemindersUsageDescription`, `NSRemindersFullAccessUsageDescription` > - `NSLocationUsageDescription`, `NSLocationWhenInUseUsageDescription` > - `NSLocalNetworkUsageDescription` > - `NSBluetoothAlwaysUsageDescription` > - `NSSystemAdministrationUsageDescription` > - `NSSpeechRecognitionUsageDescription` — **on the emacs-30 branch only**; > master already has it > > That master already added `NSSpeechRecognitionUsageDescription` to this > same template suggests the > general approach is already considered acceptable upstream; this report > just asks for the rest of the > class-based services to be covered too. > > The `*FullAccess*` variants are the macOS 14+ replacements for the older > Calendars/Reminders keys; > declaring both keeps older systems working. > > Suggested wording, matching the voice already used in the file while > making the child-process case > explicit: > > > Emacs, or a program started from within Emacs, requires permission to > access your photo library. > > Declaring a usage description does **not** grant access — it only allows > macOS to *prompt* instead of > aborting the process. Users who deny the prompt get a normal denial, and > the subprocess sees a > "denied" status rather than `SIGABRT`. > > ## Caveat worth noting > > For an ad-hoc signed Emacs.app (`Signature=adhoc`, as MacPorts produces), > the bundle's cdhash changes > on every rebuild, so TCC grants may not persist across upgrades and the > user may be prompted again. > That is a separate, pre-existing issue; it does not affect this fix, which > only prevents the hard > crash. > > > > > > In GNU Emacs 30.2 (build 2, aarch64-apple-darwin25.5.0, NS > appkit-2685.60 Version 26.5.1 (Build 25F80)) of 2026-06-30 > built on tahoea.local > Windowing system distributor 'Apple', version 10.3.2685 > System Description: macOS 26.5.2 > > Configured using: > 'configure --prefix=/opt/local --disable-silent-rules > --without-dbus --without-gconf --without-libotf > --without-m17n-flt --with-libgmp --with-gnutls --with-xml2 > --with-modules --with-sqlite3 --with-webp > --with-native-compilation=aot --infodir > /opt/local/share/info/emacs --disable-gc-mark-trace --with-ns > --with-lcms2 --without-harfbuzz --without-imagemagick > --without-xaw3d --with-rsvg --with-tree-sitter 'CFLAGS=-pipe > -Os -Dts_language_version=ts_language_abi_version > -Wno-attributes > -isysroot/Library/Developer/CommandLineTools/SDKs/MacOSX26.sdk > -arch arm64' 'CPPFLAGS=-isystem/opt/local/include > -isysroot/Library/Developer/CommandLineTools/SDKs/MacOSX26.sdk' > 'LDFLAGS=-L/opt/local/lib -Wl,-headerpad_max_install_names > -Wl,-no_pie -Wl,-rpath /opt/local/lib/gcc15 -Wl,-rpath > /opt/local/lib > -Wl,-syslibroot,/Library/Developer/CommandLineTools/SDKs/MacOSX26.sdk > -arch arm64'' > > Configured features: > ACL GIF GLIB GMP GNUTLS JPEG LCMS2 LIBXML2 MODULES NATIVE_COMP > NOTIFY KQUEUE NS PDUMPER PNG RSVG SQLITE3 THREADS TIFF > TOOLKIT_SCROLL_BARS TREE_SITTER WEBP XIM ZLIB > > Important settings: > value of $LC_COLLATE: C > value of $LC_CTYPE: en_US.UTF-8 > value of $LC_MESSAGES: en_US.UTF-8 > value of $LC_MONETARY: en_US.UTF-8 > value of $LC_NUMERIC: C > value of $LC_TIME: en_US.UTF-8 > value of $LANG: en_US.UTF-8 > locale-coding-system: utf-8-unix > > Major mode: Ghostel > > Minor modes in effect: > global-git-commit-mode: t > magit-auto-revert-mode: t > server-mode: t > TeX-PDF-mode: t > override-global-mode: t > delete-selection-mode: t > display-time-mode: t > desktop-save-mode: t > cua-mode: t > gcmh-mode: t > url-handler-mode: t > tooltip-mode: t > global-eldoc-mode: t > eldoc-mode: t > show-paren-mode: t > electric-indent-mode: t > mouse-wheel-mode: t > menu-bar-mode: t > file-name-shadow-mode: t > global-font-lock-mode: t > minibuffer-regexp-mode: t > line-number-mode: t > transient-mark-mode: t > auto-composition-mode: t > auto-encryption-mode: t > auto-compression-mode: t > abbrev-mode: t > > Load-path shadows: > /opt/local/share/emacs/site-lisp/site-start hides > /Applications/MacPorts/Emacs.app/Contents/Resources/site-lisp/site-start > /Users/markd/.emacs.d/elpa/transient-20260725.1105/transient hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/transient > /Users/markd/.emacs.d/elpa/org-9.8.8/ob-exp hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-exp > /Users/markd/.emacs.d/elpa/org-9.8.8/ob-emacs-lisp hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-emacs-lisp > /Users/markd/.emacs.d/elpa/org-9.8.8/oc hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/oc > /Users/markd/.emacs.d/elpa/org-9.8.8/ob-css hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-css > /Users/markd/.emacs.d/elpa/org-9.8.8/ob-lob hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-lob > /Users/markd/.emacs.d/elpa/org-9.8.8/ol-irc hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ol-irc > /Users/markd/.emacs.d/elpa/org-9.8.8/ob-forth hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-forth > /Users/markd/.emacs.d/elpa/org-9.8.8/org-macs hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-macs > /Users/markd/.emacs.d/elpa/org-9.8.8/ob hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob > /Users/markd/.emacs.d/elpa/org-9.8.8/org-version hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-version > /Users/markd/.emacs.d/elpa/org-9.8.8/ob-scheme hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-scheme > /Users/markd/.emacs.d/elpa/org-9.8.8/ox hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ox > /Users/markd/.emacs.d/elpa/org-9.8.8/ob-C hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-C > /Users/markd/.emacs.d/elpa/org-9.8.8/org-capture hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-capture > /Users/markd/.emacs.d/elpa/org-9.8.8/ob-ref hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-ref > /Users/markd/.emacs.d/elpa/org-9.8.8/ob-clojure hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-clojure > /Users/markd/.emacs.d/elpa/org-9.8.8/org-mouse hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-mouse > /Users/markd/.emacs.d/elpa/org-9.8.8/org-persist hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-persist > /Users/markd/.emacs.d/elpa/org-9.8.8/org-ctags hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-ctags > /Users/markd/.emacs.d/elpa/org-9.8.8/org-entities hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-entities > /Users/markd/.emacs.d/elpa/org-9.8.8/org-archive hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-archive > /Users/markd/.emacs.d/elpa/org-9.8.8/ob-screen hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-screen > /Users/markd/.emacs.d/elpa/org-9.8.8/ol-bibtex hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ol-bibtex > /Users/markd/.emacs.d/elpa/org-9.8.8/ob-haskell hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-haskell > /Users/markd/.emacs.d/elpa/org-9.8.8/org-loaddefs hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-loaddefs > /Users/markd/.emacs.d/elpa/org-9.8.8/org-table hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-table > /Users/markd/.emacs.d/elpa/org-9.8.8/ol-eww hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ol-eww > /Users/markd/.emacs.d/elpa/org-9.8.8/ol-man hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ol-man > /Users/markd/.emacs.d/elpa/org-9.8.8/ox-org hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ox-org > /Users/markd/.emacs.d/elpa/org-9.8.8/org-num hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-num > /Users/markd/.emacs.d/elpa/org-9.8.8/org-plot hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-plot > /Users/markd/.emacs.d/elpa/org-9.8.8/ol-rmail hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ol-rmail > /Users/markd/.emacs.d/elpa/org-9.8.8/ob-awk hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-awk > /Users/markd/.emacs.d/elpa/org-9.8.8/ob-groovy hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-groovy > /Users/markd/.emacs.d/elpa/org-9.8.8/ob-octave hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-octave > /Users/markd/.emacs.d/elpa/org-9.8.8/org-faces hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-faces > /Users/markd/.emacs.d/elpa/org-9.8.8/oc-biblatex hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/oc-biblatex > /Users/markd/.emacs.d/elpa/org-9.8.8/org-colview hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-colview > /Users/markd/.emacs.d/elpa/org-9.8.8/ob-R hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-R > /Users/markd/.emacs.d/elpa/org-9.8.8/org-refile hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-refile > /Users/markd/.emacs.d/elpa/org-9.8.8/org-timer hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-timer > /Users/markd/.emacs.d/elpa/org-9.8.8/org-mobile hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-mobile > /Users/markd/.emacs.d/elpa/org-9.8.8/ob-fortran hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-fortran > /Users/markd/.emacs.d/elpa/org-9.8.8/ob-shell hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-shell > /Users/markd/.emacs.d/elpa/org-9.8.8/ob-perl hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-perl > /Users/markd/.emacs.d/elpa/org-9.8.8/ob-sqlite hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-sqlite > /Users/markd/.emacs.d/elpa/org-9.8.8/oc-basic hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/oc-basic > /Users/markd/.emacs.d/elpa/org-9.8.8/ob-sed hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-sed > /Users/markd/.emacs.d/elpa/org-9.8.8/org-list hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-list > /Users/markd/.emacs.d/elpa/org-9.8.8/ob-ruby hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-ruby > /Users/markd/.emacs.d/elpa/org-9.8.8/ob-eval hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-eval > /Users/markd/.emacs.d/elpa/org-9.8.8/org-habit hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-habit > /Users/markd/.emacs.d/elpa/org-9.8.8/org-clock hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-clock > /Users/markd/.emacs.d/elpa/org-9.8.8/org-goto hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-goto > /Users/markd/.emacs.d/elpa/org-9.8.8/ox-html hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ox-html > /Users/markd/.emacs.d/elpa/org-9.8.8/org-src hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-src > /Users/markd/.emacs.d/elpa/org-9.8.8/ob-lisp hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-lisp > /Users/markd/.emacs.d/elpa/org-9.8.8/ol-eshell hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ol-eshell > /Users/markd/.emacs.d/elpa/org-9.8.8/ob-ditaa hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-ditaa > /Users/markd/.emacs.d/elpa/org-9.8.8/org-pcomplete hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-pcomplete > /Users/markd/.emacs.d/elpa/org-9.8.8/org-lint hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-lint > /Users/markd/.emacs.d/elpa/org-9.8.8/ox-latex hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ox-latex > /Users/markd/.emacs.d/elpa/org-9.8.8/ob-sass hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-sass > /Users/markd/.emacs.d/elpa/org-9.8.8/ob-tangle hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-tangle > /Users/markd/.emacs.d/elpa/org-9.8.8/ob-calc hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-calc > /Users/markd/.emacs.d/elpa/org-9.8.8/ob-java hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-java > /Users/markd/.emacs.d/elpa/org-9.8.8/ox-icalendar hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ox-icalendar > /Users/markd/.emacs.d/elpa/org-9.8.8/ol-mhe hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ol-mhe > /Users/markd/.emacs.d/elpa/org-9.8.8/org-attach-git hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-attach-git > /Users/markd/.emacs.d/elpa/org-9.8.8/ox-md hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ox-md > /Users/markd/.emacs.d/elpa/org-9.8.8/ox-beamer hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ox-beamer > /Users/markd/.emacs.d/elpa/org-9.8.8/org-element hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-element > /Users/markd/.emacs.d/elpa/org-9.8.8/oc-natbib hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/oc-natbib > /Users/markd/.emacs.d/elpa/org-9.8.8/org-protocol hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-protocol > /Users/markd/.emacs.d/elpa/org-9.8.8/ob-gnuplot hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-gnuplot > /Users/markd/.emacs.d/elpa/org-9.8.8/org-tempo hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-tempo > /Users/markd/.emacs.d/elpa/org-9.8.8/ob-latex hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-latex > /Users/markd/.emacs.d/elpa/org-9.8.8/ol-w3m hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ol-w3m > /Users/markd/.emacs.d/elpa/org-9.8.8/org-id hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-id > /Users/markd/.emacs.d/elpa/org-9.8.8/ox-man hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ox-man > /Users/markd/.emacs.d/elpa/org-9.8.8/ol-doi hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ol-doi > /Users/markd/.emacs.d/elpa/org-9.8.8/org-feed hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-feed > /Users/markd/.emacs.d/elpa/org-9.8.8/org-fold-core hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-fold-core > /Users/markd/.emacs.d/elpa/org-9.8.8/ob-julia hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-julia > /Users/markd/.emacs.d/elpa/org-9.8.8/ob-lua hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-lua > /Users/markd/.emacs.d/elpa/org-9.8.8/ob-table hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-table > /Users/markd/.emacs.d/elpa/org-9.8.8/ob-ocaml hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-ocaml > /Users/markd/.emacs.d/elpa/org-9.8.8/oc-csl hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/oc-csl > /Users/markd/.emacs.d/elpa/org-9.8.8/ol-gnus hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ol-gnus > /Users/markd/.emacs.d/elpa/org-9.8.8/org-indent hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-indent > /Users/markd/.emacs.d/elpa/org-9.8.8/ob-lilypond hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-lilypond > /Users/markd/.emacs.d/elpa/org-9.8.8/ob-matlab hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-matlab > /Users/markd/.emacs.d/elpa/org-9.8.8/org-datetree hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-datetree > /Users/markd/.emacs.d/elpa/org-9.8.8/ol-docview hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ol-docview > /Users/markd/.emacs.d/elpa/org-9.8.8/oc-bibtex hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/oc-bibtex > /Users/markd/.emacs.d/elpa/org-9.8.8/ob-python hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-python > /Users/markd/.emacs.d/elpa/org-9.8.8/ob-makefile hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-makefile > /Users/markd/.emacs.d/elpa/org-9.8.8/org-duration hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-duration > /Users/markd/.emacs.d/elpa/org-9.8.8/org-agenda hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-agenda > /Users/markd/.emacs.d/elpa/org-9.8.8/ob-dot hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-dot > /Users/markd/.emacs.d/elpa/org-9.8.8/ob-js hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-js > /Users/markd/.emacs.d/elpa/org-9.8.8/ox-publish hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ox-publish > /Users/markd/.emacs.d/elpa/org-9.8.8/org-inlinetask hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-inlinetask > /Users/markd/.emacs.d/elpa/org-9.8.8/ob-org hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-org > /Users/markd/.emacs.d/elpa/org-9.8.8/org-keys hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-keys > /Users/markd/.emacs.d/elpa/org-9.8.8/ob-core hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-core > /Users/markd/.emacs.d/elpa/org-9.8.8/org-compat hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-compat > /Users/markd/.emacs.d/elpa/org-9.8.8/ol hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ol > /Users/markd/.emacs.d/elpa/org-9.8.8/ox-odt hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ox-odt > /Users/markd/.emacs.d/elpa/org-9.8.8/ol-info hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ol-info > /Users/markd/.emacs.d/elpa/org-9.8.8/ob-plantuml hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-plantuml > /Users/markd/.emacs.d/elpa/org-9.8.8/ob-eshell hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-eshell > /Users/markd/.emacs.d/elpa/org-9.8.8/ox-ascii hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ox-ascii > /Users/markd/.emacs.d/elpa/org-9.8.8/ox-koma-letter hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ox-koma-letter > /Users/markd/.emacs.d/elpa/org-9.8.8/ob-maxima hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-maxima > /Users/markd/.emacs.d/elpa/org-9.8.8/org hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org > /Users/markd/.emacs.d/elpa/org-9.8.8/ol-bbdb hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ol-bbdb > /Users/markd/.emacs.d/elpa/org-9.8.8/org-macro hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-macro > /Users/markd/.emacs.d/elpa/org-9.8.8/org-fold hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-fold > /Users/markd/.emacs.d/elpa/org-9.8.8/ob-sql hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-sql > /Users/markd/.emacs.d/elpa/org-9.8.8/org-attach hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-attach > /Users/markd/.emacs.d/elpa/org-9.8.8/org-cycle hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-cycle > /Users/markd/.emacs.d/elpa/org-9.8.8/ob-processing hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-processing > /Users/markd/.emacs.d/elpa/org-9.8.8/ox-texinfo hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ox-texinfo > /Users/markd/.emacs.d/elpa/org-9.8.8/org-crypt hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-crypt > /Users/markd/.emacs.d/elpa/org-9.8.8/org-footnote hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-footnote > /Users/markd/.emacs.d/elpa/org-9.8.8/org-element-ast hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-element-ast > /Users/markd/.emacs.d/elpa/org-9.8.8/ob-comint hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-comint > /Users/markd/.emacs.d/elpa/compat-31.0.0.2/compat hides > /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/emacs-lisp/compat > > Features: > (shadow emacsbug markdown-mode vc-hg vc-bzr vc-src vc-sccs > vc-svn vc-cvs vc-rcs log-view bug-reference magit-extras > mailalias utf-7 network-stream nsm qp vm-rfaddons vm-pine > vm-postpone vm-edit bbdb-vm bbdb-mua cl dabbrev vc python > misearch multi-isearch pcmpl-unix magit-bookmark magit-submodule > magit-blame magit-stash magit-reflog magit-bisect magit-push > magit-pull magit-fetch magit-clone magit-remote magit-commit > magit-sequence magit-notes magit-worktree magit-tag magit-merge > magit-branch magit-reset magit-files magit-refs magit-status > magit magit-repos magit-apply magit-wip magit-log magit-diff > which-func git-commit log-edit pcvs-util add-log magit-core > magit-margin magit-transient spinner > claude-code-ide-mcp-http-server web-server > web-server-status-codes cus-edit cus-start ghostel > ghostel-module ghostel-prompt ghostel-module-install > ghostel-links ghostel-line-mode ghostel-kitty ghostel-faces > claude-code-ide claude-code-ide-emacs-tools imenu xref > claude-code-ide-transient claude-code-ide-mcp > claude-code-ide-mcp-server claude-code-ide-mcp-handlers > claude-code-ide-diagnostics ediff ediff-merg ediff-mult > ediff-wind ediff-diff ediff-help ediff-init ediff-util websocket > bindat claude-code-ide-debug consult magit-process with-editor > magit-mode benchmark magit-git magit-base magit-section > cursor-sensor magit-autorevert smerge-mode diff dired-aux > autorevert vc-git diff-mode track-changes vc-dispatcher > org-superstar flyspell ispell org-indent oc-basic ol-eww eww > url-queue mm-url ol-rmail ol-mhe ol-irc ol-info ol-gnus nnselect > gnus-art mm-uu mml2015 mm-view mml-smime gnus-sum shr pixel-fill > kinsoku url-file svg dom gnus-group gnus-undo gnus-start > gnus-dbus dbus xml gnus-cloud nnimap nnmail mail-source nnoo > gnus-spec gnus-int gnus-range message yank-media rfc822 mml > mml-sec mm-decode mm-bodies mm-encode mail-parse rfc2231 > gmm-utils mailheader gnus-win gnus nnheader gnus-util range > wid-edit ol-docview doc-view filenotify image-mode exif > dired-quick-sort transient llama comp comp-cstr cond-let compat > compat-31 savehist ls-lisp dired dired-loaddefs ol-bibtex bibtex > ol-bbdb ol-w3m ol-doi org-link-doi epa-file epa derived epg > rfc6068 epg-config server preview reporter latex latex-flymake > flymake project warnings tex-ispell tex-style tex texmathp > auctex cc-styles cc-align cc-engine cc-vars cc-defs flycheck > org-tempo tempo org-vm org-med org-location-google-maps > org-agenda org-element org-persist org-id avl-tree generator > org-refile google-maps google-maps-static google-maps-geocode > google-maps-base org ob ob-tangle ob-ref ob-lob ob-table ob-exp > org-macro org-src sh-script smie treesit executable ob-comint > org-element-ast inline org-pcomplete org-list org-footnote > org-faces org-entities noutline outline ob-emacs-lisp ob-core > ob-eval org-cycle org-table ol org-fold org-fold-core org-keys > oc org-compat org-loaddefs thingatpt cal-menu calendar > cal-loaddefs org-version org-macs mailrc vm-pcrisis vm-autoload > vm-autoloads vm-imap utf7 vm-virtual vm-page vm-pop vm-crypto > vm-delete vm-sort vm-motion vm-minibuf vm-mouse vm-menu vm-mime > smime gnutls puny dig sendmail rfc2047 rfc2045 ietf-drums > mm-util mail-prsvr mail-utils vm-reply vm-undo vm-summary > vm-summary-faces vm-avirtual bbdb-com crm mailabbrev bbdb > bbdb-site timezone vm-thread vm-folder vm-toolbar vm-window > tapestry vm-misc vm-message vm-vars vm-macro vm > comint-delim-fix.el vterm bookmark pp tramp trampver > tramp-integration files-x tramp-message tramp-compat xdg > parse-time iso8601 format-spec tramp-loaddefs face-remap term > disp-table ehelp find-func vterm-module time-date compile > text-property-search comp-run comp-common rx term/xterm xterm > edmacro kmacro use-package-bind-key bind-key easy-mmode > use-package-ensure exec-path-from-shell ssh medutil > google-translate google-translate-default-ui > google-translate-core-ui facemenu color google-translate-core > google-translate-backend background shell pcomplete comint > ansi-osc ansi-color ring jka-compr modus-operandi-theme > modus-themes delsel xt-mouse time desktop frameset cua-base > cus-load gcmh cl-extra help-mode use-package-core 2bit-autoloads > bbdb-ext-autoloads bbdb-vcard-autoloads buttercup-autoloads > charmap-autoloads claude-code-ide-autoloads consult-autoloads > csv-mode-autoloads dired-quick-sort-autoloads ebib-autoloads > ess-autoloads filladapt-autoloads find-file-in-project-autoloads > flycheck-pycheckers-autoloads flycheck-autoloads flymd-autoloads > gcmh-autoloads ghostel-autoloads google-c-style-autoloads > google-this-autoloads google-translate-autoloads gptel-autoloads > graphviz-dot-mode-autoloads groovy-mode-autoloads > helm-bbdb-autoloads bbdb-autoloads helm-codesearch-autoloads > helm-flyspell-autoloads helm-git-autoloads > helm-git-grep-autoloads helm-google-autoloads > helm-ispell-autoloads helm-make-autoloads helm-org-autoloads > helm-easymenu helm-autoloads helm-core-autoloads > hide-lines-autoloads json-navigator-autoloads > languagetool-autoloads latex-table-wizard-autoloads > auctex-autoloads tex-site list-unicode-display-autoloads > ht-autoloads magit-git-toolbelt-autoloads magit-autoloads pcase > magit-section-autoloads f-autoloads dash-autoloads > async-autoloads markdown-mode-autoloads nose-autoloads > org-modern-autoloads org-superstar-autoloads org-autoloads > org-vcard-autoloads osx-dictionary-autoloads osx-plist-autoloads > package-lint-autoloads paper-theme-autoloads parsebib-autoloads > pcache-autoloads popup-autoloads pyvenv-autoloads s-autoloads > snakemake-mode-autoloads spinner-autoloads > string-inflection-autoloads transient-autoloads > twilight-bright-theme-autoloads finder-inf > unicode-emoticons-autoloads > universal-emotions-emoticons-autoloads vcard-autoloads > vterm-autoloads w3m-autoloads web-server-autoloads > websocket-autoloads wfnames-autoloads with-editor-autoloads > llama-autoloads cond-let-autoloads info compat-autoloads > xkcd-autoloads package browse-url url url-proxy url-privacy > url-expand url-methods url-history url-cookie generate-lisp-file > url-domsuf url-util mailcap url-handlers url-parse auth-source > cl-seq eieio eieio-core cl-macs icons password-cache json subr-x > map byte-opt gv bytecomp byte-compile url-vars cl-loaddefs > cl-lib rmc iso-transl tooltip cconv eldoc paren electric > uniquify ediff-hook vc-hooks lisp-float-type elisp-mode mwheel > term/ns-win ns-win ucs-normalize mule-util term/common-win > tool-bar dnd fontset image regexp-opt fringe tabulated-list > replace newcomment text-mode lisp-mode prog-mode register page > tab-bar menu-bar rfn-eshadow isearch easymenu timer select > scroll-bar mouse jit-lock font-lock syntax font-core > term/tty-colors frame minibuffer nadvice seq simple cl-generic > indonesian philippine cham georgian utf-8-lang misc-lang > vietnamese tibetan thai tai-viet lao korean japanese eucjp-ms > cp51932 hebrew greek romanian slovak czech european ethiopic > indian cyrillic chinese composite emoji-zwj charscript charprop > case-table epa-hook jka-cmpr-hook help abbrev obarray oclosure > cl-preloaded button loaddefs theme-loaddefs faces cus-face > macroexp files window text-properties overlay sha1 md5 base64 > format env code-pages mule custom widget keymap > hashtable-print-readable backquote threads kqueue cocoa ns lcms2 > multi-tty make-network-process native-compile emacs) > > Memory information: > ((conses 16 1515089 264889) (symbols 48 78587 4) (strings 32 458258 8292) > (string-bytes 1 10921407) (vectors 16 215554) (vector-slots 8 3263335 > 142577) > (floats 8 1361 1640) (intervals 56 76497 1952) (buffers 992 71)) > Adding a few others who have macOS interest and expertise to opine.