Repository navigation
fix(dashboard): Show author photos and names on transcript messages - #2557
Merged
Merged
Conversation
The conversation list showed participant photos, but transcript messages still drew initials. Message actor identities came from the saved message author and had no photo, and the message avatar drew only initials. Resolve each user Message author Identity when reading an event page and add its photo path. Draw the photo in the message avatar and the speaker card, with initials as the fallback. Co-Authored-By: BYK <[email protected]>
A web send labeled its message with the author email until history arrived, then switched to the name. The transcript label preferred email, and only the durable Message had no email. Label user messages with the name first. Pending rows also had no photo. Add the viewer photo to the local outbox row, and resolve the author photo for pending mailbox rows from their author Identity. Co-Authored-By: BYK <[email protected]>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
The photo path did not change when the photo changed, so the one-day browser cache could show an old photo, and every day the browser fetched the photo again in full. Add the version of the provider URL to each photo path. A request with the current version is immutable. Other requests use no-cache with an ETag, and a matching If-None-Match returns 304. Co-Authored-By: BYK <[email protected]>
Contributor
|
20 screenshot changes — 20 changed · 0 added · 0 removed Review screenshots in Frameshift Show 12 more changed screenshots2 more changed screenshots in Frameshift. |
BYK
requested changes
Nov 2, 2026
Messages and queued rows name their author with authorIdentityId. The Conversation participants already carry each person's name and photo, and now list the Identity ids of that person. The client reads the author from there, so the API sends each person once and the event page does no extra author lookup.
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 1 potential issue.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit 95b7a0c. Configure here.
BYK
requested changes
Nov 2, 2026
Event pages read the author Identity id from the event row and send it as actorIdentityId on each user Message. Pending messages do the same. The detail sends authors once, keyed by every Identity id of each person, so the client looks an author up by key. A person who sends from another provider than the one in history still resolves. Move outboxActorIdentity to the outbox module to keep queries.ts under the file length limit.
…-avatars # Conflicts: # packages/junior-dashboard/src/client/conversations/queries.ts
The queue no longer copies each author photo into every mailbox row. The reply footer passes the Conversation authors to the queue, and each row reads its author by actorIdentityId when it draws the avatar. Live polls keep the authors reference while it does not change, so memoized views do not render again. Co-Authored-By: BYK <[email protected]>
BYK
approved these changes
Nov 2, 2026
This branch was successfully deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.

After #2535, the conversation list shows profile photos, but the conversation view still shows initials for user messages. A new web send also shows the author email until history arrives, and then the name replaces it. Also, browsers could keep an old photo for a day after it changed.
Photos
Messages refer to their author by Identity id. The detail sends each author once.
actorIdentityId, from theactor_identity_idcolumn of its event row. The page does no extra query. The system Identity is skipped, so event Messages do not change.actorIdentityIdfrominput.authorIdentityId.authors: each participant, keyed by every Identity id of their user. A web send from a person whose history is in Slack resolves before history has it. The photo uses the same rules as participants: the Slack photo, then the Google photo.authors[actorIdentityId]where it draws the author: transcript messages, the speaker card, and queued rows. An author who is not inauthorskeeps the savedactorIdentity. The local outbox row uses the viewer photo from/api/me.authorsreference while it does not change, so memoized views do not render again.actorIdentityIdandauthorsare sent only to viewers who can see private content, the same as participants.TranscriptMessageShelland the speaker card draw the photo, with initials as the fallback. The fallback looks the same as before.Name
actorLabeluses the email first. A web send carries both an email and a name, but its durable Message carries only the name, so the label changed after the refresh.transcriptMessageActorLabelnow uses the name first.actorLabelitself does not change, so conversation owner labels stay the same.Browser caching
Before this change, the photo path stayed the same when the photo changed, and it used
private, max-age=86400. So a browser could show an old photo for a day, and it fetched each photo again in full every day.?v=with a hash of the provider URL. A new photo has a new provider URL, so it gets a new path.private, max-age=31536000, immutable.private, no-cacheand anETag. A matchingIf-None-Matchreturns304.no-store. The server already caches a failed fetch for 5 minutes.Tests
actorIdentityIdon a user message, the author photo inauthors, and that another Identity of the same user maps to the same author.actorIdentityIdon a web mailbox row.authors, with the saved author as the fallback. It also checks that the label is the name when the author has an email and a name.authors.authorsreference when it does not change.no-cacheresponse without a version, and a304on a matching ETag.I did not take screenshots of the UI change.
via @BYK.
--
View Session in Sentry