Skip to content

Moments

Moments are short-lived (or journaled) photo drops pinned to a place. The UX covers the capture-then-publish flow, visibility, retention choice, and how moments surface elsewhere in the app.

Entry points

From Action
Nav dock The camera icon (where present) opens the capture flow.
Floating action on the discover map "Drop a moment" opens the camera.
Location detail sheet "Add a moment here" deep-links to capture with the place prefilled.
Profile (own) "Diary" surface lets the user open journaled moments and re-share.
Deep link tomoda://capture and tomoda://publish?... for resume flows.

Primary flow — capture and publish

  1. Open the camera. The app requests camera permission on first use. The viewfinder fills the screen with a capture button at the bottom and a flip-camera affordance at the top-right.
  2. Tap to capture. The shutter takes a photo at the device's default resolution. Simultaneously, the app silently requests foreground location and reads the user's current coordinates (best-effort — capture does not fail if location is denied).
  3. Land on publish. The captured image fills the top of the screen. Below it: a caption input, a nearby-places picker, a rating (when a place is selected), a visibility picker, and a retention picker.
  4. Pick a place. The app fetches nearby places from the user's GPS reading. Tapping one binds the moment to that place. The user can also leave it standalone — the moment then pins to the raw coordinates.
  5. Set visibility. Three options: public (anyone), friends (accepted friends only), private (only the user — appears only in their own diary).
  6. Set retention. A 1–5 selector for hours-to-live, or 0 for "Journal" (no expiry). The default is 24 hours.
  7. Publish. The image uploads. On success, the user lands back on the discover map; the new moment is already pinned. A toast confirms.

Sub-flows

Sub-flow Behavior
Standalone moment No location_id selected — the moment pins to raw coordinates and appears as its own marker on the map.
Place-attached moment A location_id is set. The moment does not appear as its own marker; it increments the count badge on the location's marker. Tapping the location surfaces it in the highlights strip.
Journaled moment duration = 0. No expires_at is stamped. The moment lives in the user's diary forever and ignores cleanup workers.
Friends-only diary entry Journal + friends visibility — common pattern for personal log entries.
Like a moment From the detail sheet, tap the heart. The heart fills locally and the count increments immediately; the server-side toggle reconciles within ~1s. Tapping again removes the like.
Open a moment from a friend marker The friend's marker tap → profile-mini → "Recent moments" strip → tap.
Share a moment outward The detail sheet's overflow → "Share" opens the OS share sheet with a deep link. Sharing a friends_only moment still produces a link, but recipients who aren't friends see "Not available."

States

State What the user sees
Camera permission not granted A full-screen prompt with explanation copy and a "Grant permission" button that opens the system permission dialog.
Location permission denied Capture still works. The publish screen shows "Drop near where you are" but no nearby-places list — only standalone publish is available.
Loading nearby places A horizontal skeleton row of pill placeholders under the caption input.
Uploading The publish button is replaced by a progress indicator. The screen does not block — the user can hit back if needed, and the upload aborts.
Upload failed A toast with the error. The publish screen restores; the user can retry.
Like syncing The heart fills instantly; if the server rejects, it un-fills and a toast appears.
Expired moment opened from a stale link A muted full-screen card: "This moment has ended." A "Back" affordance returns to the previous screen.

Edge cases & gotchas

  • Two-phase deletion is invisible to the user. A timed moment "ends" at its expiry — it disappears from feeds and the map. The underlying data is soft-deleted for seven more days, then hard-deleted. Likes on a recently-expired moment remain valid in that window; a user who refreshes the URL still sees "ended", not "not found".
  • Journaled moments still respect visibility. Setting visibility to friends on a journaled moment is the common case for diary content. Public journaled moments are valid but rare and effectively a portfolio entry.
  • Standalone vs attached is a visibility-on-the-map decision, not a privacy one. Attached moments roll into the location's count badge; standalone moments appear as their own pin. Both honor the same visibility rules.
  • Likes survive author deletion. When a user is hard-deleted, their own moments' media is purged from storage; likes they left on other moments stay (their user_id is anonymized).
  • Backgrounding during upload. If the app is backgrounded mid-upload on mobile, the system may suspend the request. The next foreground retry re-issues the request; the user is shown an inline retry affordance, not an opaque failure.
  • Heic / large files. Allowed up to 15 MB across jpeg, png, gif, webp, heic, heif. Larger files fail upload with a toast — the publish screen restores intact.
  • Friend-only moments on a public profile. Visitors who aren't friends do not see those moments at all on the profile; they're simply omitted, not redacted.
  • Drop somewhere you've never been. The app does not geofence the camera — the user can capture in one place and publish later from anywhere. The location is whatever the publish screen has selected, not where the photo was taken. (Product rule for geofencing TBD; see product/domains/.)
  • Public share link of an expired moment. The shared link resolves to "This moment has ended" rather than 404.

See also