feat: task reminders via ntfy/signal/email/SMS #44

Closed
opened 2026-03-23 20:21:17 +00:00 by barrettruth · 1 comment
barrettruth commented 2026-03-23 20:21:17 +00:00

Problem

No way to get reminded about upcoming task deadlines. Self-hosted setup means we have full control over notification infrastructure.

Proposed Solution

Schema

New reminders table: taskId, channel, beforeMin, sentAt. Tracks which reminders have fired to avoid duplicates.

Channels (priority order)

  1. ntfy — self-hostable push notifications, one HTTP POST, zero deps. NixOS package available.
  2. signal — via signal-cli (nix package exists). Requires phone number registration. More brittle but messages land in Signal directly.
  3. email — nodemailer/SMTP relay from VPS.
  4. SMS — Twilio/Vonage API (~$0.01/msg).
  5. desktopnotify-send on VPS (limited use).

UX

In task detail, below due date: multi-select channel toggles + timing dropdown (30m, 1h, 1d, custom). Multiple reminders per task supported.

Implementation

  • New recipe type reminder in automation framework
  • Runs every 1 min via existing cron scheduler
  • Queries tasks with due - beforeMin <= now AND sentAt IS NULL
  • Channel config via env vars (NTFY_TOPIC, SMTP_HOST, SIGNAL_NUMBER)
  • Each channel is a simple async function in src/core/channels/
## Problem No way to get reminded about upcoming task deadlines. Self-hosted setup means we have full control over notification infrastructure. ## Proposed Solution ### Schema New `reminders` table: `taskId`, `channel`, `beforeMin`, `sentAt`. Tracks which reminders have fired to avoid duplicates. ### Channels (priority order) 1. **ntfy** — self-hostable push notifications, one HTTP POST, zero deps. NixOS package available. 2. **signal** — via `signal-cli` (nix package exists). Requires phone number registration. More brittle but messages land in Signal directly. 3. **email** — nodemailer/SMTP relay from VPS. 4. **SMS** — Twilio/Vonage API (~$0.01/msg). 5. **desktop** — `notify-send` on VPS (limited use). ### UX In task detail, below due date: multi-select channel toggles + timing dropdown (30m, 1h, 1d, custom). Multiple reminders per task supported. ### Implementation - New recipe type `reminder` in automation framework - Runs every 1 min via existing cron scheduler - Queries tasks with `due - beforeMin <= now AND sentAt IS NULL` - Channel config via env vars (`NTFY_TOPIC`, `SMTP_HOST`, `SIGNAL_NUMBER`) - Each channel is a simple async function in `src/core/channels/`
barrettruth commented 2026-04-06 22:32:16 +00:00

Superseded by #189 and the current reminder architecture. The original proposal no longer matches the implemented design: reminders are now a first-class task subsystem with adapter-based delivery, and active remaining work is tracked in #200, #201, #202, #203, and #204.

Superseded by #189 and the current reminder architecture. The original proposal no longer matches the implemented design: reminders are now a first-class task subsystem with adapter-based delivery, and active remaining work is tracked in #200, #201, #202, #203, and #204.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
barrettruth/delta#44
No description provided.