← All documentation

Daily reports

Daily report — day notes, timeline, and the public hub

Read, write and publish the daily report — the rolling narrative of what's happening across your trails and lifts. Covers day-note posts, the auto-generated event timeline, and how the public /hub/{slug} page pulls from the same data behind the visibility switches.

The Daily report is one page per organization per day. It's part activity feed, part crew log — a rolling read on what's actually happening across your trails and lifts, plus a place for the team to file free-form notes as the day unfolds. Managers work from it during the day; the public sees a filtered version of the same data on your /hub/{slug} page.

What the daily report is

Every org gets one report per day, keyed to the org's timezone (see below). The page has two content streams sitting side by side:

  • Day notes — crew-authored short posts. Think "trail crew just cleared the south switchbacks", "kiosk needs new paper", "bear sighting on Blueberry". Any active member can post; publishing a note publicly is gated by a permission (see Making updates public).
  • Timeline — auto-generated rows built from upstream events: trail condition flips, grooming updates, lift status changes, network / area status flips, new maintenance issues (and resolutions), new infrastructure, and weather. Nothing to file — these appear as they happen.

The two streams are interleaved chronologically. The result is one scrollable narrative of the day that doesn't need anyone to type it up.

There's no "publish daily report" button. The report exists the moment the day starts; each event and each post lands as it happens. What you're publishing is individual day notes (and letting the auto-generated timeline through your public switches).

Opening today's report

Open Daily report from the sidebar to see today. A calendar picker at the top of the page lets you jump to any historical day. Prev / Next chevrons step by one day at a time. The picker is capped at today — no navigating into an empty future.

The page loads instantly and never pre-renders — every open is a fresh query of that day's events. Which means as the day unfolds you can leave the page open and reload to see the latest crew posts, lift flips, and weather rows.

Historical days work the same way. Scroll back a week to check what the crew filed for last Friday, or link to a specific date from a stakeholder email — the URL is /daily-report?date=YYYY-MM-DD.

Day notes — posting an update

Under the Day notes header at the top of the page sits the composer. The helper text reads "Append-only timeline of crew updates. Mark a post Public to show it on the public daily report; Private updates only show here for logged-in crew and managers."

The composer is one big textarea with the placeholder "What's happening on the trail right now?" — write whatever fits. Up to 5000 characters. Below it: an image picker (up to 6 photos, max 5 MB each), an optional network and trail selector, and a Share publicly checkbox.

Hit Post update (or "Posting…" / "Posting… 63%" while photos upload) and the post lands at the top of the timeline immediately. Any active org member can post — no manager role required.

Newest-first ordering. Posts are append-only in spirit — you can edit or delete your own posts, but there's no "reply" or threading model. Multiple posts through the day is the pattern.

Attaching photos, network, or trail

Photos. Tap the photo picker, pick up to 6 images. Each has to be ≤ 5 MB. They upload as you click Post — progress shows on the button label. Photos live under daily-report-posts/{post_id}; deleting the post removes them. Photos aren't editable through a PATCH — to swap photos on a post, delete it and re-post.

Network / Trail. Two chained dropdowns above the composer: Network (optional) and Trail (optional). Pick a network first and the trail dropdown filters to that network's trails; pick a trail directly and the network auto-fills if only one matches. Both are optional — "no specific network / no specific trail" is fine when the post is org-wide (weather, admin note, kiosk update).

When a post is pinned to a trail, it shows the trail name inline on the timeline row and links to that trail's page. Pinning to a network but not a trail is useful for network-level events ("groomed Zone C this morning").

Photo storage limits. If your organization's plan storage is full, the upload returns a plan-limit error and no post is written. Upgrade the plan or free space and try again.

Editing and deleting your posts

Your own posts show Edit and Delete links. Managers and owners also see them on every post (any active manager can moderate a crew post — useful if a volunteer accidentally files something sensitive).

Edit — inline textarea appears in place of the post body. Change the wording and the "Share publicly" checkbox in one save. Save commits, Cancel reverts. Photos aren't editable here — delete + re-post to swap them.

Delete — browser confirm: "Delete this update? Photos attached will also be removed." Failure shows "Could not delete the update." Deleting is hard-delete: the row and its photos are gone. Any push notification that already went out to phones can't be recalled, of course — just re-post if the wording matters.

Post visibility toggle. Managers can flip an existing post's public/private state via the Public / Private pill next to the post. Tooltip when public: "Showing on the public hub — click to hide". Tooltip when private: "Hidden from the public hub — click to show". Volunteers see the pill as a badge (read-only) so they know what the manager decided.

