Jesús Martínez
EN
← Hecho en casa
En uso diario desde mayo de 2026 · v2

Receipts

Reportes semanales para clientes, con recibos.

Construí Receipts para escribir los reportes de estado semanales que mis clientes de verdad leen. Cada afirmación del reporte apunta a algo que registré, así que nada se infla y nada se pierde.

Estado
En uso diario, versión 2
Construido
Mayo a sept. de 2026, en solitario
Corre sobre
Next.js, Neon, OpenRouter, Telegram, Claude Code

Por qué lo construí

Mis commits solo contaban la mitad de la historia.

Mis clientes no son técnicos. Cada semana necesitan saber qué se hizo, qué está en vivo y qué necesito de ellos. Escribirlo a mano era lento, y mi historial de commits dejaba fuera lo que más les importa: la llamada en la que cambiamos el plan, la decisión que destrabó un lanzamiento, el despliegue que arregló su pago en línea.

El giro

La versión 1 mentía.

La primera versión escribía los reportes directamente desde GitHub: entraban pull requests y salía prosa amable para el cliente. El modelo llenaba cada vacío con seguridad. El trabajo parecía más terminado de lo que estaba, y una semana con dos reuniones con el cliente y un despliegue a producción, pero sin commits, salía como una semana tranquila.

v1 · escrito desde la actividad en git
Esta semana lanzamos a producción el nuevo flujo de reservas.
El código estaba fusionado. Nada se había desplegado.
v2 · escrito desde el ledger
El nuevo flujo de reservas está terminado y a la espera de su lanzamiento.E-31
Cada afirmación remite a una entrada del ledger que puedo mostrar.

Así que le di la vuelta. El ledger es el producto.

Ahora el modelo es un escribano, no un autor. Convierte lo que le digo en hechos estructurados, el reporte se construye solo con esos hechos y, antes de que nada salga, verifico que cada frase remita a uno de ellos.

Cómo funciona

De una nota de voz a un reporte.

01

Capturar

Durante la semana le escribo o le mando notas de voz a un bot de Telegram, en inglés o en español. GitHub y Linear se sincronizan solos cada tres horas.

02

Estructurar

Un modelo convierte cada mensaje en entradas del ledger: trabajo, despliegue, reunión, decisión, bloqueo. Si digo “en realidad eso fue en staging”, corrige la entrada en vez de crear una nueva.

03

Preguntar

A las 6:30 p. m. el bot pregunta por cada cliente: esto se sincronizó hoy, ¿algo que agregar? Un toque si no hay nada.

04

Escribir

El día del reporte, Claude Code redacta el reporte a partir del ledger de la semana en una sesión que yo superviso. La primera compuerta es un mapa de evidencia que vincula cada afirmación con una entrada.

05

Entregar

Envío un PDF limpio y en lenguaje claro: qué se entregó, qué está en vivo, las decisiones que tomamos y qué necesito de ti.

Cómo funciona, en 30 segundos

La idea, en miniatura.

Elige un mensaje para el bot y mira cómo se convierte en una entrada del ledger y luego en una línea del borrador del reporte, con la entrada que la respalda. Prueba la corrección después del despliegue.

Telegram

Ledger · Northwind Dental

Aún no hay nada registrado. Envíale un mensaje al bot.

Borrador del reporte, con su evidencia

Estado semanal · Semana 40Northwind Dental

Qué cambió esta semana

0entregado
0en vivo
0decisiones
0pendiente
Qué se entregó

Nada todavía.

Qué está en vivo

Nada salió en vivo esta semana.

Decisiones y conversaciones

Nada todavía.

Qué necesito de ti

Nada todavía.

Una explicación simplificada con datos inventados, no la interfaz real.

Por dentro

Un sistema pequeño, con reglas estrictas.

Telegram · voz · UISincroniza GitHub · LinearIntake · el modelo extraeEl ledger · PostgresClaude Code · supervisadoReporte PDF
01

Un escribano, no un autor.

La única llamada a un modelo sin supervisión convierte lo que dije en estructura. Nada de lo que lee un cliente se escribe sin que yo esté en el proceso.

Elegí extracción en vez de generación
02

Solo yo puedo decir “desplegado”.

El reporte no puede decir en vivo, lanzado o en producción a menos que una entrada de despliegue de esa semana nombre el entorno. Staging se dice staging.

Elegí una regla de vocabulario en vez de confiar en la prosa
03

La memoria son filas, no procesos.

Cada llamada reconstruye su contexto desde las tablas de mensajes y entradas. Sin flujos en pausa, y cada tarea programada se pone al día si se pierde una ejecución.

Elegí tareas sin estado en vez de flujos de larga duración

Las reglas que sigue

Extraer, no escribir.

El modelo solo convierte mis palabras en hechos estructurados. Nunca escribe para el cliente.

Corregir, no duplicar.

“En realidad eso fue en staging” actualiza la entrada existente en vez de agregar otra.

Staging es staging.

“En vivo” y “lanzado” necesitan una entrada de despliegue que nombre el entorno.

Cada afirmación tiene una entrada.

Antes de que salga un reporte, cada frase se vincula al ledger. Si no se puede, se elimina.

Lenguaje claro, en primera persona.

Sin pull requests, ramas ni tickets. Lo que el cliente ya puede hacer y qué problema desapareció.

Sin promesas ni fechas.

Los reportes cuentan lo que pasó, nunca lo que podría pasar.

Next.js 15TypeScriptNeon PostgresNeon FunctionsDrizzleOpenRouterTelegramClaude CodePuppeteerVercelSentry

Bitácora

Tres versiones, una lección cada una.

v0 · antes de mayo de 2026

Un script en un servidor.

Python en una máquina virtual: traer la actividad de GitHub, pedirle a Claude una narrativa, generar un PDF y dejarlo como borrador en Gmail. Probó la idea y nada más.

v1 · mayo de 2026

Una app de verdad, leyendo la fuente equivocada.

Next.js, tareas en segundo plano y reportes escritos desde la actividad en git. Rápida y pulida, y equivocada de una forma que tardó meses en notarse.

v2 · septiembre de 2026

El ledger.

Captura por Telegram y voz, preguntas por la tarde y redacción supervisada. Moví todo a Neon (base de datos, funciones, almacenamiento) y eliminé el pipeline viejo y las capas construidas para pruebas que nunca se escribieron.

Lo que aprendí

No dejes que un modelo escriba sobre lo que no puede ver.

Va a llenar el vacío, y va a sonar seguro. Dale los hechos, o haz que pregunte.

Las palabras fuertes tienen que ganarse su lugar.

“En vivo” es una afirmación. Ata cada afirmación fuerte a una evidencia y todo el reporte se vuelve confiable.

Borra lo que construiste “para después”.

La versión 2 se simplificó al quitar dos plataformas y una capa de abstracción que nadie usaba.

¿Quieres uno así? Construyámoslo.

Lo próximo para Receipts: Slack y un widget de chat como nuevas formas de registrar, sobre el mismo camino de entrada.