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
|
|||
|
|
}
|