Календарь для себя

Свой календарь для Telegram и веб-версия: self-hosted, без сторонних сервисов

Сделал для себя календарь, который работает в двух видах: Telegram-бот с мини-приложением и сайт. Данные хранятся у меня, на своём сервере. Подписок и сторонних облаков нет.

Бот

  • События с повторами и напоминаниями, несколько календарей с цветами.
  • Быстрый ввод текстом: «завтра в 15:00 стоматолог за час».
  • Задачи, подписки на ICS, импорт и экспорт.
  • Мини-приложение: месяц, неделя, день, повестка, поиск, тёмная тема.
  • Вложения к событиям. Файлы лежат в Telegram, на сервере их нет.

Сайт

  • Вход без пароля: код приходит в Telegram от бота, плюс TOTP.
  • Те же виды календаря, перетаскивание событий, печать, горячие клавиши.
  • Устанавливается на телефон как приложение. Офлайн работает: изменения копятся в очереди и уходят, когда появится сеть.
  • Журнал входов, список устройств, резервные копии базы по таймеру, автоматический откат, если обновление не запустилось.

Бот и сайт синхронизируются в обе стороны. Событие, созданное на сайте, появляется в боте, и наоборот. Если сайт недоступен больше 10 минут, бот пишет об этом в Telegram.

Как разместить: только бот (CAL_MODE=local), бот и сайт на одном VPS с автоматическим HTTPS через Caddy, или дома на Proxmox (два LXC) с публикацией через Pangolin. Установка сайта и обновления идут одним скриптом update-core.sh.

Стек: Python 3, aiogram 3, aiohttp, FastAPI, SQLite, Caddy, чистый JavaScript без сборки. Тесты: ядро 170, e2e 44, бот 74.

В комплекте два архива, подробная инструкция админа (BotFather, VPS, локально, связка бота с сайтом), инструкция пользователя и хандоф для продолжения работы в новом чате. Могу выложить ссылку на архивы, если нужно, или сократить текст до пары абзацев.

Создано в Claude на бесплатном тарифе. Пост тоже написал Claude :smiley: .
Обновлять, переделывать не буду, в архиве есть всё-исходники,промпты, руководства.
Календарь

Несколько скринов.

1 лайк