claude-logbook
Explorá todas las conversaciones de Claude Code que tenés guardadas en la máquina: como tabla en la terminal, o como una página HTML autocontenida que se abre con doble clic.
Español · English · Sin dependencias, solo biblioteca estándar.
# SESIÓN RUTA FECHA CUÁNDO MSG DUR ID
1 | Migrar el pool de conexiones a … /home/ana/api 16 ago hoy 4 9m 5d10f1ee
2 | Timeouts intermitentes en el he… /home/ana/api 16 ago hoy 2 3m 0f60f37a
3 | Reescribir el buscador con Fuse… /home/ana/web 15 ago ayer 7 18m b69c1fc2
4 | por qué tarda tanto npm ci /home/ana/web 13 ago hace 3d 1 <1m d4d2a5be
5 | sesión abierta sin mens… [vacía] /home/ana/infra 08 ago hace 1sem — <1m e0a4300e
5 sesiones · 3 proyectos · -s <nº> para leer una
⚠️ Tus transcripciones son privadas
--json y --html escriben el texto completo de tus conversaciones y de las
memorias de tus proyectos:
prompts, respuestas, rutas de archivos, nombres de ramas. El sesiones.html que
sale es una copia legible de todo lo que escribiste alguna vez en Claude Code.
No lo commitees, no lo subas, no lo pegues en un issue. El .gitignore del repo
ya excluye sesiones.html y data.json, pero el archivo lo cuidás vos.
Instalación
Necesita Python 3.9 o más nuevo. Nada más.
pipx install claude-logbook
O con pip, o desde el último commit, o directamente desde un clon:
pip install claude-logbook
pipx install git+https://github.com/ElvisClaros/claude-logbook # sin publicar
git clone https://github.com/ElvisClaros/claude-logbook && cd claude-logbook
python3 -m claude_logbook # sin instalar nada
Uso
claude-logbook # tabla de todas las sesiones
claude-logbook docker # filtra por título, ruta o rama
claude-logbook -s 3 # lee el chat nº 3 de la tabla
claude-logbook -s 5d10f1ee # lo mismo, por prefijo de UUID
claude-logbook -g "port already" # busca dentro de las conversaciones
claude-logbook -r 3 # imprime el comando para reanudarla
eval "$(claude-logbook -r 3)" # …o la reanuda directamente
claude-logbook --html --open # genera sesiones.html y lo abre
claude-logbook -m # las memorias de tus proyectos
El número es la posición de la fila en la tabla que estás viendo, así que si filtraste hay que repetir el filtro para leer esa fila:
claude-logbook docker # muestra 3 resultados
claude-logbook docker -s 2 # lee el 2º de esos tres
Opciones
| Flag | Qué hace |
|---|---|
-s, --show REF |
Muestra un chat (índice de la tabla o prefijo de UUID). |
-r, --resume REF |
Imprime cd <proyecto> && claude --resume <uuid>. |
-g, --grep TEXTO |
Deja las sesiones cuya transcripción contenga TEXTO. |
-p, --project RUTA |
Deja las sesiones cuya ruta de proyecto contenga RUTA. |
-n, --limit N |
Solo las N más recientes. |
-E, --hide-empty |
Oculta las sesiones sin mensajes. |
--no-tools |
En el chat, oculta las llamadas a herramientas. |
--no-pager |
No manda el chat a $PAGER. |
--no-color |
Salida sin color (también respeta NO_COLOR). |
--json |
Vuelca todas las sesiones en JSON por stdout. |
--html [ARCHIVO] |
Genera la página autocontenida (por defecto sesiones.html). |
--template ARCHIVO |
Usa tu propio template para --html. |
--open |
Abre en el navegador lo que haya generado --html. |
--no-cache |
Ignora el caché y re-parsea todo. |
-m, --memory |
Trabaja sobre las memorias en vez de las sesiones. |
--type TIPO |
Con -m: filtra por project, user, feedback o reference. |
--check |
Con -m: audita índices, enlaces y sesiones de origen. |
Borrar sesiones
Es irreversible y pregunta antes, salvo que pases -y:
claude-logbook --delete-empty --dry-run # qué borraría
claude-logbook --delete-empty # borra las vacías
claude-logbook -D 101 -D e0a4300e # borra sesiones puntuales
claude-logbook -p /tmp --delete-empty # solo las vacías de ese proyecto
Avisa si alguno de los archivos se escribió en los últimos cinco minutos: es muy probable que sea una sesión que Claude Code todavía tiene abierta, y que la vuelva a escribir al cerrarse.
Memoria de los proyectos
Claude Code guarda recuerdos por proyecto en
~/.claude/projects/<proyecto>/memory/: un .md por memoria, con frontmatter
YAML y cuerpo markdown, más un MEMORY.md que los indexa.
El índice es lo único que se carga en contexto al arrancar una sesión. Una
memoria que está en disco pero no figura en MEMORY.md deja de recordarse
aunque el archivo siga ahí, así que la diferencia entre ambos conviene mirarla.
-m cambia el sustantivo y reusa los mismos verbos que ya conocés:
claude-logbook -m # tabla de memorias
claude-logbook -m docker # busca en nombre, descripción y cuerpo
claude-logbook -m --type user # solo las de un tipo
claude-logbook -m -s 3 # lee la memoria nº 3
claude-logbook -m -s deadlock # lo mismo, por nombre
claude-logbook -m -p /home/u/proj # las de un proyecto
Los tipos los define Claude al escribirlas: project es trabajo en curso, user quién sos y cómo trabajás, feedback correcciones tuyas, y reference punteros a recursos externos.
Auditar
claude-logbook -m --check
Sale con código 1 si encuentra algo, y reporta:
- proyectos con memorias pero sin
MEMORY.md; - memorias que no figuran en el índice de su proyecto;
- entradas del índice que apuntan a un archivo que ya no existe;
- enlaces
[[...]]sin destino — el formato los permite, marcan algo que todavía no se escribió; - memorias cuya sesión de origen ya no está en disco: la memoria sobrevivió a la conversación que la creó.
Borrar memorias
Igual que con las sesiones: irreversible, pregunta antes salvo con -y. Además
de borrar el archivo, saca su línea de MEMORY.md para no dejar el índice
apuntando a la nada.
claude-logbook -m -D 3 --dry-run # qué borraría
claude-logbook -m -D deploy-docker # borra esa memoria
La página HTML
claude-logbook --html genera un único archivo con los datos adentro. Sin
servidor, sin red, sin paso de build: lo copiás a otra máquina y sigue andando.
- Búsqueda por título, ruta, rama o UUID, y opcionalmente dentro de las transcripciones, mostrando el fragmento que coincide debajo de la fila.
- Filtro por proyecto, orden por cualquier columna, ocultar las vacías.
- Clic en una fila para leer la conversación en un panel lateral, con cercas de código, títulos y una línea por herramienta usada.
- Botón para copiar el
cd … && claude --resume …de cualquier sesión. - Tema claro y oscuro, con un botón que recuerda cuál elegiste.
- Cada sesión tiene su propio fragmento de URL:
sesiones.html#5d10f1ee-…abre esa conversación directamente. - Teclado:
/oCtrl+Kenfoca el buscador,Esclo limpia o cierra el lector.
Las fechas son relativas a cuándo se leyeron los datos, no a tu reloj, así que "hoy" sigue queriendo decir lo que quería decir cuando generaste la página.
Cómo funciona
Claude Code guarda una conversación por archivo, en formato JSON Lines:
~/.claude/projects/<ruta-del-proyecto-codificada>/<uuid>.jsonl
(Si moviste ese directorio, respeta CLAUDE_CONFIG_DIR.)
Cada línea es un evento. claude-logbook los recorre y se queda con la
conversación: tus mensajes, las respuestas de Claude, y una línea por
herramienta usada, del estilo Bash: git status. A propósito descarta lo que
devolvieron las herramientas: son el 95 % de los bytes en disco y casi nada
del sentido.
Algunos detalles que conviene saber:
- Títulos. Claude genera uno durante la sesión (eventos
ai-title); gana el más reciente. Cuando falta, se usa lo primero que escribiste vos — y ahí se nota, porque arranca en minúscula o suena a pregunta suelta. - Sesiones vacías son las que se abrieron pero nunca recibieron un mensaje:
un
/resumecancelado, un/login. - No interactivas son
claude -pcon algo piped por stdin — típicamente ungit diffpara redactar el mensaje de commit. Se detectan como un único mensaje larguísimo sin ninguna ida y vuelta. - Rutas inferidas. Un
/resumecancelado nunca registracwd, y el nombre del directorio no se puede invertir de forma fiable (porque/y.se codifican los dos como-), así que la ruta se toma prestada de otra sesión del mismo proyecto y queda marcada. - Sidechains (transcripciones de subagentes) se saltean.
- Caché. Lo parseado se guarda en
$XDG_CACHE_HOME/claude-logbook/cache.json, indexado por tamaño y mtime. Es solo una optimización: si falta, quedó viejo o está roto, se re-parsea todo.--no-cachelo saltea por completo.
Esquema del JSON
--json imprime un objeto con dos arreglos: s son las sesiones, de la más
recientemente activa a la más vieja, y m las memorias, de la más recién
modificada a la más vieja.
{"s": [ … ], "m": [ … ]}
Las claves son de una letra porque esos mismos registros van embebidos en el HTML, donde el costo se paga una vez por registro.
Cada sesión de s:
| Clave | Qué es |
|---|---|
id |
UUID de la sesión (el nombre del archivo). |
p |
Ruta del proyecto (cwd). |
b |
Rama de git. |
t |
Título. |
ai |
true si el título lo generó Claude. |
n |
true si parece un claude -p no interactivo. |
e |
true si la sesión no tiene mensajes. |
i |
true si p se dedujo de otra sesión del mismo proyecto. |
f / l |
Timestamp del primer y del último evento (ISO 8601). |
d |
Duración en minutos. |
u / a |
Cantidad de mensajes tuyos / de Claude. |
k |
Tamaño del archivo en KB. |
v |
Versión de Claude Code. |
c |
Transcripción: [{"r": "u"|"a"|"t", "x": texto}]. |
Cada memoria de m:
| Clave | Qué es |
|---|---|
name |
Nombre del frontmatter (o el del archivo, si falta). |
file |
Nombre del archivo, con extensión. |
p |
Ruta del proyecto. |
desc |
Descripción del frontmatter. |
ty |
Tipo: project, user, feedback o reference. |
src |
UUID de la sesión que la escribió, si lo declara. |
body |
Cuerpo markdown, sin el frontmatter. |
ln |
Enlaces [[...]] que aparecen en el cuerpo. |
k |
Tamaño en KB. |
l |
Última modificación (ISO 8601). |
ix |
true si figura en MEMORY.md. |
hix |
true si el proyecto tiene MEMORY.md. |
Desarrollo
git clone https://github.com/ElvisClaros/claude-logbook && cd claude-logbook
python3 -m unittest discover -s tests -t .
Los tests arman árboles de .jsonl falsos en un directorio temporal y nunca
tocan ~/.claude. No hay nada que instalar: ni runner de tests ni dependencias.
| Módulo | De qué se ocupa |
|---|---|
claude_logbook/sessions.py |
Parsear los .jsonl, el caché, los filtros. |
claude_logbook/memory.py |
Leer los memory/*.md y auditarlos. |
claude_logbook/terminal.py |
Colores ANSI, la tabla, imprimir un chat. |
claude_logbook/webpage.py |
Meter los datos adentro del template. |
claude_logbook/cli.py |
Los argumentos y los comandos. |
claude_logbook/template.html |
La página: marcado, estilos y el código del navegador. |