Annuals — more than just a birthday/holiday tracker

Just released v2.8.1 to provide more flexibility around the date format in custom lovelace card. You can configure it in Settings → General:

v2.8.2 brings optimization of YAML, so only settings outside of default are saved to reduce the saved config. In addition, one important fix for Custom text around styling of fields and a new option to configure font and color for Date and external calendar events.

:tada: Annuals 3.0.0 – Holidays, holidays… and holidays :beach_with_umbrella::date:

“Holiday” can mean very different things: public holidays, school holidays, or simply your own vacation.

:school: School Holidays
Import regional school breaks and choose whether to track the start, end, or every day of the break.

:globe_showing_europe_africa: Public Holidays
250+ countries and territories, regional holidays, 150+ languages, custom translations.

:beach_with_umbrella: Your Holidays
Add your own vacations as multi-day events and get that all-important countdown to your next trip. :smiling_face_with_sunglasses:

And of course, everything integrates with the Annuals Lovelace card, your existing calendars, dashboards and automations.

Thanks for the first 100 installations! Let me know, when you have an idea for an additional feature.

1 Like

@somansch
What a great integration! Thank you for that.

2 Likes

Quick teaser for planned next release:

:artist_palette: Annuals v3.1.0 – Your Card, Your Layout

With Annuals v3.1.0, the main focus was clear: even more freedom to make the Annuals Card look exactly the way you want it. :rocket:

Instead of forcing you into a specific layout, you now have much more control over how your events are displayed.

:artist_palette: More flexibility

The individual elements of the card can be combined, arranged and styled more freely than before.

Date Block, Icon, Accent Bar, Name, Countdown, Timeline, Badges and more can all be configured individually.

Colors can also be assigned based on event type and status – for example birthdays, public holidays, school holidays, external calendars, or events happening today or coming up soon.

The result: the same Annuals Card can look completely different depending on how you configure it.

:sparkles: New Presets

To make getting started easier, v3.1.0 introduces three layout presets:

Default · Agenda · Minimal

One click gives you a complete starting layout, which you can then customize however you like.

The new Agenda layout was inspired by the excellent Calendar Card Pro and brings a compact, calendar-style look to Annuals.

:gear: A cleaner Card Editor

More customization shouldn’t mean a more complicated editor.

That’s why the visual editor has also been cleaned up:

You only see configuration options for elements that are actually active in your current layout.

No Date Block? → No Date Block settings.
No Timeline? → No Timeline settings.

This keeps the editor clean and easy to navigate, despite the growing number of customization options.

:tear_off_calendar: New separators

Longer event lists can now be structured using day, week and month separators.

For example:

Monday · Week 34 · August

Labels are localized automatically.

This makes larger lists of birthdays, holidays, school breaks and calendar events much easier to scan.

…and as always all customization inside the card editor, so you can go really wild:
annuals-card-presets-custom

I’m really curious to see what layouts you build with the new options – feel free to share your Annuals Cards in the comments! :smiling_face_with_sunglasses:

As always, feedback, ideas and bug reports are very welcome.

:star: And if you enjoy Annuals, I’d really appreciate a Star on GitHub. It helps the project get discovered and keeps me motivated for what’s next. :folded_hands:

Cheers

A huge thank you to everyone using Annuals, sharing feedback and supporting the project! :folded_hands:

We’ve just passed 300 downloads and 50 stars on GitHub – amazing to see the community growing! :rocket:

This is exactly what I need to remind me of family birthdays. I’ve installed it, including the blueprint, but I’m struggling to find the custom card to show upcoming events. The ‘Annuals’ card is not listed in the available cards, and I’ve never installed a custom card, if that is what is needed. All documentation indicates that it should be there without any work on my part. Where do I start to troubleshoot this? Thanks to the ‘BeardedTinker’ for his video highlighting this integration.

1 Like

Got it working - had to clear cache and reload the integration, and it now the annual-card shows up.

1 Like

Annuals v3.2.0 is out :tada:

First, a thank you. The last release passed 689 downloads, and the repo just crossed 70 stars. For a niche integration about remembering birthdays, that is rather more than I expected — and behind each of those is someone who decided to trust it with their family’s dates. Thank you.

This is also very much your release: two of its headline features came straight out of the issue tracker.

Pick what kind of event you are adding

Adding an event now starts by asking what kind it is — a yearly date for someone, a one-time event, or a custom one. Each kind then gets a form carrying only its own fields, instead of one long form with labels explaining which types they do not apply to.

