Telegram bot for turning messages, links, and files into Obsidian notes through an OpenAI-compatible API.
- Private single-user access
- URL article extraction
- Existing note lookup from the Obsidian vault
- Attachment parsing for
txt,md,json,yaml,xml,csv,html, anddocx - Automatic Markdown note save/update in the vault
- Local and Docker-based run modes
- Python 3.11+
uv- Telegram bot token
- OpenAI-compatible API endpoint
- Obsidian vault path
Create the environment file:
cp .env.example .envRequired variables:
TELEGRAM_BOT_TOKENTELEGRAM_USER_IDOPENAI_BASE_URLOPENAI_MODELOBSIDIAN_VAULT_PATH
Example local API endpoint:
OPENAI_BASE_URL=http://127.0.0.1:8000/v1make sync
make runDevelopment mode:
make devExample Docker variables:
OPENAI_BASE_URL=http://host.docker.internal:8000/v1
HOST_OBSIDIAN_PATH=/Users/<user>/Documents/ObsidianVault/Inbox
CONTAINER_OBSIDIAN_PATH=/app/vault
UID=501
GID=20Build and start:
make docker-config
make docker-build
make docker-up
make docker-logsStop:
make docker-down| Variable | Purpose |
|---|---|
TELEGRAM_BOT_TOKEN |
Telegram bot token |
TELEGRAM_USER_ID |
Allowed Telegram user ID |
OPENAI_API_KEY |
API key for the LLM endpoint |
OPENAI_BASE_URL |
Base URL for the LLM API |
OPENAI_MODEL |
Model name |
OBSIDIAN_VAULT_PATH |
Vault path for local runs |
HOST_OBSIDIAN_PATH |
Host vault path for Docker |
CONTAINER_OBSIDIAN_PATH |
Vault path inside the container |
HISTORY_LIMIT |
Number of history messages kept in memory |
ARTICLE_TEXT_LIMIT |
Maximum extracted article size |
ATTACHMENT_TEXT_LIMIT |
Maximum extracted attachment size |
TELEGRAM_FILE_MAX_SIZE |
Maximum downloadable Telegram file size in bytes |
URL_EXTRACT_LIMIT |
Maximum number of URLs processed from one message |
OBSIDIAN_PROMPT_NOTES_LIMIT |
Maximum number of indexed notes included in the prompt |
OBSIDIAN_NOTE_CONTENT_LIMIT |
Maximum content length when loading an existing note |