hypercal 2.2.1

Contacts: an address book that syncs with CardDAV, and a birthdays calendar
built from it. Also calendar and contact files opened from other apps, typed
times in the editor, a full-page Settings, easier resizing on touch, and
fixes to CalDAV sync and live updates.

**Contacts.** Open the account menu, then Contacts, or press Shift+C. The
page lists your contacts A to Z, with the next 30 days' birthdays and
anniversaries at the top, and searches names, emails, phone numbers and
labels. A contact holds several emails, phones, websites and addresses, dates
with or without a year, a photo, labels and notes. The sidebar shows the
coming week's birthdays.

Import and export as CSV or vCard, with a preview before an import. The app
finds likely duplicates and merges them. Contacts are part of a whole-account
.hypercalendar backup.

**CardDAV.** Link an address book to a CardDAV server such as Nextcloud,
Radicale or Baïkal in Settings, Contacts, and it syncs both ways. Edits made
on both sides are merged field by field. The other direction works too:
switch on "Share over CardDAV" for a book, and DAVx5, iOS or Thunderbird can
sync it from hypercal on the same /dav address and app passwords as your
calendars.

**Birthdays calendar.** Add it from the "+" menu in the calendar list. It
shows birthdays, anniversaries or other dates from the books you pick, says
how old someone turns, and can remind you the day before. You change a
birthday on the contact, so the calendar itself is read-only. Database
migration 0035 adds the tables for contacts and address books.

**Files from other apps.** On Android, the app is offered under "Open with"
and in the share sheet for .ics and .vcf files. The desktop app opens .vcf
files too, and dropping one on the calendar imports it.

**Editor and Settings.**

- With a mouse, the start, end and due times are typed straight into the
  field, with a list of quarter hours.
- Changing a recurring event asks which events to change with a radio group
  and OK, so one stray tap no longer rewrites the whole series.
- Settings is a full page, and the open section is in the address, so a
  reload keeps it and it can be linked to.

**Week view.** A selected event has an outline in the theme's accent colour.
On touch, long-press and release an event to show its resize knobs, on
opposite corners. The grid scrolls to show both, and when an edge is off
screen its knob stays at the edge of the grid. An edge now moves as far as
your finger does, instead of jumping to it.

**Polls.** Times are larger and easier to read. The clock is 24-hour in
Europe, with a switch. Drag across slots to answer them all at once, and
meters show how the votes stand.

**Privacy.** A new privacy page says what the app stores and which
connections it can make. About links to it. The desktop app's check for new
versions is now off by default; turn it on in Settings, General.

**Fixed.**

- Live updates could stop reaching your other open tabs after one of them
  closed or reconnected.
- CalDAV sync now fetches only what changed since the last pass, and edits
  made on both sides reach the server instead of staying local.
- Keyboard shortcuts work in the Android app with a hardware keyboard, and
  Escape closes a dialog without also going back.
- Temperatures and rain are readable in the weather view on phones.
- The favicon's date fills the tile.
- The container image is rebuilt on current Debian packages, which fixes
  CVE-2026-103111 in libpcre2.