Originally created by: kristofferR
The Terminal and Slack ports draw messages without bubbles: IRC-style lines with sender and time, or Slack's runs with the sender's picture and name on the first message. Messenger exposes neither per message in a stable way.
Marks on each message row under [data-scope="messages_table"], only while a hooked theme is on (#424 gate):
data-chatpane-sender="me|them", data-chatpane-sender-name="…" (for attr()), data-chatpane-sender-repeat (same sender as the previous message), data-chatpane-time="14:32" (local 24-hour), data-chatpane-date (a date-break row; it ends a run), data-chatpane-reactions (row has reaction pills).data-chatpane-run-start, with --chatpane-sender-picture (url(…)) and --chatpane-sender-name (CSS string).--chatpane-me-name, --chatpane-me-picture, --chatpane-me-handle and --chatpane-me-handle-length (Facebook username, else the name lower-cased without accents or spaces, at most 24 characters).Language-independent: "me" comes from structure (your rows' read-receipt column), names from the sender picture's alt text and Messenger's contact entries, never from English or Vietnamese heading text (the source ports parsed "You sent" / "replied to"; don't).
Times come from Messenger's database (messages.timestampMs by message id, the thread's newest 1000, read through lib/messenger-db.ts), re-read when unknown ids appear, at most every 3 s.
Cost: one MutationObserver on the open chat's log, batched per animation frame; nothing while the gate is off. Respect Hide Names / Hide Avatars (data-chatpane-hide-names): themes must not reveal what those blur.
Prior art: darkpiv's fork (https://github.com/darkpiv/fmess) and lyng148's Slack PR (https://github.com/lyng148/fmess/pull/1), both MIT.
Part of [#434].