Repository: emacs-apps/chirp.
chirp.el is an Emacs browser for X/Twitter. Read timelines, search
and inspect posts, open threads and profiles, compose, and use XChat
direct messages without leaving Emacs.
Browsing views use dedicated buffers. Chirp sends X web API requests
through Emacs’s url.el. Plz/curl is limited to the public,
credential-free query-ID registry. browser-session is used only
for explicit browser login capture.
Direct-message buffers keep conversation identity in their buffer title rather than repeating it above the messages. Verified sender/content presentation and load/send errors remain unchanged. Encrypted mark-read/mark-unread events currently expose no authoritative account read boundary to the UI, so they do not create an inferred unread divider.
Decoded JSON uses symbol-key alists and list arrays. Normalizers bind
related fields with let-alist; canonical entities and view models remain
keyword plists, read with map-let or pcase map patterns. Optional paths
use map-nested-elt, and alias selection distinguishes absent fields from
present nil values. There is no custom data-access layer.
Appkit structs and shared session entities keep their existing identity and update ownership. Outbound query/form/header alists, dynamic realm-ID maps, and internal card/entity dictionaries retain their string keys.
GNU Emacs 31.1, Appkit 0.3.0, Plz 0.8 with curl, Transient 0.4.3, websocket 1.16, and browser-session 0.1.0 with its helper.
(add-to-list 'load-path "~/chirp/lisp")
(require 'chirp)Run M-x chirp-login, sign in at https://x.com, then
M-x chirp-home.
Keys, compose, media, and notifications are in the user guide. Direct messages need the optional native module; see native module build and security notes.