/profile is the signed-in user's own dashboard. resources/views/user/[id].stx exists as a bare shell. A reader looking at a review can't click through to see who wrote it, what else they've reviewed, or whether they're a credible voice.
For a Yelp-style trust model, reviewer-history is core — "this reviewer has 14 published reviews and an Elite badge" is what makes a single review interpretable.
Scope
/user/{id}— public profile view:- avatar, display name, member-since date, optional bio
- badges: verified-credentials (see sibling issue), review-count milestone (10/50/100 published reviews)
- list of published reviews authored by this user, paginated
- if logged-in viewer is not this user: "Follow" button (future — start with read-only)
- API:
GET /api/users/{id}— public-safe user payload (no email, no internal IDs from other tables). - API:
GET /api/users/{id}/reviews— paginated list of the user's published reviews (status=published only; pending/rejected stay private). - Cross-link: clicking the reviewer name on any
/article/{id}page navigates to/user/{reviewer.id}.
Acceptance
- A logged-out visitor can view a reviewer's public profile and their published reviews.
- Email and other PII are never exposed via the public endpoint.
- Reviewer names on articles are clickable.