Skip to content

M3 — Place page

Status: agreed · Last session: 2026-09-28

Sources: requirements.md M3, M9, M2 · decisions.md A10 (place content drafted, then founder-approved; Wikimedia photos with credit), P34 · M1 day plan card · M13 maps card.

Who and the job

  • Traveller: "What is this place, why does it matter, and what should I know before I go?" — the depth behind a stop card.
  • Group leader: reads it to decide whether a stop is worth the time for their group.
  • Editor (P36): checks the story and tip that travellers will read.

Value

A stop card has room for 3 lines. The place page is where NepWalk's culture shows — the story, why it matters, a tip from someone who knows. It is also the start of NepWalk's own place data (M9), which later feeds matching and vendor areas.

Placement — and why

Element Mobile Tablet / web Why
Entry Tap a linked stop's photo or title on the day plan Same Natural "tell me more"
Page Full page, back arrow returns to the same day and card Same, centred reading column (~720 px) Reading, not scanning
Content order Photo (with credit) → name + type + town → typical duration → story → "Why it matters" → tip → location Same Picture first, then what you need to decide, then detail
Location "Open in Google Maps" link now; a small map pin when M13's map component exists Same Maps are built on day 13, after this page

Wireframe

Mobile / web (reading column)
┌──────────────────────────────┐
│ ←  Back to Day 2             │
│ ┌──────────────────────────┐ │
│ │          PHOTO           │ │
│ └──────────────────────────┘ │
│ Photo: Name, Wikimedia CC BY │
│                              │
│ Boudhanath Stupa             │
│ Temple · Kathmandu · ~1.5 h  │
│                              │
│ STORY                        │
│ One of the largest stupas …  │
│                              │
│ 💡 TIP                        │
│ Walk clockwise, like the …   │
│                              │
│ 📍 Open in Google Maps        │
│ (M13: small map pin here)    │
└──────────────────────────────┘

States

  • Place not found / removed: "This place is no longer in the library" + back link.
  • No photo: same placeholder as the stop card, same height.
  • No story or tip yet: the section is left out (never "Lorem" or "coming soon").
  • Loading: grey blocks of the same shape.

Rules and edge cases

  • Content is founder-approved before it shows (A10). Unapproved drafts are not published.
  • Photo credit is always shown when there is a photo (Wikimedia licence).
  • Read-only for everyone; editing place content is an admin task (later).
  • Only library places have a page; custom stops without a place link have none (their card is not tappable).

Decided

  • Entry from a linked stop's photo / title; back returns to the same day.
  • Content order as above; photo credit always shown.
  • Location: Google Maps link now, map pin when M13 lands.
  • Access has three tiers (P37): anyone with the link sees the public page — name, type, photo + credit, one-sentence teaser, and a line "Open NepWalk trip to see the full story" (no story, tip, duration or coordinates); trip insiders see the full page (story, tip, duration, location); system admin sees everything. No public list or search; the public route is rate-limited. (28 Sep)
  • URL: /places/<slug>. Places are independent; trips only use them. The back link comes from ?from=<tripId>/<dayNumber> when opened from a trip. (28 Sep)
  • "Why it matters" stays inside the story for launch; a separate field is backlog. (28 Sep)

TBD

  • None open.

Backlog (after launch)

  • "Trips that visit this place" / "Often combined with".
  • Opening hours, entry fee, dress code (content work per place).
  • Several photos (gallery).
  • "Why it matters" as its own field, with content for ~30 places.

Tasks

Build day 12 (Tue 29 Sep), agreed 28 Sep:

  1. [be] GET /places/:slug — public, rate-limited (e.g. 30 requests / minute per IP): tier by viewer — outsider → publicPlaceView (name, type, photo, credit, teaser); a signed-in viewer who is an insider of any trip that uses the place → full summary (story, tip, duration, coordinates); SystemRole.ADMIN → full. 404 for an unknown slug. e2e tests for all three tiers, the 404 and the rate limit.
  2. [fe] Page /places/[slug]: content order, states (not found, no photo, no story, loading), photo credit, "Open in Google Maps" when coordinates are present; public tier shows the teaser + "Open your NepWalk trip to see the full story"; back link from ?from=.
  3. [fe] Day plan: a linked stop's photo and title open /places/<slug>?from=<tripId>/<dayNumber>; unlinked stops stay plain.