# Changelog

All notable changes to Chime are documented in this file.

The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and Chime follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## Unreleased

### Added

- Notifiers (`Chime.Notifier`): a category, `deliver` for each channel
  with `:wait`, `:if` and `:unless`; `recipients/1`, `data/1`, `actor/1`,
  `group/1`, `feed/2`, `email/3`, and a function for each of the app's
  channels.
- `Chime.notify/3`: one event, each person once, an idempotency key, in
  batches of 1000 people.
- The feed: seen, read, archived, pages and filters; counts kept in
  `chime_counts`; groups of events in one notification.
- Channels: the feed, email through the app's Swoosh mailer with
  one-click unsubscribe, and the app's own (`Chime.Channel`). Each
  delivery but the feed's is an Oban job, in the notification's
  transaction.
- Preferences: categories with labels, defaults and `required`; a
  setting for each channel; daily and weekly digests in each person's
  time zone (`Chime.Digest`).
- The log: `Chime.explain/1` and `Chime.Explain.format/1`, every
  decision with its reason.
- `Chime.Live` and `Chime.Components`: the bell, the feed and the
  preferences in LiveView, live over PubSub.
- `chime_api`: the feed and the preferences as JSON, a stream of
  server-sent events, and tokens (`Chime.Token`); `chime_mail`, the
  page of the links to unsubscribe.
- Chime's words in the app's languages, through the app's own Gettext
  (`:gettext`, `Chime.Messages`), from the template
  `priv/gettext/chime.pot`; deliveries and digests in each person's
  locale, the notifiers' own words with them.
- Workspaces: a notification of a team or an organisation of the app's
  (`workspace/1` of the notifier, or `:workspace`); the feed, the counts,
  the marks and the preferences of a workspace; the resolver's
  `resolve_workspace/1` for `Chime.Live` and the JSON API, which also
  takes `?workspace=`.
- Guards: the notifier's `notify?/2`, checked for each person when the
  notification comes; `:if` and `:unless` on the feed; the actor left
  out of the recipients unless `notify_actor: true`; a notification kept
  out of the feed has a `"feed"` delivery with the reason, for the log.
  A base module of the app's for its notifiers, in the Notifiers guide.
- Scheduled notifications (`Chime.notify/3` with `:at`), and
  `Chime.cancel/2`: a scheduled event not sent, a sent one's waiting
  deliveries skipped, and with `feed: :remove` its notifications out of
  the feeds. `Chime.Test.run_scheduled/1`.
- Delivery rules: `throttle:` (one by a channel for a group in a time),
  `debounce:` and `max_wait:` (a quick run of a group's events as one),
  quiet hours (`:quiet_hours` of the config and of each recipient, and
  `quiet: false` on a channel) and limits of a channel by person
  (`:limits`). A held delivery waits for its new time, and the log says
  why.
- Audiences: a notifier's `audience/1`, a query of the app's, gone
  through in Oban jobs 1000 people a page, each page once, for an
  announcement to everyone; `recipient_id/1`, `audience_key:`,
  `Chime.Test.run_audiences/0`.
- Actions: `actions` in `feed/2`, the notifier's `act/3`, `Chime.act/3`,
  the feed's buttons in LiveView and `POST /:id/actions/:action`.
- Read everywhere: `Chime.link/2`, a signed link that reads the
  notification when it is opened, then redirects; the email's
  `assigns.link`, and the digests' links, at `/open/:token` of
  `chime_mail`.
- Push: the `:push` channel, to browsers by Web Push (RFC 8291 and
  8292), Apple's devices by APNs and Android's by FCM, with the keys of
  the config's `:push`; each person's devices (`chime_devices`, turned on
  and off, forgotten when a service says they are gone), registered by
  the JSON API (`/devices`, `/push`); the notifier's `push/3`; the group
  as the tag that replaces a push on the device; `priv/static/chime-sw.js`;
  `mix chime.gen.vapid`.
- Channels over HTTP: `Chime.Channels.Slack` (a bot's `chat.postMessage`,
  or an incoming webhook), `Chime.Channels.Discord`, `Chime.Channels.Teams`
  (an Adaptive Card), `Chime.Channels.Webhook` (JSON, signed with HMAC)
  and `Chime.Channels.Twilio` (SMS); a person's address from their data,
  or one for everyone.
- The admin, `chime_admin` with the app's `Chime.Admin.Access`: the
  deliveries of the last day, the failed and "Send again"
  (`Chime.resend/1`), the events, each person, each notification's log.
- Previews: the notifier's `preview/0`, and the admin's `/previews`, each
  notifier as its channels say it, alone and as a group.
- The client of the JSON API, `chime.js` (`createChime`), and its React
  package, `chime/react`: `ChimeProvider`, `useNotifications`,
  `useCounts`, `usePreferences`, `Bell` and `NotificationBell`, with
  their types.
- `Chime.Test`, and `mix chime.gen.migration` (`Chime.Migrations`, on
  PostgreSQL and SQLite).
