The journey map joins every located entry with a faint dashed line in the order of its pins. It drew that line through everything, also across days whose real route is on the map as a kept recording or the live Dawarich trail, so straight guesses fanned out over the recorded track. The phone has no layer switches, so the line could not even be hidden there. A recorded track now carries the day it belongs to (an optional `date` on the track contract, set by every builder of recorded lines: kept days, the shared page's recordings, the live Dawarich trail and the day import preview). A pure model splits the connection into the stretches still open and those whose days were all recorded, the night between two recorded days included. Both renderers draw only the open stretches with the entries; the covered ones sit on a layer of their own that shows while the reader hides what was recorded, so the guess comes back exactly where nothing else explains the way. The live trail is now matched to a kept day by that date instead of reading the track name as one. Closes #2888
@trek/shared
Single source of truth for TREK's API contracts, expressed as Zod schemas and consumed by both the server (request validation + inferred DTO types) and the client (typed requests/responses).
This package is part of the incremental NestJS + React 19 migration (see the "Brownfield Rewrite" board). It is intentionally dormant until modules start importing it — adding it changes nothing for users.
Rules
- One folder per domain:
src/<domain>/<domain>.schema.ts(+.spec.ts). - Domain-agnostic building blocks live in
src/common/. - A route is only considered migrated once its contract lives here.
- Schemas are the source of truth; server DTOs and client types are inferred from them
(
z.infer<typeof schema>), never hand-duplicated.
Consumption (dev)
Both apps resolve @trek/shared to this package's TypeScript source:
- Server (
tsx): viapathsinserver/tsconfig.json. - Client (
vite): viaresolve.aliasinclient/vite.config.ts(+pathsfor the type-checker).
Production packaging (Docker / workspace wiring) is introduced in card F2, when the server first depends on this package at runtime. Until then prod builds are untouched.
Not yet here
The canonical error envelope is finalised in card F5 (it must match TREK's current Express error responses byte-for-byte), so it is deliberately not invented in F1.