diff --git a/src/app/components/read-receipt-avatars/ReadReceiptAvatars.tsx b/src/app/components/read-receipt-avatars/ReadReceiptAvatars.tsx
new file mode 100644
index 000000000..03bea0d70
--- /dev/null
+++ b/src/app/components/read-receipt-avatars/ReadReceiptAvatars.tsx
@@ -0,0 +1,114 @@
+import React, { useState } from 'react';
+import { Room } from 'matrix-js-sdk';
+import { Avatar, Icon, Icons, Modal, Overlay, OverlayBackdrop, OverlayCenter, Text } from 'folds';
+import FocusTrap from 'focus-trap-react';
+import { useMatrixClient } from '../../hooks/useMatrixClient';
+import { useMediaAuthentication } from '../../hooks/useMediaAuthentication';
+import { getMemberDisplayName } from '../../utils/room';
+import { getMxIdLocalPart } from '../../utils/matrix';
+import { UserAvatar } from '../user-avatar';
+import { EventReaders } from '../event-readers';
+import { stopPropagation } from '../../utils/keyboard';
+
+const MAX_DISPLAY = 5;
+
+export function ReadReceiptAvatars({
+ room,
+ eventId,
+ userIds,
+}: {
+ room: Room;
+ eventId: string;
+ userIds: string[];
+}) {
+ const mx = useMatrixClient();
+ const useAuthentication = useMediaAuthentication();
+ const [open, setOpen] = useState(false);
+
+ if (userIds.length === 0) return null;
+
+ const displayed = userIds.slice(0, MAX_DISPLAY);
+ const extra = userIds.length - MAX_DISPLAY;
+ const tooltipNames = userIds
+ .slice(0, 5)
+ .map((id) => getMemberDisplayName(room, id) ?? getMxIdLocalPart(id) ?? id)
+ .join(', ') + (extra > 0 ? ` +${extra} more` : '');
+
+ return (
+ <>
+ }>
+
+ setOpen(false),
+ clickOutsideDeactivates: true,
+ escapeDeactivates: stopPropagation,
+ }}
+ >
+
+ setOpen(false)} />
+
+
+
+
+
+ >
+ );
+}
diff --git a/src/app/components/read-receipt-avatars/index.ts b/src/app/components/read-receipt-avatars/index.ts
new file mode 100644
index 000000000..5fedc3f27
--- /dev/null
+++ b/src/app/components/read-receipt-avatars/index.ts
@@ -0,0 +1 @@
+export { ReadReceiptAvatars } from './ReadReceiptAvatars';
diff --git a/src/app/features/room/ReadPositionsContext.ts b/src/app/features/room/ReadPositionsContext.ts
new file mode 100644
index 000000000..b90eed7b9
--- /dev/null
+++ b/src/app/features/room/ReadPositionsContext.ts
@@ -0,0 +1,4 @@
+import { createContext, useContext } from 'react';
+
+export const ReadPositionsContext = createContext