Home Assistant projects
All projects

Calendar Card

Lovelace card · Everyday
v1.9.0 · Nov 12, 2026 HA 2024.8.0+ Marketplace

An agenda of one or more calendars, grouped by day, each in its own colour.

Google Calendar, CalDAV, Local Calendar, Microsoft 365…: events grouped by day with countdowns, a progress bar for the event under way, details in a popup and a mini card with the next event.

Highlights

  • Several calendars merged, each with its colour
  • Countdown and Now badge for today's events
  • Event details in a popup
  • New event form from the card, with an end date and a description
  • Edit and delete events, recurring ones too
  • Times in the browser's or the server's time zone, as set in your profile
  • Week view, the 7 days from today side by side, one day per row on a narrow card, with arrows or a swipe to the previous or next week
  • Mini card with the next event, opening its details

Works with

Cards

calendar-agenda-cardcalendar-agenda-mini-card
type: custom:calendar-agenda-card

Install

  1. 1Open the repository in the Marketplace with the Add to Marketplace button above, or addgithub.com/juju35/ha-calendar-card as a custom repository (category Dashboard).
  2. 2Download it from the Marketplace.
  3. 3Reload the browser and add the card from the dashboard editor.

Documentation

From the README

Features

Features

  • Two cards: calendar-agenda-card and its mini version calendar-agenda-mini-card (next event and the one after; a detail button unfolds the full agenda)
  • Several calendars merged in one list, each with its own color and name; an event shared by several calendars (same uid) is listed once, distinct events with the same title and times are all kept
  • Days with today and tomorrow labelled, all-day events, time range and location; a multi-day event is listed once with its date range
  • Countdown for today's events (in 25 min, in 2 h 05), Now badge and progress bar for the event under way; finished events go away
  • Week view (view: week): the 7 days from today side by side, each event a tile in its calendar's color (time and title); one day per row on a narrow card; arrows (or a swipe) to the previous or next week, and Today to come back
  • Events past max_events fold into a N more events section (chevron right folded, down unfolded, folds back on a click elsewhere)
  • Click an event for its details (date and time, location, calendar, description) in a popup at the top of the card; the keyboard focus moves into the popup or the form and back to the event when it closes
  • + button in the header: a New event form (title, calendar, all day, start and end date and time, location, description) adds the event to a calendar that accepts new events (local calendar, CalDAV, Google…); the end date allows overnight and multi-day events
  • Edit and Delete buttons in the event details, for a calendar that allows it: edit opens the same form pre-filled, delete asks for a confirmation in the popup; for a recurring event, the change applies to this event only or to this one and the following ones
  • Hide events by title with exclude
  • Refreshes when an event starts or ends and every 5 minutes
  • Visual editor in the dashboard UI
  • English, French, German, Spanish, Serbian (Cyrillic and Latin), Italian, Dutch, European Portuguese, Polish, Romanian, Danish, Swedish, Bulgarian, Russian, Ukrainian, Hungarian, Slovak, Czech, Slovenian, Latvian and Greek, follows the Home Assistant language, 12 h / 24 h time format and time zone setting (the browser's or the server's)
  • Light and dark theme compatible
  • Single file, no dependencies, ready for the Marketplace

Prerequisites

Prerequisites

  • Home Assistant 2024.8 or later with at least one calendar.* entity

Configuration

Configuration

Visual editor#

Add the card from the dashboard (Add card → Calendar Agenda Card or Calendar Agenda Mini Card). The first calendars found are picked; change them with the Calendars field, then set the title, the number of days and the sections to show. Colors and names per calendar are set in YAML; the editor keeps them. Options left at their default are not written to the YAML.

Minimal#

type: custom:calendar-agenda-card
entities:
  - calendar.home
  - calendar.work

Mini card#

type: custom:calendar-agenda-mini-card
entities:
  - calendar.home
  - calendar.work

The mini card shows today's all-day events under way (school holidays, a public holiday…) on a compact line each, with the day they end, then the event under way or the next one (with its countdown), then the one after. A click (or Enter) on any of these lines opens the event's details. The detail button (top right) unfolds the full agenda; a click anywhere else on the page folds it back. It takes the same options as the full card, which apply once unfolded, plus zoom.

Full options#

type: custom:calendar-agenda-card
title: Family
entities:
  - entity: calendar.home
    color: "#039be5"
    name: Home
  - entity: calendar.work
    color: "#33b679"
  - entity: calendar.public_holidays
    color: "#8e24aa"
    name: Holidays
view: agenda
days_to_show: 7
max_events: 5
show_header: true
show_location: true
show_end_time: true
show_countdown: true
show_empty_days: false
show_past_events: false
exclude:
  - Private
language: en

Options reference#

