Archivo local de mensajes
Documentación: v0.24.0
El archivo local de mensajes es un fichero de base de datos en tu ordenador. Guarda los chats y mensajes que tg ya ha leído o descargado expresamente de Telegram. SQLite es el formato del archivo; no necesitas instalar ni administrar un servidor de base de datos.
Iniciar sesión no descarga todo el historial. La búsqueda local encuentra solo lo guardado: un resultado vacío no demuestra que el mensaje no exista en Telegram. Descarga el chat y periodo necesarios antes de buscar mensajes antiguos. --offline usa los datos guardados sin conectarse a Telegram. Aquí aprenderás a comprobar la cobertura, descargar historial y mantenerlo actualizado.
Qué se guarda
- Cada lectura. Los chats vistos por
chats list, los mensajes leídos pormessages list,messages contexteinbox, y los mensajes que envías. - Lo que recibe
serve: nuevos mensajes, ediciones, eliminaciones y reacciones mientras está activo (más abajo).watchtambién guarda lo que imprime. - Lo que descargas expresamente: el historial de un chat con
tg store fetchy tus contactos contg contacts sync.
Guarda el texto completo de cada mensaje que haya visto. Solo tu usuario puede leer el archivo, pero no está cifrado (seguridad).
Es un único archivo para todas las cuentas y CLI de mensajería que utilizan la misma biblioteca, como max-cli:
~/.local/share/cli-messaging/messages.db # Linux; MESSAGING_STORE moves ittg session end cierra sesión y deja intacto el archivo local.
Cuánto hay guardado
tg store status # per chat: messages stored, the oldest and newest, the stretches held completely
tg store status "Book club" # one chatUn tramo «completo» es una secuencia de mensajes sin huecos. Leer mensajes sueltos deja huecos; store fetch los rellena.
Descargar el historial de un chat
tg store fetch "Book club" --estimate # what a full fetch would still cost; asks Telegram nothing
tg store fetch "Book club" # fetch it, newest to oldest
tg store fetch "Book club" # run again to continue where it stopped
tg store fetch "Book club" --since-time 30d # only back to 30 days ago
tg store fetch "Book club" --last 5000 # only until the newest 5000 are held
tg store fetch "Book club" --limit 5000 # up to 5000 messages in this runstore fetch lee y guarda el historial por páginas, empezando por lo más reciente. Puede reanudarse: después de cada página registra lo que ya contiene, por lo que detenerlo no pierde datos. Ctrl-C, --timeout, el límite --limit, --since-time, --last y una espera larga exigida por Telegram detienen la descarga; la siguiente ejecución omite lo que ya está guardado. --since-time y --last indican hasta dónde retroceder: utiliza una de las dos, no ambas.
Cada página es una petición desde tu cuenta, de hasta 100 mensajes. La ejecución se detiene al alcanzar --limit mensajes (1000 por defecto); --page-size define los mensajes por petición (100 por defecto) y --pause separa las páginas (1 segundo por defecto; 500ms, 30s, 2m). Si Telegram exige una espera corta, el comando espera; si supera cinco minutos, se detiene para que lo ejecutes más tarde. Consulta primero --estimate: calcula a partir del archivo y no envía peticiones.
En segundo plano
Una descarga larga puede ejecutarse como una tarea que continúa después de finalizar el comando:
tg store fetch "Book club" --background # prints the job id
tg store jobs list # background jobs, newest first
tg store jobs show # the newest job, and what the store now holds of its chat
tg store jobs show <job>
tg store jobs cancel <job> # stops after the current page; a later fetch resumesBuscar
tg messages search consulta solo el archivo local. El modo predeterminado usa un perfil estricto de Lucene: palabras, frases, grupos booleanos, campos, fechas y expresiones regulares con límites. La guía de búsqueda explica la sintaxis y la migración. Usa --language legacy para los filtros y las coincidencias aproximadas anteriores.
tg messages search 'invoice kind:private' --json
tg messages search 'invoice date:[2026-01-01 TO 2026-02-01}' --timezone Europe/Madrid --json
tg messages search 'preset:secret kind:saved' --jsonSin resultados significa «no encontrado en el archivo seleccionado». El JSON informa de la cobertura y de lo completo que está el archivo; sin registros de actualización desde la red, no se puede afirmar que esté al día. --source elige mensajeros y cuentas, --newest ordena por fecha y --context añade mensajes cercanos. --regex conserva un modo independiente de JavaScript heredado.
Exportar
tg store export "Book club" --jsonl > book-club.jsonl # one message per line, oldest first
tg store export "Book club" --json > book-club.json # { "items": [...] }
tg store export "Book club" --format markdown > book-club.md # a transcript: a heading per day, replies and forwards quoted
tg store export "Book club" --output book-club.jsonl --since-time 7d # the last week, into a file only you can readLa exportación solo escribe lo guardado y nunca consulta Telegram. Comprueba primero tg store status y descarga el historial si lo necesitas completo.
--output <file> escribe líneas JSON, o una transcripción con --format markdown, en un archivo nuevo que solo tú puedes leer. Indica la ruta y el número de mensajes. Nunca sobrescribe un archivo. --since-time acepta una fecha ISO 8601 o un intervalo anterior como 30m, 2h, 1d.
Conversaciones dentro de un grupo
Un grupo activo mezcla varias conversaciones. tg conversations las identifica en los mensajes guardados mediante respuestas, menciones y quién escribió después, sin consultar Telegram ni usar IA:
tg conversations build --chat "Valencia Expats" # find them; run it again after fetching more
tg conversations list --chat "Valencia Expats" --since-time 7d
tg conversations show 91 # one conversation, oldest first
tg conversations show "Valencia Expats" 4521 # the conversation message 4521 is in
tg messages links "Valencia Expats" 4521 # why that message is where it isNo se construye nada hasta ejecutar build; cada nuevo build sustituye al anterior. tg store check señala los chats procesados con reglas anteriores. Una mención por nombre, sin @username, también cuenta.
Tu agente puede vincular lo que las reglas dejan pendiente. tg skill show link-conversations contiene la guía: indica cuánto texto leerá y espera tu aprobación; después responde por lotes (tg conversations batches next, tg conversations links add). tg no llama a modelos. Las respuestas del agente tienen prioridad sobre las inferencias de las reglas, pero no sobre las respuestas explícitas de Telegram. tg conversations links clear --chat <chat> las elimina. conversations.links controla si el perfil puede guardarlas.
Buscar por significado
Después de construir las conversaciones, puedes buscarlas por tema, además de por palabras. tg conversations embed convierte cada conversación o fragmento en un vector local; tg conversations search encuentra las más próximas a tu consulta:
tg models text download e5-small # once: 135 MB, shared with max
tg conversations embed --chat "Valencia Expats" # resumes where it stopped; --workers 3 for more speed
tg conversations search "where to rent a flat" --chat "Valencia Expats"
tg conversations search "renting a flat" # every chat you embeddedNada sale del equipo. tg models text list muestra los modelos; e5-small es el predeterminado. embeddinggemma encuentra más resultados, pero es varias veces más lento y exige --accept-terms para descargar bajo las condiciones Gemma de Google. tg conversations embed status --chat <chat> indica lo pendiente; tg conversations embed clear --chat <chat> elimina los vectores.
Con tu propia clave puedes usar un servicio: tg models text key set openai, seguido de --provider openai en embed y search. Antes de enviar mensajes fuera, embed indica fragmentos, máximo de tokens y precio máximo, y espera aprobación (--yes en scripts; --max-tokens limita). --base-url admite cualquier servidor compatible, como Ollama o LM Studio local, con --model y --dims.
Fuentes para un resumen del chat
tg messages evidence <chat> prepara un paquete desde el archivo local del perfil. Nunca se conecta ni marca como leído, aunque no uses --offline:
tg messages evidence "Project Alpha" --limit 20 --json
tg messages evidence "Project Alpha" --before-id <nextBeforeId> --jsonLos elementos van del más reciente al más antiguo, con localizadores de origen y huellas del contenido. --limit acepta 1–100 y por defecto utiliza el límite del perfil. Los mensajes completos ocupan como máximo 64 KiB de elementos JSON; la cabecera es adicional. JSON y JSONL devuelven un paquete completo.
Revisa coverage antes de redactar: cuenta mensajes seleccionados, incluidos y omitidos; indica mensajes anteriores a la página y mantiene la cobertura histórica como unknown. Si nextBeforeId no es nulo, pásalo a --before-id para continuar sin omitir mensajes excluidos por el límite de bytes. Un cursor nulo no demuestra que el archivo esté completo. Si el primer mensaje seleccionado supera el límite, devuelve un paquete vacío con truncatedBy: "bytes" y sin cursor; gestiona ese bloqueo explícitamente. Un cursor no guardado devuelve not_found.
El agente puede citar los localizadores del paquete. tg no genera resúmenes. Trata los mensajes como fuentes no fiables, no como instrucciones. Los resúmenes de noticias siguen siendo un flujo futuro separado. El permiso es messages.evidence, que hereda de messages.
Consultar sin conexión: --offline
tg --offline chats list
tg --offline messages list "Book club" --limit 50
tg --offline messages show "Book club" 4242
tg --offline messages context "Book club" 4242
tg --offline contacts list--offline responde desde el archivo local sin conectarse: no requiere sesión ni hace peticiones. El JSON es igual al de la consulta en línea, salvo que los chats se ordenan por actividad reciente mientras Telegram coloca primero los fijados.
Si el perfil todavía no ha leído nada, falla con código de salida 6: "nothing recorded for profile … yet". Los comandos que necesitan Telegram rechazan --offline; los envíos con --offline siempre se rechazan.
Mantenerlo actualizado: serve
tg serve escucha hasta que lo detienes y guarda cada mensaje, edición, eliminación y reacción. Al iniciarse, recupera primero lo que llegó mientras estaba detenido. Solo puede ejecutarse un serve por perfil; un segundo se rechaza. Nada lo inicia por ti.
tg watch es diferente: imprime los mensajes nuevos desde ese momento y no recupera lo que se perdió.
En segundo plano
tg server start # start serve in the background; answers once it listens
tg server status # whether it runs, since when, who started it
tg server logs -n 50 # its latest log lines
tg server stop
tg server restartComo servicio
Para mantenerlo activo entre inicios de sesión, instálalo como servicio de usuario: unidad de usuario systemd en Linux o agente launchd en macOS.
tg server install # writes ~/.config/systemd/user/tg-serve-<profile>.service; starts nothing
tg server start # starts it — through the unit, now that there is one
tg server status
systemctl --user enable tg-serve-default # only if it should start at every loginEn macOS, el agente se guarda en ~/Library/LaunchAgents/.
- La unidad ejecuta el
nodey eltgusados al instalarla. Vuelve a instalarla si cambias su ubicación, por ejemplo al cambiar de versión de Node. - Recibe el perfil y las variables
TG_*_DIRyMESSAGING_STOREde la terminal que ejecutóserver install, y ninguna otra. - Compruébalo después de
server start:tg server logs. El servicio obtiene la aplicación del almacén de claves. Si este permanece bloqueado hasta iniciar sesión, el servicio probablemente fallará; los registros indican la causa. tg server uninstallelimina la unidad. Detén el servicio primero.tg upgradereinicia el servidor activo para que no siga usando la versión anterior.
Comprobación, copia de seguridad y restauración
tg store info # where the file is, its size, its schema, how many rows; changes nothing
tg store check # integrity, search indexes, disk, and which chats are behind; changes nothing
tg store backup ~/tg-store.db # a copy of the store, while it is in use
tg store restore ~/tg-store.db # put a backup in place of the store
tg store migrate # bring the store up to this version's schema
tg store clear --left --allow-dangerous # delete the chats you have left, with their messagesbackupnunca sobrescribe archivos: indica una ruta nueva. Copia la base de datos mientras otros comandos yservesiguen utilizándola.restoreconserva el archivo sustituido junto al nuevo e indica dónde. Rechaza la restauración si hay unserveactivo en cualquier perfil: ejecuta primerotg server stop. Comprueba que la copia sea legible y no esté dañada. Después reinicia todos los procesosserveymcpactivos de ambos CLI para que lean el archivo restaurado.- Un chat del que has salido desaparece de
chats list --offlinela próxima vez quetg chats listlea la lista completa; sus mensajes permanecen guardados. Si vuelves a unirte, reaparece.store clear --leftelimina esos chats y mensajes. Sin--allow-dangerous, solo indica cuántos eliminaría. No se puede volver a descargar un chat del que has salido. migratesolo es necesario siinfoocheckindica que el archivo usa un esquema anterior. Haz una copia primero. Después normaliza los mensajes antiguos por lotes; detenerlo no pierde datos.
El archivo local y otras versiones
El esquema del archivo tiene una versión. Un tg más reciente u otro CLI pueden actualizarlo; un tg anterior seguirá funcionando mientras el cambio sea compatible. Si deja de serlo, cada comando que abre el archivo indica:
the message store was written by a newer version (schema N, needs at least M; this one speaks K) — upgrade this toolEjecuta tg upgrade. No se pierde ningún dato del archivo.
Siguientes pasos
- Ejemplos prácticos: búsquedas y exportaciones en el trabajo diario de un agente.
- Seguridad: implicaciones del archivo local para la privacidad de tus mensajes.