README file from
GithubReminder Telegram
Obsidian plugin that sends Telegram notifications when your tasks reach their deadline. Supports date-only deadlines (checked on an interval), exact-time deadlines (precise scheduler), upcoming reminders, and recurring tasks.
What's new in 1.0.9
- Exact-time reminders — tasks with a time component (
YYYY-MM-DDTHH:MM) now fire at the precise minute via an at-time scheduler, with configurable lead time and a PC-off catch-up window. - Reminder-plugin syntax — supports
@YYYY-MM-DD HH:MMand(@YYYY-MM-DD)inline date tokens. - Kanban-plugin syntax — supports
@YYYY-MM-DD @@HH:MMfor date+time and@YYYY-MM-DDfor date-only inline tasks. - Recurring tasks — append
🔁 every day|week|month|yearto an inline task; completing it automatically advances the date and re-opens the checkbox. - PC-off catch-up — missed at-time, overdue, and upcoming notifications fire when Obsidian re-opens, guarded by a configurable time window.
- Separate upcoming templates — upcoming reminders now use their own bulk and individual message templates.
- Test message template — customize the message sent by the "Send test Telegram notification" command.
- Modern settings UI — the settings tab now uses Obsidian's
getSettingDefinitionsAPI (with a legacy fallback for older app versions) and includes clickable template-variable chips, character counters, and live preview.
Features
- Frontmatter + inline tasks — YAML
scheduled/duefields,- [ ]lines with📅,due::,scheduled::,starts::, and plain dates - Exact-time reminders — Reminder-plugin
@syntax and Kanban@@syntax fire at the precise minute, with configurable lead time - At-time scheduler — a timer wakes up at each deadline instead of waiting for the next interval check
- PC-off catch-up — missed notifications (at-time, overdue, upcoming) fire when the app re-opens, within a configurable window
- Upcoming reminders — heads-up for tasks due in the next N days, with its own templates
- Recurring tasks —
🔁 every …syntax auto-advances a completed task to its next occurrence and re-opens the checkbox - Telegram integration — bulk digests or individual messages, markdown formatting, 4096-char truncation
- Duplicate prevention — per-task notified state persisted across sessions
- Task sidebar — overdue / due-today / upcoming views with time-scope and tag filters
- Template editor UX — clickable variable chips, character counters, live preview
- Status bar — click to check immediately; shows the last check time
Installation
From Obsidian Community Plugins
- Settings → Community plugins → Browse
- Search for "Reminder Telegram"
- Install and enable
Manual
- Clone the repo or download the latest release
- Copy
main.js,manifest.json,styles.cssinto your vault's.obsidian/plugins/obsidian-reminder-telegram/ - Reload Obsidian and enable the plugin
Requires Obsidian 1.7.2+ (minAppVersion).
Setup
- Create a bot: in Telegram, message @BotFather, send
/newbot, follow the prompts, copy the token. - Get your chat ID: message @userinfobot, send
/start; it replies with your numeric chat ID. - Configure the plugin: paste the token and chat ID under Settings → Reminder Telegram. The settings tab walks through these steps too.
- Send a test notification via the "Send test" button to verify.
Task syntax
YAML frontmatter
A note with a scheduled or due field and --- delimiters becomes a task. The task text is the note's base name, or the first heading after the frontmatter if one exists.
---
status: open
scheduled: 2024-12-25
tags:
- task
---
# My Task
Complete this task by Christmas
status:open/in-progress= incomplete;done/completed/cancelled/archived= completed (acompletedDatefield also marks it done)scheduled/due:YYYY-MM-DD(date-only) orYYYY-MM-DDTHH:MM(exact time)tags: used for sidebar tag filtering (not required for recognition)
Inline tasks
- [ ] Complete project by 📅 2024-12-25
- [ ] Review notes due:: 2024-12-20
- [ ] Meeting scheduled:: 2024-12-15
Accepted date formats: YYYY-MM-DD, MM/DD/YYYY, DD-MM-YYYY, with optional times (YYYY-MM-DDTHH:MM or YYYY-MM-DD HH:MM). Lines inside fenced code blocks are ignored; [x]/[X] tasks are skipped.
Exact-time syntax
Reminder-plugin @ syntax (toggle: Reminder syntax):
- [ ] Call Grandma @2026-07-22 12:30
- [ ] Call Grandma (@2026-07-22 12:30)
- [ ] Buy milk (@2026-07-22) # no time → date-only
Kanban-plugin syntax (toggle: Kanban syntax):
- [ ] Call Grandma @2026-07-22 @@14:30 # date + time
- [ ] Buy milk @2026-07-22 # no time → date-only
Reminder syntax owns @YYYY-MM-DD HH:MM; Kanban owns @YYYY-MM-DD @@HH:MM and bare @YYYY-MM-DD.
Recurring tasks
Append 🔁 every … to an inline task (works with any date syntax, including the full reminder form):
- [ ] Water plants 📅 2026-07-22 🔁 every day
- [ ] Call Grandma (@2026-07-31 09:00 🔁 every week on Sunday)
- [ ] Pay rent 📅 2026-08-01 🔁 every month
- [ ] Renew license 📅 2026-07-22 🔁 every year
| Pattern | Next occurrence |
|---|---|
🔁 every day |
+1 calendar day |
🔁 every week |
+7 days |
🔁 every week on Sunday (any weekday, full or 3-letter name) |
next matching weekday |
🔁 every month |
same day next month (e.g. Jan 31 → Feb 28 → Mar 31) |
🔁 every year |
same month/day next year (Feb 29 → Feb 28) |
When you complete a recurring task (- [x]), the plugin rewrites the line: the checkbox re-opens and the date advances to the next occurrence — task text and metadata are preserved. Overdue recurring tasks advance until the next occurrence is in the future. Toggle: Recurring tasks (default on).
Notification behavior
When do notifications go out:
- Interval checks — every Check interval minutes (default 30) and on manual triggers. Handles date-only tasks: due today, overdue, and upcoming.
- At-time scheduler — datetime tasks fire at
deadline − lead timevia a precise timer, re-armed on vault changes, workspace changes, and app resume. - PC-off catch-up — on the next check after the app re-opens, missed notifications fire if they fall within the catch-up window; anything older is silently dropped.
Catch-up window (Catch-up window (minutes), default 60) applies to:
- at-time tasks: fires whose scheduled time is within the window
- overdue tasks: deadline within the window (datetime tasks by exact timestamp; date-only tasks from the end of their day)
- tasks that were upcoming while the app was closed and became overdue within the window
Tasks due today are never gated. A window of 0 disables the gate and past behavior applies (all overdue tasks are always notified).
Upcoming reminders (Upcoming reminders + Days ahead for upcoming, default 1): tasks due in the next N days (tomorrow onward) get a heads-up with their own templates. Due/overdue notifications share the per-check budget (Max tasks per check).
Strict time mode: when enabled, datetime tasks are handled only by the at-time scheduler — interval checks skip them entirely (default off, so the interval stays as a safety net).
Sidebar
Open via the 🔔 ribbon icon or the "Toggle sidebar" command.
- Overdue — past deadline
- Due Today
- Upcoming — next N days (same Days ahead setting)
Filters: today (hide upcoming), week (cap upcoming at 7 days), tag (intersect by frontmatter tag), clear. Relative dates are shown (Today / Yesterday / Tue / in 3 days). Clicking a task opens the file and scrolls to the task line (or heading).
Commands
| Command | Action |
|---|---|
| Check reminders now | Run an interval check immediately |
| Send test Telegram notification | Verify config |
| Toggle sidebar | Open/close the task sidebar |
Message templates
Variables:
- Digest templates (multi-task):
{count},{tasks} - Individual templates:
{taskName},{fileName},{deadline},{filePath},{taskId} - Upcoming uses its own digest + individual templates with the same variables
Bulk messages send when more than one task is due; otherwise an individual message is sent. Messages are truncated at Telegram's 4096-character limit (markdown-safe cutoff when formatting is on).
The template editor provides clickable variable chips, per-field character counters (warn at 80% of 4096), and a live preview panel with sample data (toggle: Live preview).
Markdown formatting: enable in settings for *bold*, _italic_, `code`, [links](https://example.com). Literal characters the parser rejects cause Telegram to return an error — keep unescaped */_ usage minimal.
Settings
| Setting | Default | Notes |
|---|---|---|
| Telegram Bot Token | '' |
@BotFather |
| Telegram Chat ID | '' |
@userinfobot |
| Notifications Enabled | true |
master switch (also gates at-time) |
| Check Interval (minutes) | 30 |
interval check cadence |
| Max Tasks Per Check | 10 |
due + upcoming budget per run |
| Scan Mode | whole-vault |
or specific folder |
| Target Folder | '' |
when Scan Mode = specific folder |
| At-time Notifications | true |
master switch for the precise scheduler |
| Reminder Syntax | true |
recognize @… / (@…) dates |
| Kanban Syntax | true |
recognize @… @@HH:MM dates |
| Recurring Tasks | true |
recognize 🔁 every … and auto-reschedule |
| Lead Time (minutes) | 0 |
fire N minutes before the deadline (max 1440) |
| Catch-up Window (minutes) | 60 |
PC-off catch-up for at-time/overdue/upcoming (max 10080) |
| Strict Time Mode | false |
datetime tasks fire only via the scheduler |
| Upcoming Reminders | true |
enable upcoming heads-up |
| Days Ahead for Upcoming | 1 |
0 disables |
| Upcoming Bulk Template | … | {count}, {tasks} |
| Upcoming Individual Template | … | per-task variables |
| Multi-task Digest Template | … | {count}, {tasks} |
| Individual Message Template | … | per-task variables |
| Test Message Template | … | no variables |
| Live Preview | true |
render template previews |
| Use Markdown Formatting | false |
Telegram markdown |
Development
npm install
npm run dev # watch mode
npm run build # type-check + esbuild
npm run lint
npm test # vitest (mocked obsidian + Telegram HTTP)
npm run test:coverage
Planned
Ideas that are not implemented yet:
- Advanced scan filters — exclude specific folders or patterns from the scan
- Explicit timezone handling — per-task or per-vault timezone management for exact-time deadlines (currently local time)
- Snooze / postpone — inline Telegram interaction to push a task's deadline
Contributing
Pull requests welcome — open an issue first for significant changes.
License
BSD-0-Clause. See LICENSE.