Reviews are text + rating only. A photo (courtroom signage, public docket board, building exterior) anchors credibility and gives the content a richer feed shape — Yelp without photos would feel half-finished.
Scope
- Storage: local filesystem for MVP (
storage/uploads/review-photos/<review-uuid>/<photo-uuid>.jpg), S3-compatible adapter for prod. Stacks's storage package already supports both. - Upload UI: drop zone in the review composer (
/review/{judgeId}), max 4 photos per review, max 5MB each, JPEG/PNG/WebP only. - Server: image processing pipeline — strip EXIF, generate 3 sizes (thumb 200w, card 800w, full 1600w), persist all three.
- New
review_photostable:id, judge_review_id, original_filename, mime, sizes (JSON), order, created_at. - API:
POST /api/reviews/{id}/photos(auth-gated, author-only),DELETE /api/me/reviews/{id}/photos/{photoId}. - Render: photo gallery in
ArticleView.stx; lightbox on click; card-size thumbs in feed lists.
Acceptance
- Author can attach up to 4 photos at review submission time, see thumbs render in the published article, delete from their own.
- Photos drop into the moderation queue alongside the review text (one approve/reject covers both).
- EXIF (especially GPS) stripped from every saved variant — privacy table-stakes.
- Page weight stays sane: feed thumbnails load 800w, article body loads up to 1600w on click.