Option Required Default Description
entities ✅ — Calendars: entity IDs, or objects { entity, color, name }
title ❌ Agenda (translated) Card title
show_title ❌ true Show the title in the header (e.g. false under a section heading of your own)
view ❌ agenda agenda (list by day) or week (7 columns from today; days_to_show and max_events don't apply). Full card only, the mini card keeps its list
days_to_show ❌ 7 Number of days from today (1 to 62)
max_events ❌ 5 Events shown before the folded more section (0 shows everything)
show_header ❌ true Header with today's date and the number of events today
show_location ❌ true Show the event location
show_end_time ❌ true Show the end time of timed events
show_countdown ❌ true Countdown and Now badge for today's events
show_empty_days ❌ false List days without events
show_past_events ❌ false Keep today's finished events (greyed out)
exclude ❌ — Hide events whose title contains one of these texts (case-insensitive)
add_button ❌ true Full card only: + button in the header that opens the new event form (shown only when a calendar accepts new events)
edit_buttons ❌ true Full card only: Edit and Delete buttons in the event details (shown only when the event's calendar allows changing or deleting events)
zoom ❌ true Mini card only: detail button at the top right that unfolds the full agenda (a click elsewhere folds it back)
language ❌ Auto Force language: en, fr, de, es, sr, sr-Latn, it, nl, pt, pl, ro, da, sv, bg, ru, uk, hu, sk, cs, sl, lv or el (auto-detects from HA settings)

Calendar options:

Key Default Description
entity — calendar.* entity
color Palette Any CSS color, used for the bar, background and dot of its events
name Entity name Shown in the event details

How it works

How it works

The card asks Home Assistant for the events of each calendar between today midnight and days_to_show days later (the /api/calendars/<entity> endpoint the built-in calendar uses). It fetches again when a calendar entity changes state (an event starts or ends), when the day changes and every 5 minutes; countdowns move on every minute. A calendar that fails to load is named under the list and the others are still shown.

Times follow the Time zone setting of the Home Assistant user profile: the browser's zone by default, or the server's zone (hass.config.time_zone) when the profile is set to use it. The days, the times and the event form all use that zone.

The + button appears when at least one calendar supports creating events. The form needs a title, a date and, unless all day, a start and an end time. It calls the calendar.create_event action (all-day events end the next day, as Home Assistant expects) and the agenda fetches again once it is saved; an error from the calendar is shown in the form.

The Edit and Delete buttons appear in the details of an event that has a uid, when its calendar supports updating or deleting events. They use the calendar/event/update and calendar/event/delete WebSocket commands, like the calendar panel of Home Assistant: times are sent in UTC, all-day events as dates ending the next day, the description edited in the form like the other fields. For a recurring event, the card asks whether the change applies to this event only or to this one and the following ones (recurrence_range: THISANDFUTURE, the recurrence rule kept). The agenda fetches again once the event is saved or deleted; an error is shown in the form or the popup.

A multi-day event is listed once, on the first day shown (its start day, or today when it started earlier), with its date range. Today's timed events that are over are hidden unless show_past_events is on.

Support

Support

If you find this project useful, you can support its development:

Buy Me a Coffee

1.9.0Nov 12, 2026Latest

Features

  • show_title option (also in the visual editor) hides the header's title, keeping its date and today's count, for a card placed under a section heading of its own (asked in juju35/ha-vehicle-card#72).

1.8.2Nov 9, 2026

Improvements

  • Week view: arrows to show the previous or the next week, its dates between them, and Today to come back; a horizontal swipe over the days does the same on a phone. A past week shows its past events.

1.8.1Nov 9, 2026

Maintenance

  • No code change: released again to check the installation from the Marketplace.

1.8.0Nov 9, 2026

Features

  • Week view (view: week, View in the editor): the full card lays the 7 days from today side by side, today highlighted, each event a tile in its calendar's color with its start time (or All day) and title; a click opens its details as in the list. Under 504 px wide, one day per row. The mini card keeps its list. 22 languages.

1.7.1Nov 9, 2026

Fixes

  • Translations: the cards are defined once the page's language file has arrived (at most 1.5 s; Home Assistant builds a card when its element gets defined), so the first render is already translated instead of English then redrawn; until a language file is in, a missing text reads the English one wherever the card has no fallback of its own.

1.7.0Nov 9, 2026

Performance

  • Translations load on demand: the bundle keeps English only (133 KB → 82 KB) and each other language is its own calendar-card.i18n.<lang>.js file next to it, fetched the first time a card needs it. Home Assistant loads every dashboard resource on every dashboard, so each page used to download and parse all 22 languages to use one. Until a language file has arrived (a few milliseconds), texts fall back to English, and the cards redraw once it is there.

Maintenance

  • Build: scripts/i18n-split.mjs splits the built bundle and rebuilds every table from the split files to check them (the build fails on any difference); src/ keeps every language as before.
  • Release: every file of dist/ is attached. Manual installation copies the translation files too.