]*\ssrc\s*=\s*["\']([^"\']+)["\']#i', $raw, $m)) { $u = html_entity_decode($m[1], ENT_QUOTES | ENT_HTML5, 'UTF-8'); return $allowed($u) ? $u : null; } return null; } $embedUrl = familyHub_google_calendar_embed_url($rawEmbed); $fromIdOnly = false; if ($embedUrl === null && $calId !== '' && $calId !== 'your_calendar_id_here') { $embedUrl = 'https://calendar.google.com/calendar/embed?src=' . rawurlencode($calId); $fromIdOnly = true; } [$rangeStart, $rangeEnd] = hubCalendarDefaultAgendaRange($familySettings); $events = hubCalendarAgendaEvents($rangeStart, $rangeEnd, $people, $familySettings); [, $tzLocal] = familyHubCalendarContext($familySettings); $todayYmd = familyHubTodayYmdInTz($tzLocal); $twoWayMerge = !empty($familySettings['calendar_two_way_google']); $eventsByDate = []; foreach ($events as $ev) { $d = (string) ($ev['date'] ?? ''); if ($d === '') { continue; } if (!isset($eventsByDate[$d])) { $eventsByDate[$d] = []; } $eventsByDate[$d][] = $ev; } ksort($eventsByDate); $iconByType = [ 'chore' => 'fa-tasks', 'meal' => 'fa-utensils', 'grocery_due' => 'fa-cart-shopping', 'expense' => 'fa-coins', 'bill_day' => 'fa-file-invoice-dollar', ]; ?>

Calendar

Two-way Google Calendar sync is enabled in Family settings. OAuth connection is not available in this version yet. Your Google view below (if configured) and the Family Hub agenda still work; full sync will require signing in with Google when supported.

Family Hub agenda

to · Times use

Nothing scheduled in this range. Add chores, meal plan slots, expenses, or bill reminders.

$dayEvents): ?>
Today · Past

Google Calendar

Connect a shared family calendar by setting GOOGLE_CALENDAR_EMBED_CODE (embed URL or full <iframe> from Google Calendar) or GOOGLE_CALENDAR_ID in .env. See Google Calendar → calendar menu → Settings and sharingIntegrate calendar.

Showing calendar from GOOGLE_CALENDAR_ID. For more control (view, height), paste the embed URL or iframe into GOOGLE_CALENDAR_EMBED_CODE instead.