Dates that are a rule, not a day

Someone asked for Mother’s and Father’s Day, and put their finger on the real problem: in Australia, Father’s Day is the first Sunday in September — and there was no way to say that.

There is now. A custom event can follow a rule instead of a day: First / Second / Third / Fourth / Last + weekday + month. That covers Mother’s Day, Grandparents’ Day, Friendship Day and the rest of the observances the holidays database does not carry. Public holidays are untouched — they already work out their own date each year.

The card fits where you put it

The card resizes properly in a sections view now — Home Assistant’s Layout tab no longer opens with “This card does not fully support resizing yet”. Down to a single row, if that is what you want: above, a full list on the left, a Timeline top right, and underneath it a card exactly one row tall showing one event.

Two settings came along for the ride: the list can fold after however many events you like, with the rest behind a chevron, and Minimal trims the card’s edges so that one event really does fit one row.

And a few more

  • Multi-day events now covers entries from embedded calendars too, not just one-time events with an end date — a week in a shared family calendar can show as its first day, its last, both, or one row per day.
  • Slovenčina joins the languages — sixteen now — from a community PR, with everything new translated in all of them.
  • Fixed: the card occasionally never appeared until you refreshed the page. And re-importing public holidays no longer duplicates the ones the library has quietly renamed; importing several categories now leaves one entry per holiday.

:open_book: Full release notes · Changelog · Repo

If something is off, or you want something it does not do yet — the issue tracker is open, and this release is the proof that I read it. :slightly_smiling_face:

Happy to see Slovak here! (Out of 16, not 500)

1 Like

Annuals v3.3.0 is out :tada:

This release is about the card. So far it showed you what is coming; now you can move through it, search it, and keep it up to date without leaving the dashboard.

Page through it like a calendar — and search it

Calendar navigation and search in use

A bar under the card title turns the list into one period at a time — day, week, month or year — with two arrows, a date picker, a swipe on a phone, and a tap on the period itself as the way back to today. Under it, a search field that filters as you type: names, types, a holiday’s category, an embedded calendar entry’s location. Two letters are usually enough, and Escape clears it.

Both are a look, not a setting — nothing is written to the dashboard. So paging to next month on one phone leaves every other screen where it was, and a card nobody has touched follows the calendar across midnight.

Add, edit and delete from the card

A + beside the title opens the integration’s own Add an event steps in a dialog over the dashboard — the same fields, the same wording and the same language as under Settings → Devices & Services, because it is literally the same form. A pencil and a trash can float over the end of every row while the pointer is on it, or after a click on the row, which is how you reach them on a phone where nothing hovers.

Administrators only, since only they may add or change integration entries. All three are switchable, and each takes its own color, hover color, icon and size in the editor.

And a few more

  • A person’s picture on an event — give a yearly event a Person and that person’s picture stands in for the icon, round, with the same badges, in the list and in the Timeline. The reminder blueprint attaches it to the push notification, and a new photo there is a new photo here.
  • Every 6 months, every 2 years — a custom event can repeat by an interval instead of once a year: the dentist, the car inspection, the passport.
  • Today’s appointments leave when they are over — an appointment from 2 to 3 is gone at 3, on its own timer rather than at the next redraw. All-day events stay until midnight, as before. On from the start, switchable off.
  • Countdown in weeks and months, for whom in 3 months says more than in 87 days.
  • The card renders in about a third of the time — the date formatters are built once per render now instead of once per row — and the editor no longer rebuilds itself on every state change in your house.

:open_book: Full release notes · Changelog · Repo

As always — if something is off, or you want something it does not do yet, the issue tracker is open. :slightly_smiling_face:

1 Like

yes, that is what I am looking for. Thank you.

Every 6 months, every 2 years — a custom event can repeat by an interval instead of once a year: the dentist, the car inspection, the passport.

1 Like

First of all: amazing integration.
I just love the customization capabilities..

One thing that seems to be missing (or overlooked) :slight_smile:
the VIP and IMPORTANT equivalent of “calendar.annuals_birthday”
(and that possibly for the other types like weddings, etc)

That could be used in automations to get triggered on upcoming VIP events that notify you, display things.

Right now I have solved this with a helper, but that was done manually.

Name: Days until next VIP birthday
Type: Helper - Combine state of several sensors
Sensors:

  • sensor.annuals_birthday_emily
  • sensor.annuals_birthday_hans
  • sensor.annuals_wedding_hans_and_emily

