1050 lines
34 KiB
Markdown
1050 lines
34 KiB
Markdown
План создания Obsidian-плагина напоминаний
|
||
Определить базовую концепцию
|
||
Плагин: Obsidian Notify Reminders.
|
||
Основные возможности:
|
||
создавать напоминания из заметок;
|
||
хранить список активных напоминаний;
|
||
отправлять уведомления через разные сервисы;
|
||
поддерживать шаблоны настроек для Telegram, ntfy и других провайдеров;
|
||
показывать историю отправленных/пропущенных уведомлений.
|
||
|
||
Форматы напоминаний в заметках
|
||
Поддержать несколько вариантов, чтобы плагин был удобен в разных стилях работы.
|
||
Пример inline-синтаксиса:
|
||
- [ ] Позвонить врачу @remind(2026-07-01 10:30)
|
||
Пример с сервисом:
|
||
- [ ] Проверить сервер @remind(2026-07-01 09:00, ntfy)
|
||
Пример через YAML/frontmatter:
|
||
reminders:
|
||
- title: Оплатить хостинг
|
||
at: 2026-07-05 12:00
|
||
notify: telegram
|
||
Пример через code block:
|
||
```reminder
|
||
title: Сделать бэкап
|
||
at: 2026-07-01 23:00
|
||
notify: ntfy
|
||
priority: high
|
||
|
||
|
||
Архитектура плагина
|
||
Основные модули:
|
||
ReminderParser
|
||
Ищет напоминания в markdown-файлах.
|
||
|
||
ReminderStore
|
||
Хранит нормализованные напоминания, их статус, id заметки, строку, дату, канал уведомления.
|
||
|
||
Scheduler
|
||
Проверяет, какие напоминания пора отправить.
|
||
|
||
NotificationProvider
|
||
Общий интерфейс для разных сервисов.
|
||
|
||
TelegramProvider
|
||
Отправка сообщений через Telegram Bot API.
|
||
|
||
NtfyProvider
|
||
Отправка уведомлений через ntfy topic.
|
||
|
||
WebhookProvider
|
||
Универсальная отправка на произвольный HTTP endpoint.
|
||
|
||
SettingsTab
|
||
UI настроек внутри Obsidian.
|
||
|
||
TemplatesManager
|
||
Готовые шаблоны конфигураций для сервисов.
|
||
|
||
|
||
Интерфейс провайдера уведомлений
|
||
Все сервисы должны работать через единый контракт:
|
||
interface NotificationProvider {
|
||
id: string;
|
||
name: string;
|
||
send(payload: NotificationPayload, config: ProviderConfig): Promise<void>;
|
||
test(config: ProviderConfig): Promise<TestResult>;
|
||
}
|
||
Payload:
|
||
interface NotificationPayload {
|
||
title: string;
|
||
message: string;
|
||
sourceFile?: string;
|
||
sourceLine?: number;
|
||
priority?: "low" | "normal" | "high";
|
||
url?: string;
|
||
}
|
||
|
||
Поддерживаемые сервисы на первом этапе
|
||
MVP:
|
||
Telegram;
|
||
ntfy;
|
||
generic webhook;
|
||
локальное Obsidian notice-уведомление.
|
||
Позже можно добавить:
|
||
Discord webhook;
|
||
Slack webhook;
|
||
Gotify;
|
||
Pushover;
|
||
Email/SMTP;
|
||
Matrix;
|
||
Signal через bridge;
|
||
Home Assistant webhook.
|
||
|
||
Шаблоны настроек
|
||
В настройках плагина сделать раздел: Notification Templates.
|
||
Пример шаблона для Telegram:
|
||
{
|
||
"id": "telegram-default",
|
||
"provider": "telegram",
|
||
"name": "Telegram Bot",
|
||
"config": {
|
||
"botToken": "123456:ABCDEF...",
|
||
"chatId": "123456789",
|
||
"parseMode": "Markdown"
|
||
},
|
||
"messageTemplate": "*{{title}}*\n\n{{message}}\n\nSource: {{file}}"
|
||
}
|
||
Пример для ntfy:
|
||
{
|
||
"id": "ntfy-default",
|
||
"provider": "ntfy",
|
||
"name": "ntfy.sh topic",
|
||
"config": {
|
||
"serverUrl": "https://ntfy.sh",
|
||
"topic": "my-obsidian-reminders",
|
||
"token": ""
|
||
},
|
||
"headers": {
|
||
"Priority": "{{priority}}",
|
||
"Tags": "calendar,obsidian"
|
||
},
|
||
"messageTemplate": "{{title}}\n{{message}}\n{{file}}"
|
||
}
|
||
Пример для self-hosted ntfy:
|
||
{
|
||
"id": "ntfy-self-hosted",
|
||
"provider": "ntfy",
|
||
"name": "Self-hosted ntfy",
|
||
"config": {
|
||
"serverUrl": "https://notify.example.com",
|
||
"topic": "personal",
|
||
"token": "tk_xxxxxxxxx"
|
||
}
|
||
}
|
||
Пример для webhook:
|
||
{
|
||
"id": "webhook-default",
|
||
"provider": "webhook",
|
||
"name": "Generic Webhook",
|
||
"config": {
|
||
"url": "https://example.com/reminder",
|
||
"method": "POST",
|
||
"headers": {
|
||
"Authorization": "Bearer YOUR_TOKEN",
|
||
"Content-Type": "application/json"
|
||
},
|
||
"body": {
|
||
"title": "{{title}}",
|
||
"message": "{{message}}",
|
||
"file": "{{file}}",
|
||
"time": "{{time}}"
|
||
}
|
||
}
|
||
}
|
||
|
||
**
|
||
|
||
|
||
|
||
|
||
|
||
Переподключение /5
|
||
|
||
|
||
|
||
|
||
|
||
|
||
План создания Obsidian-плагина
|
||
Определить цель плагина
|
||
Плагин для Obsidian должен позволять создавать напоминания из заметок и отправлять уведомления во внешние сервисы:
|
||
Telegram
|
||
ntfy
|
||
Discord webhook
|
||
Slack webhook
|
||
Email через SMTP или внешний API
|
||
Webhook для любых кастомных сервисов
|
||
Рабочее название: Obsidian Reminders Notifier.
|
||
Основные функции
|
||
Создание напоминаний
|
||
Поддержать несколько способов задания напоминаний:
|
||
- [ ] Позвонить врачу @remind(2026-07-01 10:00)
|
||
---
|
||
reminder:
|
||
at: 2026-07-01 10:00
|
||
title: Позвонить врачу
|
||
notify:
|
||
- telegram
|
||
- ntfy
|
||
---
|
||
> [!reminder]
|
||
> date: 2026-07-01 10:00
|
||
> message: Проверить отчет
|
||
Также можно добавить команду через Command Palette:
|
||
Create reminder
|
||
Create reminder from selected text
|
||
Show upcoming reminders
|
||
Test notification service
|
||
Хранилище напоминаний
|
||
На первом этапе лучше хранить напоминания в JSON-файле внутри .obsidian/plugins/plugin-name/data.json.
|
||
Пример структуры:
|
||
{
|
||
"reminders": [
|
||
{
|
||
"id": "rem_001",
|
||
"notePath": "Tasks/Health.md",
|
||
"line": 12,
|
||
"title": "Позвонить врачу",
|
||
"message": "Позвонить врачу",
|
||
"scheduledAt": "2026-07-01T10:00:00+08:00",
|
||
"services": ["telegram", "ntfy"],
|
||
"status": "pending",
|
||
"createdAt": "2026-06-27T12:00:00+08:00"
|
||
}
|
||
]
|
||
}
|
||
Статусы:
|
||
pending
|
||
sent
|
||
failed
|
||
snoozed
|
||
cancelled
|
||
Парсер напоминаний в заметках
|
||
Сделать модуль, который сканирует markdown-файлы и ищет напоминания.
|
||
Поддерживаемые форматы:
|
||
@remind(2026-07-01 10:00)
|
||
@remind(tomorrow 09:00)
|
||
@remind(+2h)
|
||
@remind(next monday 14:30)
|
||
Для начала можно реализовать только ISO/простые даты, а позже добавить natural language parsing.
|
||
Планировщик
|
||
Плагин должен периодически проверять ближайшие напоминания.
|
||
Логика:
|
||
при запуске Obsidian загрузить список напоминаний;
|
||
каждые 30-60 секунд проверять, есть ли просроченные pending;
|
||
отправить уведомление в выбранные сервисы;
|
||
записать результат отправки;
|
||
при ошибке повторить через заданный интервал.
|
||
Важно: Obsidian не всегда открыт. Поэтому стоит явно указать ограничение: напоминания отправляются, только когда Obsidian запущен. Для полноценной
|
||
|
||
|
||
|
||
|
||
Переподключение /5
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Сначала быстро сверю актуальную базу по Obsidian plugin API, чтобы план не опирался на устаревшие привычки. Потом соберу практичный roadmap с архитектурой, шаблонами сервисов и идеями расширения.
|
||
|
||
|
||
|
||
|
||
Использовано Context7 интеграциюResolve library id
|
||
|
||
|
||
|
||
|
||
Query docs
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
План плагина Obsidian Reminders + Notifications
|
||
Цель MVP
|
||
Сделать плагин, который позволяет создавать напоминания прямо из Obsidian и отправлять уведомления во внешние сервисы: Telegram, ntfy, Discord/Webhook, email через SMTP/API, Slack/Webhook и другие через универсальный HTTP Webhook.
|
||
|
||
Основные сценарии
|
||
Создать напоминание из командной палитры.
|
||
Создать напоминание из выделенного текста.
|
||
Распознать напоминание из Markdown-синтаксиса, например:- [ ] Позвонить врачу ⏰ 2026-07-01 09:30
|
||
|
||
Посмотреть список активных напоминаний.
|
||
Отложить, выполнить, удалить или повторить напоминание.
|
||
Отправить уведомление в один или несколько сервисов.
|
||
|
||
Техническая основа
|
||
Использовать стандартный Obsidian plugin scaffold: manifest.json, main.ts, styles.css.
|
||
Основной класс плагина наследует Plugin.
|
||
В onload():загрузить настройки через loadData();
|
||
зарегистрировать команды через addCommand();
|
||
добавить страницу настроек через PluginSettingTab;
|
||
запустить планировщик напоминаний.
|
||
|
||
В onunload():остановить таймеры;
|
||
сохранить состояние;
|
||
освободить ресурсы.
|
||
|
||
|
||
Структура данных
|
||
interface Reminder {
|
||
id: string;
|
||
title: string;
|
||
body?: string;
|
||
dueAt: string;
|
||
sourceFile?: string;
|
||
sourceLine?: number;
|
||
completed: boolean;
|
||
repeat?: RepeatRule;
|
||
channels: string[];
|
||
createdAt: string;
|
||
updatedAt: string;
|
||
}
|
||
Настройки:
|
||
interface PluginSettings {
|
||
defaultChannels: string[];
|
||
scanVaultOnStartup: boolean;
|
||
reminderSyntax: string;
|
||
notificationProviders: NotificationProviderConfig[];
|
||
}
|
||
|
||
Архитектура модулей
|
||
main.ts
|
||
Жизненный цикл плагина, команды, инициализация.
|
||
settings.ts
|
||
UI настроек.
|
||
reminder-store.ts
|
||
Хранение напоминаний через loadData() / saveData().
|
||
parser.ts
|
||
Поиск напоминаний в Markdown.
|
||
scheduler.ts
|
||
Проверка ближайших напоминаний.
|
||
providers/telegram.ts
|
||
providers/ntfy.ts
|
||
providers/webhook.ts
|
||
providers/discord.ts
|
||
providers/base.ts
|
||
Общий интерфейс отправки уведомлений.
|
||
|
||
Интерфейс провайдера
|
||
interface NotificationProvider {
|
||
id: string;
|
||
name: string;
|
||
send(message: NotificationMessage): Promise<void>;
|
||
test(): Promise<void>;
|
||
}
|
||
|
||
Шаблоны настроек сервисов
|
||
Telegram Bot
|
||
{
|
||
"type": "telegram",
|
||
"name": "Personal Telegram",
|
||
"enabled": true,
|
||
"botToken": "123456:ABCDEF_TOKEN",
|
||
"chatId": "123456789",
|
||
"parseMode": "Markdown"
|
||
}
|
||
ntfy
|
||
{
|
||
"type": "ntfy",
|
||
"name": "Phone ntfy",
|
||
"enabled": true,
|
||
"serverUrl": "https://ntfy.sh",
|
||
"topic": "my-obsidian-reminders",
|
||
"token": "",
|
||
"priority": "default"
|
||
}
|
||
Discord Webhook
|
||
{
|
||
"type": "discord",
|
||
"name": "Discord reminders",
|
||
"enabled": true,
|
||
"webhookUrl": "https://discord.com/api/webhooks/...",
|
||
"username": "Obsidian Reminder"
|
||
}
|
||
Generic Webhook
|
||
{
|
||
"type": "webhook",
|
||
"name": "Custom service",
|
||
"enabled": true,
|
||
"method": "POST",
|
||
"url": "https://example.com/reminder",
|
||
"headers": {
|
||
"Authorization": "Bearer TOKEN",
|
||
"Content-Type": "application/json"
|
||
},
|
||
"bodyTemplate": {
|
||
"title": "{{title}}",
|
||
"body": "{{body}}",
|
||
"dueAt": "{{dueAt}}",
|
||
"sourceFile": "{{sourceFile}}"
|
||
}
|
||
}
|
||
|
||
Настройки UI
|
||
На странице настроек стоит сделать:
|
||
список подключенных сервисов;
|
||
кнопку “Add provider”;
|
||
выбор шаблона: Telegram, ntfy, Discord, Webhook;
|
||
кнопку “Test notification”;
|
||
настройку синтаксиса напоминаний;
|
||
интервал проверки;
|
||
дефолтные каналы уведомлений;
|
||
экспорт/импорт конфигурации без секретов.
|
||
|
||
Команды Obsidian
|
||
Create reminder
|
||
Create reminder from selection
|
||
Show upcoming reminders
|
||
Scan current note for reminders
|
||
Scan vault for reminders
|
||
Send test notification
|
||
Snooze selected reminder
|
||
|
||
План разработки
|
||
Подготовить scaffold плагина.
|
||
Реализовать настройки и хранение данных.
|
||
Сделать модель напоминаний.
|
||
Добавить ручное создание напоминаний.
|
||
Реализовать scheduler.
|
||
Добавить ntfy provider как самый простой.
|
||
Добавить Telegram provider.
|
||
Добавить generic webhook provider.
|
||
Сделать парсер Markdown-напоминаний.
|
||
Добавить UI списка напоминаний.
|
||
Добавить тестовые уведомления.
|
||
Подготовить документацию и примеры конфигов.
|
||
Собрать релиз для Obsidian community plugins.
|
||
|
||
Идеи для улучшения
|
||
Поддержка повторяющихся напоминаний: каждый день, каждую неделю, по cron-like правилу.
|
||
Snooze: отложить на 5 минут, 1 час, завтра утром.
|
||
Уведомление до события: за 10 минут, за час, за день.
|
||
Интеграция с Daily Notes.
|
||
Син
|
||
|
||
|
||
|
||
|
||
Переподключение /5
|
||
|
||
|
||
|
||
|
||
|
||
|
||
План Плагина
|
||
Определить концепцию
|
||
Рабочая идея: Obsidian-плагин для напоминаний, который хранит задачи/напоминания внутри vault и отправляет уведомления во внешние сервисы: Telegram, ntfy, Discord, email/webhook и т.п.
|
||
Основные сценарии:
|
||
создать напоминание из заметки;
|
||
создать напоминание через команду Obsidian;
|
||
указать дату, время, повтор, текст и канал уведомления;
|
||
получить уведомление в выбранном сервисе;
|
||
видеть список активных/прошедших напоминаний.
|
||
|
||
Выбрать формат напоминаний
|
||
Возможные варианты:
|
||
- [ ] Позвонить врачу 🔔 2026-07-01 10:00 #reminder
|
||
Или YAML/frontmatter:
|
||
reminders:
|
||
- title: Позвонить врачу
|
||
at: 2026-07-01T10:00:00+08:00
|
||
notify: telegram
|
||
repeat: none
|
||
Или отдельный JSON-файл плагина:
|
||
{
|
||
"reminders": [
|
||
{
|
||
"id": "rem_001",
|
||
"title": "Позвонить врачу",
|
||
"time": "2026-07-01T10:00:00+08:00",
|
||
"providers": ["telegram", "ntfy"],
|
||
"status": "pending"
|
||
}
|
||
]
|
||
}
|
||
Лучший вариант для старта: хранить внутреннее состояние через Obsidian loadData() / saveData(), а затем добавить парсинг Markdown-задач.
|
||
|
||
Создать базовую структуру плагина
|
||
Минимальные файлы:
|
||
manifest.json
|
||
package.json
|
||
tsconfig.json
|
||
esbuild.config.mjs
|
||
src/main.ts
|
||
src/settings.ts
|
||
src/reminders.ts
|
||
src/providers/
|
||
telegram.ts
|
||
ntfy.ts
|
||
webhook.ts
|
||
В main.ts:
|
||
загрузка настроек;
|
||
регистрация команд через addCommand;
|
||
регистрация вкладки настроек через PluginSettingTab;
|
||
запуск планировщика напоминаний;
|
||
остановка таймеров в onunload.
|
||
|
||
Команды Obsidian
|
||
Добавить команды:
|
||
Create reminder
|
||
Create reminder from selected text
|
||
Show active reminders
|
||
Snooze reminder
|
||
Test notification provider
|
||
Sync reminders from notes
|
||
Команда из выделенного текста должна брать текст задачи как заголовок напоминания.
|
||
|
||
Настройки плагина
|
||
В настройках нужны разделы:
|
||
общие настройки;
|
||
часовой пояс;
|
||
интервал проверки напоминаний;
|
||
сервис по умолчанию;
|
||
шаблоны уведомлений;
|
||
настройки провайдеров;
|
||
кнопка тестовой отправки.
|
||
Пример структуры настроек:
|
||
interface PluginSettings {
|
||
defaultProvider: "telegram" | "ntfy" | "webhook";
|
||
checkIntervalSeconds: number;
|
||
timezone: string;
|
||
providers: {
|
||
telegram?: TelegramSettings;
|
||
ntfy?: NtfySettings;
|
||
webhook?: WebhookSettings;
|
||
};
|
||
templates: NotificationTemplate[];
|
||
}
|
||
|
||
Шаблоны настроек уведомлений
|
||
Telegram
|
||
{
|
||
"name": "Telegram",
|
||
"enabled": true,
|
||
"botToken": "123456:ABCDEF",
|
||
"chatId": "123456789",
|
||
"messageTemplate": "🔔 Напоминание: {{title}}\nВремя: {{time}}\nЗаметка: {{note}}"
|
||
}
|
||
Отправка:
|
||
POST https://api.telegram.org/bot<BOT_TOKEN>/sendMessage
|
||
ntfy
|
||
{
|
||
"name": "ntfy",
|
||
"enabled": true,
|
||
"serverUrl": "https://ntfy.sh",
|
||
"topic": "my-reminders",
|
||
"token": "",
|
||
"priority": 3,
|
||
"tags": ["bell"],
|
||
"messageTemplate": "Напоминание: {{title}}"
|
||
}
|
||
Generic Webhook
|
||
{
|
||
"name": "Custom Webhook",
|
||
"enabled": true,
|
||
"url": "https://example.com/webhook",
|
||
"method": "POST",
|
||
"headers": {
|
||
"Authorization": "Bearer YOUR_TOKEN",
|
||
"Content-Type": "application/json"
|
||
},
|
||
"bodyTemplate": {
|
||
"title": "{{title}}",
|
||
"message": "{{message}}",
|
||
"time": "{{time}}",
|
||
"note": "{{note}}"
|
||
}
|
||
}
|
||
Discord Webhook
|
||
{
|
||
"name": "Discord",
|
||
"enabled": true,
|
||
"webhookUrl": "https://discord.com/api/webhooks/...",
|
||
"messageTemplate": "🔔 **{{title}}**\n{{message}}\n{{note}}"
|
||
}
|
||
|
||
Архитектура провайдеров
|
||
Сделать общий интерфейс:
|
||
interface NotificationProvider {
|
||
id: string;
|
||
name: string;
|
||
send(reminder: Reminder, settings: unknown): Promise<void>;
|
||
test(settings: unknown): Promise<void>;
|
||
validate(settings: unknown): string[];
|
||
}
|
||
Тогда новые сервисы можно добавлять без переписывания ядра.
|
||
|
||
Планировщик напоминаний
|
||
Логика:
|
||
при запуске плагина загрузить все напоминания;
|
||
каждые N секунд проверять просроченные;
|
||
отправлять уведомление;
|
||
помечать как отправленное;
|
||
для повторяющихся напоминаний рассчитывать следующую дату;
|
||
хран
|
||
|
||
|
||
|
||
|
||
|
||
Переподключение /5
|
||
|
||
|
||
|
||
|
||
|
||
|
||
План создания Obsidian-плагина напоминаний
|
||
Определить MVP
|
||
Плагин должен уметь:
|
||
создавать напоминания из заметки;
|
||
хранить список активных напоминаний;
|
||
проверять наступление времени;
|
||
отправлять уведомление в выбранный сервис;
|
||
иметь настройки сервисов уведомлений;
|
||
содержать готовые шаблоны конфигураций для Telegram, ntfy и расширяемых HTTP/webhook-сервисов.
|
||
|
||
Базовая структура плагина
|
||
Стандартная структура Obsidian-плагина:
|
||
obsidian-reminders-notifier/
|
||
├─ manifest.json
|
||
├─ package.json
|
||
├─ esbuild.config.mjs
|
||
├─ tsconfig.json
|
||
├─ src/
|
||
│ ├─ main.ts
|
||
│ ├─ settings.ts
|
||
│ ├─ reminders/
|
||
│ │ ├─ reminder-store.ts
|
||
│ │ ├─ reminder-parser.ts
|
||
│ │ └─ scheduler.ts
|
||
│ ├─ providers/
|
||
│ │ ├─ notification-provider.ts
|
||
│ │ ├─ telegram-provider.ts
|
||
│ │ ├─ ntfy-provider.ts
|
||
│ │ └─ webhook-provider.ts
|
||
│ └─ templates/
|
||
│ └─ provider-presets.ts
|
||
└─ README.md
|
||
|
||
Модель данных
|
||
Напоминание:
|
||
interface Reminder {
|
||
id: string;
|
||
title: string;
|
||
body?: string;
|
||
dueAt: string;
|
||
sourceFile?: string;
|
||
sourceLine?: number;
|
||
providerIds: string[];
|
||
status: 'pending' | 'sent' | 'failed' | 'snoozed';
|
||
createdAt: string;
|
||
updatedAt: string;
|
||
}
|
||
Настройки провайдера:
|
||
interface NotificationProviderConfig {
|
||
id: string;
|
||
type: 'telegram' | 'ntfy' | 'webhook';
|
||
name: string;
|
||
enabled: boolean;
|
||
config: Record<string, string>;
|
||
}
|
||
|
||
Способы создания напоминаний
|
||
На старте лучше поддержать 3 варианта:
|
||
команда из Command Palette: Create reminder;
|
||
синтаксис прямо в заметке;
|
||
контекстное действие для выделенного текста.
|
||
Пример синтаксиса в Markdown:
|
||
- [ ] Позвонить врачу @remind(2026-07-01 09:00)
|
||
- [ ] Проверить сервер @remind(+2h) @notify(ntfy)
|
||
- [ ] Отправить отчет @remind(tomorrow 18:00) @notify(telegram,ntfy)
|
||
|
||
Планировщик
|
||
Внутри плагина нужен Scheduler, который:
|
||
при загрузке читает сохраненные напоминания через loadData();
|
||
периодически проверяет pending-напоминания;
|
||
отправляет уведомления через выбранные провайдеры;
|
||
помечает напоминание как sent или failed;
|
||
при выгрузке плагина очищает таймеры.
|
||
Для MVP хватит проверки раз в 30-60 секунд.
|
||
|
||
Провайдеры уведомлений
|
||
Общий интерфейс:
|
||
interface NotificationProvider {
|
||
type: string;
|
||
send(reminder: Reminder, config: Record<string, string>): Promise<void>;
|
||
test(config: Record<string, string>): Promise<void>;
|
||
}
|
||
Провайдеры:
|
||
Telegram: отправка через Bot API.
|
||
ntfy: отправка POST-запроса на topic.
|
||
Webhook: универсальный HTTP POST для Discord, Slack, Make, n8n, Home Assistant и подобных сервисов.
|
||
|
||
Шаблоны настроек
|
||
В настройках плагина сделать кнопку Add from template.
|
||
Примеры шаблонов:
|
||
Telegram
|
||
{
|
||
"type": "telegram",
|
||
"name": "Telegram Bot",
|
||
"config": {
|
||
"botToken": "123456:ABCDEF...",
|
||
"chatId": "123456789"
|
||
}
|
||
}
|
||
ntfy
|
||
{
|
||
"type": "ntfy",
|
||
"name": "ntfy.sh",
|
||
"config": {
|
||
"serverUrl": "https://ntfy.sh",
|
||
"topic": "my-obsidian-reminders",
|
||
"token": ""
|
||
}
|
||
}
|
||
Self-hosted ntfy
|
||
{
|
||
"type": "ntfy",
|
||
"name": "Self-hosted ntfy",
|
||
"config": {
|
||
"serverUrl": "https://ntfy.example.com",
|
||
"topic": "reminders",
|
||
"token": "tk_xxxxx"
|
||
}
|
||
}
|
||
Generic Webhook
|
||
{
|
||
"type": "webhook",
|
||
"name": "Generic Webhook",
|
||
"config": {
|
||
"url": "https://example.com/webhook",
|
||
"method": "POST",
|
||
"headers": "{\"Content-Type\":\"application/json\"}",
|
||
"bodyTemplate": "{\"title\":\"{{title}}\",\"body\":\"{{body}}\",\"dueAt\":\"{{dueAt}}\"}"
|
||
}
|
||
}
|
||
|
||
Настройки UI
|
||
В PluginSettingTab добавить:
|
||
список провайдеров;
|
||
включение/отключение каждого сервиса;
|
||
кнопку тестового уведомления;
|
||
импорт шаблона;
|
||
интервал проверки;
|
||
поведение после отправки: оставить, удалить, отметить выполненным;
|
||
timezone/формат даты;
|
||
дефолтный провайдер.
|
||
|
||
Команды Obsidian
|
||
Добавить команды:
|
||
Create reminder;
|
||
Show active reminders;
|
||
Snooze reminder;
|
||
Test notification providers;
|
||
Scan current note for reminders;
|
||
Scan vault for reminders.
|
||
|
||
Безопасность
|
||
|
||
Важно:
|
||
не логировать токены;
|
||
маскировать секреты в UI;
|
||
хранить настройки только локально;
|
||
предупреждать пользователя, что Telegram bot token и webhook URL являются чувствительными данными;
|
||
для webhook ограничить методы на POST/PUT, если не нужен полный контроль.
|
||
Тестирование
|
||
Проверить:
|
||
парсинг разных форматов дат;
|
||
отправку в Telegram;
|
||
отправку в ntfy;
|
||
работу без интернета;
|
||
повтор после ошибки;
|
||
перезапуск Obsidian;
|
||
изменение/удаление напоминаний в заметке;
|
||
поведение при неверных токенах.
|
||
**README и документа
|
||
|
||
|
||
|
||
|
||
Переподключение /5
|
||
|
||
|
||
|
||
|
||
|
||
|
||
План Создания Плагина Obsidian
|
||
Идея: плагин для напоминаний внутри Obsidian с отправкой уведомлений в Telegram, ntfy, Discord, Slack, email/webhook и другие сервисы
|
||
|
||
|
||
|
||
|
||
Переподключение /5
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Ниже план создания Obsidian-плагина для напоминаний с отправкой уведомлений в Telegram, ntfy и другие сервисы.
|
||
Цель Плагина
|
||
Плагин для Obsidian, который позволяет создавать напоминания прямо из заметок, хранить их в vault/settings и отправлять уведомления через выбранные каналы:
|
||
Telegram Bot
|
||
ntfy
|
||
Webhook
|
||
Discord
|
||
Slack
|
||
Email через SMTP/API, опционально
|
||
локальные уведомления Obsidian
|
||
Рабочее название: Obsidian Reminder Notifier.
|
||
Основной Сценарий
|
||
Пользователь пишет в заметке:
|
||
- [ ] Позвонить врачу 🔔 2026-07-01 10:00 #reminder
|
||
или через команду:
|
||
/remind Завтра в 9:00 проверить бэкап
|
||
Плагин распознает напоминание, сохраняет его, в нужное время отправляет уведомление через выбранный сервис и может отметить задачу как выполненную, просроченную или отправленную.
|
||
Функции MVP
|
||
Создание напоминанийЧерез команду Obsidian: Create reminder
|
||
Через контекстное меню выделенного текста
|
||
Через синтаксис в Markdown
|
||
Через frontmatter, например:
|
||
|
||
reminder:
|
||
at: 2026-07-01 10:00
|
||
title: Проверить сервер
|
||
notify: telegram
|
||
Просмотр напоминанийОтдельная панель со списком активных напоминаний
|
||
Фильтры: сегодня, неделя, просроченные, выполненные
|
||
Переход к заметке-источнику
|
||
|
||
Отправка уведомленийTelegram
|
||
ntfy
|
||
Generic Webhook
|
||
Локальное уведомление внутри Obsidian
|
||
|
||
НастройкиВыбор часового пояса
|
||
Интервал проверки напоминаний
|
||
Канал уведомлений по умолчанию
|
||
Несколько профилей уведомлений
|
||
Тестовая отправка уведомления
|
||
Шаблоны конфигураций для сервисов
|
||
|
||
Хранение данныхНастройки через loadData() / saveData()
|
||
Напоминания можно хранить:в данных плагина
|
||
в Markdown-задачах
|
||
или гибридно: источник в Markdown, индекс в данных плагина
|
||
|
||
|
||
Архитектура
|
||
src/
|
||
main.ts
|
||
settings.ts
|
||
reminders/
|
||
ReminderParser.ts
|
||
ReminderStore.ts
|
||
ReminderScheduler.ts
|
||
ReminderView.ts
|
||
notifiers/
|
||
Notifier.ts
|
||
TelegramNotifier.ts
|
||
NtfyNotifier.ts
|
||
WebhookNotifier.ts
|
||
LocalNotifier.ts
|
||
templates/
|
||
telegram.ts
|
||
ntfy.ts
|
||
webhook.ts
|
||
utils/
|
||
dates.ts
|
||
validation.ts
|
||
Ключевые Компоненты
|
||
ReminderParser
|
||
Ищет напоминания в Markdown
|
||
Поддерживает даты:2026-07-01 10:00
|
||
tomorrow 9:00
|
||
через 2 часа
|
||
каждый понедельник 09:00, в будущем
|
||
|
||
ReminderStore
|
||
Хранит индекс напоминаний
|
||
Связывает напоминание с файлом и строкой
|
||
Отслеживает статусы: pending, sent, failed, done, `
|
||
|
||
|
||
|
||
|
||
Переподключение /5
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Работал на протяжении 4m 15s
|
||
|
||
|
||
|
||
|
||
Ниже план создания Obsidian-плагина для напоминаний с отправкой уведомлений в Telegram, ntfy и другие сервисы.
|
||
Цель Плагина
|
||
Плагин для Obsidian, который позволяет создавать напоминания из заметок, командной палитры или настроек, а в нужное время отправляет уведомления через выбранные каналы: Telegram, ntfy, webhooks, email-провайдеры или другие интеграции.
|
||
Рабочее название: Obsidian Reminder Notifier.
|
||
Основные Возможности
|
||
Создание напоминаний:
|
||
через команду Obsidian: Create reminder;
|
||
из выделенного текста;
|
||
из строки в заметке, например:- [ ] Позвонить врачу @remind(2026-07-01 10:00)
|
||
|
||
через frontmatter:reminder:
|
||
at: 2026-07-01T10:00:00+08:00
|
||
title: Позвонить врачу
|
||
notify: telegram
|
||
|
||
|
||
Отправка уведомлений:
|
||
Telegram Bot API;
|
||
ntfy;
|
||
generic webhook;
|
||
Discord webhook;
|
||
Slack webhook;
|
||
Gotify;
|
||
Pushover;
|
||
Apprise как универсальный backend, если захочется поддержать много сервисов через один формат.
|
||
|
||
Управление напоминаниями:
|
||
список активных напоминаний;
|
||
отложить: 5 мин, 15 мин, 1 час, завтра;
|
||
отметить выполненным;
|
||
открыть связанную заметку;
|
||
повторяющиеся напоминания: daily, weekly, monthly, custom cron-like.
|
||
|
||
Шаблоны настроек:
|
||
встроенные примеры конфигурации для каждого сервиса;
|
||
кнопка “создать из шаблона”;
|
||
проверка подключения;
|
||
подсказки, какие поля обязательны.
|
||
|
||
Локальное хранение:
|
||
настройки через Obsidian loadData() / saveData();
|
||
напоминания можно хранить либо в data.json, либо прямо в markdown-заметках;
|
||
лучше поддержать оба режима: “из заметок” и “локальная база плагина”.
|
||
|
||
Архитектура
|
||
src/
|
||
main.ts
|
||
settings/
|
||
SettingsTab.ts
|
||
templates.ts
|
||
reminders/
|
||
ReminderParser.ts
|
||
ReminderStore.ts
|
||
ReminderScheduler.ts
|
||
ReminderModal.ts
|
||
ReminderListView.ts
|
||
notifiers/
|
||
Notifier.ts
|
||
TelegramNotifier.ts
|
||
NtfyNotifier.ts
|
||
WebhookNotifier.ts
|
||
DiscordNotifier.ts
|
||
GotifyNotifier.ts
|
||
utils/
|
||
date.ts
|
||
logger.ts
|
||
validation.ts
|
||
manifest.json
|
||
styles.css
|
||
Ключевые Модули
|
||
ReminderParser
|
||
ищет напоминания в markdown;
|
||
поддерживает remind(...), frontmatter и, возможно, Dataview-подобный синтаксис;
|
||
нормализует дату, текст, ссылку на файл, статус.
|
||
ReminderScheduler
|
||
при запуске плагина загружает будущие напоминания;
|
||
ставит таймеры через setTimeout;
|
||
периодически пересканирует vault;
|
||
учитывает, что Obsidian может быть закрыт: просроченные напоминания отправляются при следующем запуске.
|
||
ReminderStore
|
||
хранит созданные через UI напоминания;
|
||
синхронизирует состояние: выполнено, отложено, отправлено;
|
||
предотвращает повторную отправку одного и того же события.
|
||
Notifier
|
||
interface Notifier {
|
||
id: string;
|
||
name: string;
|
||
send(payload: NotificationPayload): Promise<void>;
|
||
test(config: unknown): Promise<void>;
|
||
}
|
||
SettingsTab
|
||
список каналов уведомлений;
|
||
добавление нового канала из шаблона;
|
||
включение/отключение каналов;
|
||
тестовая отправка;
|
||
выбор канала по умолчанию.
|
||
Примеры Шаблонов Настроек
|
||
Telegram:
|
||
{
|
||
"type": "telegram",
|
||
"name": "Telegram personal",
|
||
"enabled": true,
|
||
"botToken": "123456:ABCDEF_your_bot_token",
|
||
"chatId": "123456789",
|
||
"parseMode": "Markdown"
|
||
}
|
||
ntfy:
|
||
{
|
||
"type": "ntfy",
|
||
"name": "ntfy phone",
|
||
"enabled": true,
|
||
"serverUrl": "https://ntfy.sh",
|
||
"topic": "my-obsidian-reminders",
|
||
"token": "",
|
||
"priority": 3,
|
||
"tags": ["bell"]
|
||
}
|
||
Generic webhook:
|
||
{
|
||
"type": "webhook",
|
||
"name": "Custom webhook",
|
||
"enabled": true,
|
||
"url": "https://example.com/reminder",
|
||
"method": "POST",
|
||
"headers": {
|
||
"Authorization": "Bearer YOUR_TOKEN"
|
||
},
|
||
"bodyTemplate": {
|
||
"title": "{{title}}",
|
||
"message": "{{message}}",
|
||
"note": "{{notePath}}",
|
||
"time": "{{time}}"
|
||
}
|
||
}
|
||
Discord webhook:
|
||
{
|
||
"type": "discord",
|
||
"name": "Discord reminders",
|
||
"enabled": true,
|
||
"webhookUrl": "https://discord.com/api/webhooks/...",
|
||
"username": "Obsidian Reminder"
|
||
}
|
||
Gotify:
|
||
{
|
||
"type": "gotify",
|
||
"name": "Gotify server",
|
||
"enabled": true,
|
||
"serverUrl": "https://gotify.example.com",
|
||
"appToken": "YOUR_APP_TOKEN",
|
||
"priority": 5
|
||
} |