cal-notif
Calendar notifications for the desktop. Reads the .ics files vdirsyncer
keeps in sync, shows a popup at each alarm (with a Snooze button) and says
it out loud with a local Kokoro voice. Nothing leaves the machine.
- Each event's own alarms (VALARM) set when it notifies.
- Events without alarms can get per-calendar defaults, or per-event
alarms chosen from a rofi menu. A per-event choice replaces the event's
own alarms, and
nonesilences it.
Requirements
- Python 3.11+ with
icalendar,python-dateutil,numpy,kokoro-onnx - Kokoro model files (
kokoro-v1.0.onnx,voices-v1.0.bin) notify-sendand a notification server that supports actionsaplay,rofi- vdirsyncer with a
filesystemstorage for the calendars
Usage
cal-notif daemon # start from your compositor's autostart
cal-notif pick # bind to a key: set alarms for one event
cal-notif say TEXT # test the voice
Config: ~/.config/cal-notif/config.toml, see config.example.toml.
Per-event alarms from pick go to ~/.config/cal-notif/overrides.toml
("<event UID>" = ["1h", "10m"]), which can also be edited by hand. The
daemon picks up changes to both files, and to the calendars, within 30 s,
except an .ics file edited in place (not replaced), only seen at the next
hourly rebuild.
In the picker, type durations like 1d 2h (one alarm) or 1d, 1h (two
alarms), none to silence the event, reset to go back to its own alarms.
With Do Not Disturb on, the notification server may close the popup into its drawer without reporting an action, so that alarm can no longer be snoozed. The voice still plays.
Tests
/usr/bin/python3 test_cal_notif.py
License
GPLv2 only, see LICENSE.
Development Approach
This project is developed using AI-assisted tools. Code is generated with the help of AI based on human-provided specifications, design decisions, and iterative feedback.
All contributions are reviewed, tested, and curated by the maintainer before being included in the codebase. AI is used as a productivity and exploration tool, while human oversight remains central to all decisions.
The goal is to combine the flexibility of AI-assisted development with standard open-source practices such as transparency, review, and accountability.