What lands on the timeline automatically

Nine event streams flow into the timeline. Each one is one-way — the daily report reads them, it doesn't create them.

  • Trail condition changes — every time an operator flips a trail between Open / Caution / Closed / Maintenance. A comment-only edit (state unchanged, note added) shows with a "Comment" chip.
  • Trail grooming updates — reads "{trail} → Groomed" on a state flip, or "{trail} · Groomed again" when a fresh groom didn't change the state.
  • Lift status events — every operational-state flip from the lift's detail panel or the field-app quick-update sheet. Wait minutes and the operator's note come through.
  • Network condition flips — reads "Network {name} → {state} · {n} trails affected".
  • Area condition flips — same shape, deep-links to the trail-conditions page (no per-area detail page exists yet).
  • Maintenance issues — reads "New issue: {title}" on creation and "{title} → Resolved" on close. Pending-review public reports show with an amber "Pending review" pill; brand-new issues show with a green "New" pill. Photos-added-only edits are hidden from the daily-report timeline (still visible on the trail's history).
  • New infrastructure — reads "New infrastructure: {name} ({type}) · {trail}" when a Structure is created. Structure edits are deliberately not surfaced to keep the timeline focused on what's newly present.
  • Weather — hourly observations, run-length-grouped into "spells" per network. Benign regimes (clear, mostly clear, partly cloudy, overcast) are filtered out so a fair-weather day doesn't drown the timeline. A "Today's forecast" preview always emits at 5 AM org-local so even a sunny day has a weather row. Provider labels ("NWS", "Open-Meteo", "NOAA GFS") credit the source.

Nothing else surfaces automatically — waypoints (POIs), photos posted outside a day-note, and structure edits deliberately don't show up. If those matter for a specific day, file a day note about them.

Making updates public (or keeping them crew-only)

Public visibility is a stack of switches. They compose top-down: each layer can only reduce, never increase, what's visible.

  1. Master org switch — Exclude from public report app. Under Settings → Public visibility, on its own so it stays reachable for a workspace that has no daily report. Copy: "Hides this organization from public hikers — they won't see it in the report wizard, won't find it via 'near me' discovery, can't save it as a favorite, and the /hub/<slug> page returns 404. Your crew + the field app keep working normally." Flip it on for internal-only orgs; the public daily report simply won't exist.
  2. Per-family family toggles. Also in Settings, under Public report:
    • Show weather block — hides all weather rows and the weather header.
    • Show trail status publicly — hides per-trail condition badges + all trail / network / area status events on the public hub AND the report app.
    • Show trail status in the report app — narrower opt-out that only affects the report app. Trails still list in the report-app organization view so a visitor can pick one to file an issue against, but condition + grooming pills disappear and the "Conditions" rollup collapses to "Trail conditions not published". Independent of the master switch above; useful when you want to keep status on your public hub but hide it inside the report-app flow. The toggle greys out (and its behavior is a no-op) when the master switch is off — the report app hides both trails and status in that case.
  3. Timeline kind allow-list. Public timeline kinds in Settings — a checkbox list of which event families to expose. Defaults to weather and day_note (conservative). The full set: Weather summary + spells, Crew updates, Trail status flips, Trail grooming updates, Network status flips, Area status flips, Lift status changes, Maintenance issues (new + resolved), New infrastructure.
  4. Per-post Share publicly. Even with day_note in the allow-list, a post has to be individually flagged public. The default matches what you last chose in the composer.
  5. Per-event override. Managers can flip any individual auto-generated row's public/private state with an inline toggle. Overrides beat the kind allow-list. When a master switch hard-hides a family, the per-row toggle locks with the tooltip "Hidden from the public hub by a sharing switch in Settings".

Who can publish a post publicly. The publish_day_notes permission — on by default for owners, managers, and field workers; off for volunteers. When off, the composer hides the Share publicly checkbox and shows a "Crew only" pill on the post. Even a hand-rolled API request from a volunteer with is_public=true is silently coerced to false server-side.

The public daily report page

Your public report lives at /hub/{your-org-slug}. It's a completely separate URL from /daily-report — no login required, no dashboard chrome, mobile-first layout, sky-tinted weather block, safe-area padding for iOS notches. The header is painted with your Primary color from Settings; the logo and org name sit on top.

Sections in render order:

  • Date heading"Friday, May 15, 2026" on wide screens, "Fri, May 15" on mobile.
  • Activity today — merged chronological feed of public day-notes, weather rows, and auto-events (all subject to the visibility stack). Each row is a rounded white card with a kind badge ("Update", "Weather", "Trail", "Grooming", "Lift", "Maintenance", "Network", "Area", "Infrastructure"). Photos open a full-screen lightbox. Public posts show the author's name (or "TrailsIQ crew" if they've chosen to be anonymous in profile settings).
  • Weather today — for single-network orgs, a 3-up stat strip ("Snowfall today" / "Rainfall today", "Temperature", "Peak gust") plus a "Now" summary card. Multi-network orgs skip the strip and get a "By network" per-network breakdown instead. Units auto-localise (imperial for US / LR / MM, else metric).
  • Trails — searchable trail list (placeholder "Search trails or networks…") grouped by network, with difficulty icons, condition badges, and grooming freshness pills. Trails with no network land in "Other trails".
  • Embed widget — a button "Embed this trail status on your website" generates an <iframe> snippet with per-network checkboxes and a height picker, so a partner ski school or bike shop can embed live trail status.
  • Lifts — one row per lift with its state badge and wait pill (state and wait pulled from the latest lift-status event).
  • Footer"Powered by TrailsIQ".

