Un bot Telegram per catturare idee nel vault Obsidian

Un bot Telegram per catturare idee nel vault Obsidian

Il problema

Chi usa Obsidian come "second brain" conosce bene la frustrazione: sei in giro, ti viene un'idea, la vuoi fissare. Apri il telefono, cerchi l'app, aspetti il sync, trovi la nota giusta… e nel frattempo l'idea è già sfumata. Oppure mandi un vocale a te stesso su Telegram con l'intenzione di trascriverlo "dopo". Per me quel "dopo" stava diventando una seccatura.

Volevo una cosa semplice: mandare un messaggio a un bot Telegram e ritrovarlo nella daily note di Obsidian, già trascritto se era un vocale, già allegato se era una foto o un documento. Senza passaggi intermedi, senza app da aprire, senza servizi cloud per la trascrizione.

Perché lo ho fatto

Prima di scrivere codice, ho cercato se qualcuno avesse già risolto il problema. Ho trovato plugin di Obsidian, integrazioni con Zapier, workflow IFTTT; soluzioni che però avevano tutte lo stesso limite: richiedevano che Obsidian fosse aperto da qualche parte, su un desktop o su un telefono. Nessun progetto funzionava in modo completamente headless, indipendente da app in esecuzione.

Serviva un tool veloce per risolvere un piccolo pain quotidiano: catturare un'idea dal telefono e ritrovarla nel vault, punto. Non un framework, non una piattaforma; un bot che fa una cosa sola e la fa bene. Così l'ho costruito.

La soluzione: obsidian-telegram-daily-bot

Ho costruito un bot Telegram in Python che riceve quattro tipi di contenuto: testo, messaggi vocali, foto e documenti (PDF inclusi). Ogni messaggio viene accodato alla daily note del vault Obsidian. I vocali vengono trascritti localmente prima di essere salvati.

Il tutto gira in un singolo container Docker su un Raspberry Pi, sempre acceso, sempre in ascolto. Obsidian non deve essere aperto da nessuna parte: il bot scrive direttamente nei file Markdown e la sincronizzazione con Obsidian Sync avviene in modo continuo e autonomo.

Trascrizione locale con Whisper

Per la trascrizione dei vocali uso whisper.cpp, una versione in C/C++ del modello Whisper di OpenAI, ottimizzata per girare su CPU. In pratica è un modello di speech-to-text: riceve un file audio e restituisce il testo corrispondente. La differenza rispetto a servizi come Google Speech-to-Text o AWS Transcribe è che tutto avviene in locale, sulla macchina. Nessun audio viene inviato a server esterni.

Questa scelta ha due vantaggi concreti. Il primo è la privacy: le mie note vocali restano sul mio hardware. Il secondo è l'autonomia: non dipendo da API a pagamento e non ho limiti di utilizzo. Il compromesso è la velocità di trascrizione, che su un Raspberry Pi non è fulminea, ma per catturare appunti al volo è più che sufficiente.

Perché "headless"

Il concetto chiave di questo progetto è che Obsidian non deve essere aperto da nessuna parte. Il termine "headless" indica proprio questo: un software che funziona senza interfaccia grafica. Il bot e il processo di sync girano come servizi su un Raspberry Pi, dentro un container Docker gestito da Supervisor. Il vault è una cartella di file Markdown sul disco, e il sync con Obsidian Sync avviene tramite la CLI ufficiale (ob sync --continuous).

Questo significa che il sistema funziona 24/7 senza bisogno che un computer desktop sia acceso con Obsidian in esecuzione. Il Raspberry Pi fa da ponte silenzioso tra Telegram e il vault.

Come funziona

Il flusso è lineare. L'utente manda un messaggio al bot Telegram. Il bot lo riceve, determina il tipo di contenuto e agisce di conseguenza:

Testo: viene accodato direttamente alla daily note.

Vocale: il file .ogg viene scaricato, convertito e passato a whisper-cli per la trascrizione. Il testo risultante, insieme all'embed del file audio, finisce nella daily note. Viene anche generato un riassunto (locale o tramite Gemini, a scelta).

Foto: l'immagine viene compressa automaticamente perché Obsidian Sync non sincronizza file superiori a 5 MB. Dimensione massima e qualità JPEG sono configurabili. L'immagine compressa viene salvata nella cartella media del vault e linkata nella daily note.

Documento: salvato nella cartella media e linkato.

In parallelo, il processo ob sync --continuous mantiene il vault sincronizzato con Obsidian Sync. Quando apro Obsidian su qualsiasi altro dispositivo, trovo già tutto al suo posto.

Il codice è su GitHub

La repository è pubblica e rilasciata sotto licenza MIT: github.com/giacomoleonzi/obsidian-telegram-daily-bot.

Dentro troverete il Dockerfile, il docker-compose, il bot Python, la configurazione di Supervisor e un README dettagliato per il setup. Il progetto è pensato per Raspberry Pi (ARM64) ma funziona su qualsiasi macchina con Docker.

Prossimi passi e contatti

Il bot fa quello che deve, ma ci sono margini di miglioramento: supporto multi-utente con whitelist, possibilità di organizzare i contenuti in note diverse dalla daily, integrazione con altri provider di trascrizione. Se usate Obsidian e avete lo stesso prurito di catturare idee al volo, provate il progetto e fatemi sapere come va.

Se avete domande, volete adattarlo al vostro setup o vi viene in mente un caso d'uso diverso, contattateci. Siamo sempre aperti a scambi di idee e collaborazioni.


Repository: github.com/giacomoleonzi/obsidian-telegram-daily-bot

Foto: Mariia Shalabaieva su unspalsh

Kiwifarm srl ‐ Via Agostino da Montefeltro, 2 · 10134 Torino (TO) ‐ P. IVA: 03535510048 ‐ Capitale Sociale: 30.100 € i.v. Privacy Policy Cookie Policy