Statistic: Minimum
Precision: 0

You manually have to maintain the list of VIP birthdays but it will tell you “9 days until a VIP birthday is happening”
With this number I can make a card visible that only shows the first upcoming VIP card if the day count <20.

Thanks, Dirk - glad Annuals is useful to you!

Most of what you describe can be done today without the per-type min/max helpers.

Notifications for upcoming VIP or Important events

The bundled blueprint Annuals - Upcoming Event Reminders has a VIP filter and an Important filter (“must be” / “must NOT be”, combined with AND or OR). It can target every event of the types you pick, so new events are covered without touching the automation. Set the lead times you want, e.g. 20,7,1,0, and it notifies you that many days ahead. See Blueprint: Upcoming Event Reminders in the README.

One sensor: “days until the next VIP event”

This replaces the min/max helper and covers all types at once. Under Settings → Devices & services → Helpers → Create helper → Template → Template sensor, use:

{% set annuals = states.sensor | selectattr('entity_id', 'match', '^sensor\.annuals_') | list %}
{% set days = annuals | selectattr('attributes.vip', 'equalto', true)
   | map(attribute='state') | select('is_number') | map('int') | list %}
{{ days | min if days else none }}

Set the unit to d if you like. It picks up every VIP event of every type, including ones you add later. To count Important events as well, use this as the second line instead:

{% set days = ((annuals | selectattr('attributes.vip', 'equalto', true) | list)
             + (annuals | selectattr('attributes.important', 'equalto', true) | list))
   | map(attribute='state') | select('is_number') | map('int') | list %}

Your card can then use a visibility condition on that sensor, e.g. numeric state below 20.

Showing only those events on the card

The Annuals card itself has VIP only and Important only switches and a Days ahead limit. With VIP only on and Days ahead at 20, the card lists exactly the VIP events in the next 20 days.

You are right that there is no calendar.annuals_vip or calendar.annuals_important yet - the calendars are split by type only. Does the above cover what you need, or would a dedicated VIP/Important calendar still help you, for example for a calendar trigger?

1 Like

@somansch
Thank you for this fantastic integration!

Currently, the List view shows the time remaining (e.g., “in 4 days”),

while the Agenda view shows the date (e.g., “Fri 9 October”).

Is it possible to display both the relative date and the exact date for each event in Agenda view?

Something like this?

1 Like

Yes, you can setup the rows, how you prefer. Means, you can change the content of each rows after setting a preconfigured template under LAYOUT->LIST VIEW->ROW COLUMNS:

This would be the YAML in your case:

week_separators: true
week_separator_label: true
columns:
  - id: date_block
    type: date_block
  - id: accent_bar
    type: accent_bar
  - id: full_name_type
    type: full_name_type
  - id: badge
    type: badge
  - id: when
    type: when
  - id: icon
    type: icon
type: custom:annuals-card
1 Like

v3.4.0 released:

:check_box_with_check: Pick the holidays you want. The holiday import has a third step: every holiday your country, region and categories produce, each with its next date, in the order they come up - and a checkbox for each. Only the ticked ones become events. No more importing thirty holidays to keep three.

:chart_increasing: Stock exchange days. Import events → Stock exchanges brings in the days a stock exchange is closed, and the days it closes early, from 25 markets - New York, Nasdaq, London, Frankfurt, Zurich, Tokyo, Hong Kong, Sydney and more. They are not holidays, so they are an event type of their own, with their own calendar, card filter and colour - and they say what they are: New York Stock Exchange closes at 1:00 PM, for Day after Thanksgiving Day.

:world_map: A category without holidays where you asked says so. Some only exist below the country - Germany’s school holidays per state, India’s women-only holidays in Himachal Pradesh. Picked without the right region, the import used to report 0 queued; it now names the regions that have any.

:label: Every category has a name. Optional (women) was the one category of the holidays library that Annuals had no word for - checked against its full list, in all sixteen languages and in the reminder blueprint.


:open_book: Full release notes: CHANGELOG

:star: If Annuals is useful to you, a star on the repo is genuinely appreciated - it is how other people find it. Thank you!

Thank you,

calendar.annuals_birthday_vip

Would still be handy. The template is a nice workaround for now that is at least dynamic.
Using the built in “days ahead” does not work because if there’s none I do not want the card to display at all.
Now I use the card + “visibility” based on the template counter.