There are three possibilities to see birthdays (or anniversaries; in the following we just talk about birthdays for simplicity) of your contacts in your Android calendar:
- birthdays are read from the local contacts and then shown in the calendar app (recommended),
- birthday events are generated as a separate birthday calendar by the server (for instance, this feature is offered by Nextcloud),
- birthday events are provided by a local special backend.
Calendar apps that support birthdays from contacts
Many calendar apps can read the local contacts (they need the contacts permission for that) and then show the birthdays in the calendar. For instance, these calendar apps can read and show birthdays of local contacts:
Servers that can generate CalDAV birthday calendars from CardDAV contacts
Some servers can generate a birthday calendar from the contact birthdays that are also available on the server:
This birthday calendar can then be synchronized as any other calendar. The calendar app doesn't need the contacts permission.
Special backends
Some devices provide special backends that generate a local calendar from the local contact birthdays. There's also an open-source backend for that purpose (birthday calendar).
The local birthday calendar from such a backend can then be shown by any calendar app.
Special Scripts
There is a Python script that allows you to add CardDAV contact's birthdays to the CalDAV calendar. You might need to adjust it a bit to your needs.