No historical navigation on the public page. Public visitors only ever see today. The dashboard /daily-report is the surface for looking backwards.

Push notifications to hikers. When you flip a post public and the master org switch is off, the platform pushes a "Daily report" notification to every hiker who has favorited your org and enabled "Notify me on daily reports" in their TrailsIQ hiker app. The push body is the first 120 characters of the post.

Timezones and "today"

The report is anchored in your organization's timezone — the one you set on the Setup guide (or Settings). "Today" starts at midnight in your local time, not UTC.

Why it matters: an org on Eastern time (UTC-4 in summer) would otherwise see yesterday's 8 PM lift flips bleed into today's timeline (because 8 PM Eastern = 00:00 UTC the following day). The platform converts your local day boundary to UTC before querying, so what shows up on the report matches what happened on the mountain that calendar day.

If your org's timezone isn't set, the platform falls back to UTC. Which is almost never what you want. Set it on the Setup guide or on Settings → Organization details — pick the timezone the resort actually operates in.

The public daily report follows the same rule — a hiker opening /hub/{slug} at 11 PM local sees your report for today (in your org timezone), regardless of what time it is on their side of the world.

Common gotchas

  • The report isn't published — posts are. There's no "Save & publish" button for the whole page. Every post you file (and every automatic event that passes the visibility stack) shows up on the public hub as it happens.
  • Nothing is auto-derived from waypoints or standalone photos. POIs (waypoints) and photos posted outside a day-note don't appear on the timeline. If something the crew did with the field-app matters for the day, file a day note about it.
  • Master switches beat per-event overrides. If Show trail status publicly is off, no per-row toggle will get a trail flip onto the public hub. The row's public toggle locks with the tooltip "Hidden from the public hub by a sharing switch in Settings".
  • Report-app-only opt-out keeps trails visible, only strips status. With Show trail status in the report app off (but the master switch still on), a hiker who opens your org in the report app sees the trail list intact and can pick any trail to file an issue against — condition + grooming just don't render, and the Conditions rollup switches to a neutral "Trail conditions not published" label. Handy when you use the report app for issue intake but manage trail conditions on a different channel.
  • Volunteers can post, but can't publish. They see the composer, but the Share publicly checkbox is hidden and every post carries a "Crew only" pill. Upgrade the volunteer to a field worker (or grant publish_day_notes per-user) if you want them publishing directly.
  • Photos aren't editable after posting. To swap photos on a post, delete it and re-post. Wording, network, trail, and visibility can be edited freely.
  • Post cap: 6 photos, 5 MB each. Pick more than that, or a photo over the size limit, and the composer says which ones it did not add and why. The rest of the post is unaffected.
  • Post window: 7 days back, 2 hours forward. Only matters for the field app's offline queue — a post older than 7 days that comes online refuses to sync. Fresh posts always work.
  • Timezone is org-wide, not per-user. If your operation genuinely spans two timezones, pick the one the daily-report data best represents (usually where the crew starts their day).

What's next

  • Post your first day note today — even "Trails opened normal, no incidents" is enough to prove the loop works end-to-end.
  • Walk through Settings → Public report with a stakeholder open on the public hub in an incognito tab so you both see exactly what a hiker sees.
  • Read the Public reports setup article for the master-switch details, and the Lifts article to see how every lift-status flip your crew makes ends up on this page.