diff --git a/src/apps/opportunities/src/components/ChallengeForum.spec.tsx b/src/apps/opportunities/src/components/ChallengeForum.spec.tsx
index d371310ea..4bd6d986d 100644
--- a/src/apps/opportunities/src/components/ChallengeForum.spec.tsx
+++ b/src/apps/opportunities/src/components/ChallengeForum.spec.tsx
@@ -581,6 +581,40 @@ describe('ChallengeForum', () => {
.toBeUndefined()
})
+ it('shows an edit timestamp for changed starter posts and replies only', async () => {
+ const editedAt = '2026-06-08T12:30:00.000Z'
+ topicDetail = {
+ posts: [{
+ ...starterPost,
+ replies: [{ ...starterPost.replies[0], updatedAt: editedAt }],
+ updatedAt: editedAt,
+ }],
+ topic: announcement,
+ }
+ const { container }: RenderResult = render(
+ ,
+ )
+ await act(async () => fireEvent.click(container.querySelector('.topicOverlay') as HTMLButtonElement))
+ expect(screen.getAllByText(/^Edited:/))
+ .toHaveLength(2)
+ screen.getAllByText(/^Edited:/)
+ .forEach(timestamp => {
+ expect(timestamp)
+ .toHaveAttribute('datetime', editedAt)
+ expect(timestamp)
+ .toHaveTextContent(formatForumDate(editedAt))
+ })
+ })
+
+ it('does not mark unchanged posts as edited', async () => {
+ const { container }: RenderResult = render(
+ ,
+ )
+ await act(async () => fireEvent.click(container.querySelector('.topicOverlay') as HTMLButtonElement))
+ expect(screen.queryByText(/^Edited:/))
+ .not.toBeInTheDocument()
+ })
+
it('opens the topic when the upper card is clicked, keeping the footer for actions', async () => {
const { container }: RenderResult = render(
,
diff --git a/src/apps/opportunities/src/components/ChallengeForum.tsx b/src/apps/opportunities/src/components/ChallengeForum.tsx
index 4af910bdb..9cd86e012 100644
--- a/src/apps/opportunities/src/components/ChallengeForum.tsx
+++ b/src/apps/opportunities/src/components/ChallengeForum.tsx
@@ -1197,6 +1197,13 @@ const ForumPostCard: FC<{
{' '}
{formatForumDate(post.createdAt)}
+ {!post.deleted && Date.parse(post.updatedAt) > Date.parse(post.createdAt) && (
+
+ )}
{props.parent && (
Replying to