killBottleneck is in public beta — cloud and self-host.killBottleneck is in beta.Beta on GitHub →
Skip to content

Notifications ​

The bell in the header shows the last 20 events; the full list, with filters and paging, lives at /notifications. That is also where the settings are — each user chooses for themselves what they want to hear about, type by type.

Every event type has its own toggle for the app and for e-mail.

What gets announced ​

The bell — the latest events, with a Show all link to the full list.

A task or a goal assigned to you (including in a map that already exists), a comment on your task or goal, a new project and a project shared with you, a waiting goal being unblocked ("the goal is up"), an approaching or missed deadline, an AI agent request and its fulfilment, an automation finishing or failing, and a timer stopped automatically. New: a Timed reminder (for a calendar event or a task deadline — see below) and an Event invitation (someone added you to the invitees of their event).

Besides events around your own work, the bell also carries a new version notice — after an update you get a few sentences about what was added, in your language. It arrives once per release and never comes by e-mail.

The full list at /notifications is paged ("Page X of Y") and filterable: All / Unread and by type; Mark all read clears the bell in one click.

Deadline notices arrive as one morning digest per group — overdue / due today / due tomorrow — not one message per item. The hour is KB_DEADLINE_HOUR (default 7, the container's local time). Read notifications are cleaned up after 30 days.

Timed reminders ​

The morning deadline digest is for everyone and has no time of day. When you want a nudge at a specific minute, there are two ways — both described under Tasks and My day:

  • a reminder on a calendar event (at the start, 15/30/60 minutes or a day before; for an all-day event in the morning at KB_DEADLINE_HOUR) — it reaches you and the invitees,
  • a reminder on a task deadline (on the deadline day, the day before, 2 days, a week — plus the hour) — you only.

Both arrive as the Timed reminder type: in the bell and by e-mail. Clicking the notification opens the calendar with the event's detail, or the map with that task. A timed reminder differs from the other types in two ways:

  • E-mail is on by default for your own events and deadline reminders (other types wait until you tick e-mail on). A reminder for a meeting that never reaches you while the app is closed would be useless. It can be switched off like any other type.
  • An invitee gets the reminder in the bell; by e-mail only after ticking e-mail for the Timed reminder type themselves. An invitation you did not ask for must not be a way for anyone to send you e-mail.
  • An event recorded in the past (say “dentist this morning”, entered in the afternoon) counts as reminded — nothing fires retroactively.
  • It is sent immediately even in Daily digest mode. A digest at 8:00 does not help with a meeting at 14:00. The Nothing mode still applies — if you switched e-mail off entirely, you get no reminder e-mails either.

The time is counted in the instance's time zone (the TZ variable; on a self-hosted instance the default is UTC — set e.g. TZ=Europe/Prague, see Environment variables). When the instance zone differs from your browser's, the event dialog says so: "Reminders use the instance time zone (…)". The server sends reminders once a minute.

After a server outage, reminders older than KB_REMINDER_CATCHUP_H hours (default 48) are not sent any more — they are only logged. Otherwise restoring a week-old backup would bury the bell in meetings that already happened. Younger missed reminders arrive right after start.

The bell does not flood ​

Two guards keep a busy morning from burying you, and neither of them ever silently drops anything — events are merged and the counts are admitted openly:

  • Merging: repeated events of the same type on the same item within a short window (10 minutes by default) raise a counter on the existing unread notification — "… (×3)" — instead of adding rows.
  • Daily cap: above a daily limit (50 by default), further events collapse into a single overflow summary with a growing count, rather than an endless list.

E-mail ​

The e-mail channel switches on once SMTP is configured; until then it is greyed out in the settings, with the explanation that e-mail is not set up on this server yet (in the cloud, sending is on from day one). Everyone then picks one rule above the per-type toggles — what may reach them by e-mail:

ModeBehaviour
InstantlyEvery checked event is e-mailed right away.
Daily digestNo individual e-mails; one summary arrives once a day (in the morning, from 8:00 by default). Exception: a Timed reminder is sent immediately.
NothingNothing is e-mailed — timed reminders included. Notifications stay in the app.

E-mails arrive in the recipient's language, in one consistent look. E-mail also has its own daily cap per recipient (10 by default) — an app that spams its users into a mail filter has no e-mail channel at all. On an instance where notification e-mails were already arriving before per-user preferences existed, KB_NOTIFY_EMAIL_DEFAULT=1 keeps them on until each user says otherwise.

Next ​

fair-code — self-hosting and internal use are free, reselling as a hosted service is not.