Build Log
Hearth: Copied Item Polish
June 22, 2026
Tighter dedup, honest time display, source labels, and remove — the loop is coherent. Ready for Courtney.
Timeline
What shipped
addToTodayRoute: OR duplicate check — sourceRouteItemId OR sourceGoogleEventId (only when source.googleEventId exists — avoids eq(field, null) weirdness)
removeFromTodayRoute server action: fetches item, guards on sourceRouteItemId || sourceGoogleEventId, hard-deletes Hearth copy, revalidates /today and /week — Google Calendar untouched
RouteItemCard: isCopiedItem = !!(sourceRouteItemId || sourceGoogleEventId)
RouteItemCard: liveScheduledTime = isCopiedItem ? null : item.scheduledTime — copied items never render a clock time badge
RouteItemCard: buildSourceLabel() — 'From Google Calendar · Original: Sat 10:00 AM' or 'Added from Week · Original: Tue' — quiet italic text-[10px]
RouteItemCard: copied items get Done + Trash2 (destructive ghost) only — Move/Skip/Note hidden since they don't apply to a reminder-copy
RouteItemCard: removed state returns null immediately on client — no flicker waiting for revalidation
“Hearth should feel like a calm route, not a calendar in a trench coat.”