§Changelog

Lo que vamos shippeando

Notas cortas de cada release. Más reciente arriba.

  1. Nuevo

    Otras versiones de este recuerdo

    Cuando volvés a contar la misma historia con detalles distintos, la app la detecta y te enlaza las versiones. Vos confirmás si es la misma o las dejás separadas.

    Por qué este feature existe

    La memoria es reconstructiva. La misma persona cuenta la misma historia tres veces a lo largo del tiempo y cada vez recuerda algo distinto: un detalle nuevo, una versión más cuidada, una contradicción consigo misma. Lo que se perdía hasta ahora era el rastro de cómo la memoria fue cambiando — la app sobreescribía o guardaba dos anécdotas separadas sin reconocer que era el mismo evento.

    Cómo funciona

    Cuando guardás una anécdota nueva, en background corre una pasada de similitud (token-bag cosine — sin llamada a IA, ~50ms) contra las últimas 100 anécdotas que escribiste. Si encuentra alguna parecida arriba del threshold, deja un link candidato en una tabla nueva (anecdote_links).

    Más tarde, cuando volvés a la anécdota, ves una sección discreta al pie del detalle:

    § Otras versiones de este recuerdo

    "Las galletas de los sábados" — 2026-08-12 · 67%

    Con dos botones inline: Misma historia ✓ o Son distintas ✗. La UI es la misma que ya tenemos para validación de themes en entrevistas — confirm/dismiss optimista, link a la otra anécdota, fade-out al descartar.

    El insight: linkear es versionar

    No necesitamos una tabla anecdote_versions ni un flujo "guardar como nueva versión" ni un selector explícito. El usuario re-cuenta la historia (porque la recordó distinto), la app la enlaza con la versión vieja, y vos confirmás. La cronología emerge gratis de los created_at de cada una.

    Lo que no hace este MVP

    Honestidad sobre el alcance:

    • Sin diff side-by-side. Para comparar dos versiones tenés que abrir las dos. Si el feature engancha, vendrá después.
    • Sin contradicciones de hechos. Detectamos similitud de contenido, no marcamos "decís 14 años en una y 12 en otra". Eso requiere extracción estructurada que no haremos hasta tener señal.
    • Sin detección entre amigos. La pasada sólo corre dentro de tu propio archivo. Las contradicciones inter-personales viven en el flujo de "fusionar anécdotas" que ya existe.
    • Sin LLM second pass. Threshold conservador (0.55), confirm/dismiss visible — los falsos positivos cuestan un click. Si la calidad de la detección no alcanza, ahí podríamos meter Claude para desambiguar pares dudosos.

    Costo

    Un endpoint POST async post-save que dispara fire-and-forget (mismo patrón que el AI rate dispatch que ya existe). Ningún cron nuevo, ninguna tabla pesada, cero llamadas extra al LLM. La detección es casi gratis en infra; el valor está en darle al usuario el espacio de reconocer su propia memoria como un objeto que cambia con el tiempo.

  2. Nuevo

    Fechas honestas: día, año, época — o nada

    Dejamos de inventar la fecha de cada anécdota. Ahora cada una se ubica en la línea de tiempo con la precisión real con la que la recordás.

    El problema que arrastraba el timeline

    Hasta ahora, si una anécdota no tenía fecha exacta, la línea de tiempo la ubicaba en el día que la escribiste, no en el día que pasó. Lo marcábamos como "inferida" en gris, pero seguía siendo una mentirita: una historia de tu adolescencia caía en el mes que la subiste a la app.

    Una historia escrita ayer no pasó ayer. La fecha de creación es metadata del sistema, no del recuerdo.

    Cuatro precisiones, no una

    Cada anécdota se guarda ahora con uno de estos cuatro niveles, según lo que el usuario haya contado:

    • Díahappened_date exacto. "El 14 de marzo del 96."
    • Año — un solo año conocido. "En 1985." / "Verano del 87."
    • Época — un rango. "Los noventa." / "Cuando vivía en Pocitos, entre el 88 y el 92."
    • Sin fecha — el usuario no se acuerda y no queremos inventarlo.

    En el heatmap cada nivel tiene su propio tratamiento visual: las fechas exactas son celdas mensuales, los años aprox. son columnas tenues con un arriba, y las épocas son franjas con hatching diagonal sobre los años que abarcan. Las "sin fecha" no se grafican — un contador discreto al pie te dice cuántas hay.

    Extracción automática desde el chat

    El chat editorial (/anecdotes/new) y la entrevista (/biography/interview) ya entienden expresiones rioplatenses y sacan el nivel correcto sin pedírtelo:

    • "Tendría unos 7 años, era el verano antes de empezar la escuela" → si conoce tu edad, calcula año exacto; si no, queda como "sin fecha".
    • "En los 70, en lo de la abuela" → época 1970-1979.
    • "El día que nació mi hija, fue un viernes" → si das la fecha completa, queda exacto.

    Regla de oro del prompt: preferimos honestidad sobre precisión inventada. Si duda entre "exacto" y "aprox", elige aprox.

    Editor manual

    En /anecdotes/[id]/edit ahora hay un selector de precisión al lado del texto: Día / Año / Época / No sé. Si la extracción del chat se equivocó, lo corregís sin tener que volver a explicarle al modelo.

    Funciones de score actualizadas

    Las funciones SQL compute_user_score y evaluate_achievements (logro five_years) ahora leen anecdotes.happened_date como fuente canónica, con fallback a la columna de origen heredado y al año de época cuando aplica. Las anécdotas que tagueaste con fecha real ya no se cuentan por la fecha en que las escribiste.

    Backfill opcional

    Para anécdotas viejas que sólo tenían created_at como única señal temporal (precision = "sin fecha" después de la migración), hay un script one-shot en scripts/backfill-anecdote-dates.mjs que las pasa por una extracción LLM y popula los campos cuando el texto da pistas claras. Soporta --dry-run, filtro por --user, y es idempotente.

  3. Nuevo

    Compartir con quien vos elegís, hablar a través del tiempo

    Círculos cerrados nombrados (Familia / Trabajo / La banda) + cartas al futuro con entrega programada.

    Círculos cerrados

    Podés crear grupos chicos de amigos con nombre — "Familia", "Amigos del barrio", "La banda" — en /dashboard/circulos. Asignás miembros uno por uno (tienen que ser amigos aceptados primero). Cuando compartís una anécdota, en el dialog de share ahora hay una sección "Círculos" arriba de la lista de amigos: marcás los círculos que quieras y solo sus miembros la ven.

    • Single-owner: cada círculo te pertenece a vos. Marina en tu "Familia" no implica que ella tenga un círculo "Familia" propio que te incluya.
    • Sin doble aceptación: si Marina ya es tu amiga, agregarla a tu círculo es unilateral. Sacarla también.
    • Sin notificación: el otro no se entera cuando lo agregás o sacás. Las anécdotas marcadas para un círculo aparecen en su feed; las que no, no.
    • Cero público anónimo: cuando una anécdota está en un círculo, sabés exactamente quién la puede leer — es una lista de nombres concreta, no un número.

    La promesa de la red social lenta se vuelve verificable: "Vos decidís qué sale, a quién, y cuándo."

    Cartas al futuro

    Nueva ruta /cartas. Escribís ahora una carta para alguien — tu hija de 18 años, tu pareja en su próximo aniversario, vos mismo en 10 años — y elegís cuándo entregarla:

    • Fecha fija: 2035-12-25.
    • En el cumple del destinatario: "cuando mi hija cumpla 18" (requiere que la persona tenga fecha de nacimiento conocida en tu agenda).

    Un cron diario despierta las cartas cuando llega su fecha. Si el destinatario tiene cuenta de Anecdotario, la carta se materializa como un cofre que recibe en su /keepsakes. Si no tiene cuenta, te llega una notif que dice "tu carta para X está lista" y la mandás manualmente desde el editor de cofres pre-llenado (auto-send a externos espera Resend).

    Mientras está sellada podés cancelarla. Una vez entregada, pasa al keepsake y vive ahí.

    Lo que aún no está: self-letter (la versión "para vos mismo en 10 años") y el path post-mortem (depende del feature de herencia digital). El form los menciona explícitamente como "en construcción" donde aplica — preferimos honestidad sobre marketing.

  4. Nuevo

    Cuidar las fechas difíciles

    Memorialización, lectura silenciosa, fechas duras y tono por anécdota — para que la app sepa cuándo callarse.

    Una app que guarda toda tu vida tiene una responsabilidad rara: aprender cuándo callarse.

    Si marcás la fecha de fallecimiento de alguien, dejamos de traerlo en sugerencias automáticas — no más cumpleaños recordados, no más "esta semana hace cinco años…", no más preguntas alegres. La persona sigue en tus anécdotas; vos podés escribir cuando quieras.

    Sumamos también un modo de lectura silenciosa — una pantalla limpia para releer las anécdotas de alguien, una a una, sin métricas ni adornos.

    Para fechas que querés reservar más allá de una persona — un diagnóstico, un aniversario complicado — podés marcarlas como fechas duras (con un recordatorio opt-in) o como días en silencio (la app no manda nada automatizado).

    Y cada anécdota puede llevar un tono — alegre, difícil, mixto — para que las sugerencias sepan cuándo callarse.

  5. Mejora

    Pregunta de la semana, cumples, transcripción regional

    Una tanda de mejoras chicas: pregunta curada cada lunes, aviso de cumples a 7 días vista, Whisper que entiende rioplatense, y borrar tu cuenta sin chatbots.

    Una tanda de mejoras chicas:

    • Pregunta de la semana — además del chrono recall ("esta semana hace N años contaste X"), ahora también te llega cada lunes una pregunta curada por nosotros: "¿Cuál fue la primera vez que te sentiste adulto?", "¿Qué olor te tira directo a la infancia?" — 28 prompts iniciales, sesgados a los capítulos que tu archivo dice que tenés menos cubiertos, alternando tono semana a semana.
    • Cumples a 7 días vista — el cron diario detecta cumples de gente en tu agenda, elige una anécdota tuya con esa persona, y te avisa una semana antes con el cofre pre-llenado. Click → editor de cofres con la anécdota seleccionada y un title "Para tu cumple, vieja".
    • Transcripción rioplatense — Whisper recibe ahora un prompt de vocabulario por idioma. En español: vos, che, boluda, dale, mate, asado, bondi, laburo. En portugués: você, cara, mano, churrasco, feijoada. El modelo deja de "normalizar" la jerga regional al español neutro.
    • No entrenar IAs — formalizamos en código y en la privacy policy la promesa de no enviar tu material a entrenar modelos. Los clientes de Anthropic y OpenAI quedan centralizados con los términos comerciales citados explícitamente.
    • Borrar mi cuenta — si querés, podés. Confirmás escribiendo tu email en /dashboard/profile, hacés click, y se borra todo (anécdotas, fotos, audios, perfil). Sin chatbots de retención, sin trámites.
  6. Nuevo

    Tu vida en una pantalla, y fotos que se vuelven recuerdos

    Mapa de calor con todas tus anécdotas a lo largo de los años, mini-entrevista al subir foto que detecta EXIF y sugiere personas.

    Línea de tiempo

    Nueva ruta /timeline con tu vida entera en una pantalla. Mapa de calor estilo broadsheet editorial: meses en el eje vertical, años en el horizontal. Cada celda mensual brilla más cuando hubo más anécdotas en ese mes. Click en una celda te abre la anécdota destacada.

    • Tono ámbar para meses difíciles. Cuando un mes está dominado por anécdotas marcadas como tono "difícil", la celda sale en ámbar en vez de violeta. La pérdida no usa el color de la celebración.
    • Marker de "hoy" — una línea vertical dasheada en el mes actual con un punto en la fila del mes, para anclar el ojo cuando ves 50+ años de un saque.
    • Décadas chunkeadas. Las divisiones de década (1970/1980/1990...) se marcan con hairlines más visibles que el resto del grid — navegás décadas sin contar columnas.
    • Halo de bloom en peaks. Los meses con muchas anécdotas tienen un halo violeta detrás — los picos de tu vida brillan de lejos.

    Sin librerías de viz pesadas — pure SVG + matemática.

    Mini-entrevista al subir foto

    Cuando subís una foto, el chat editorial que ya existía ahora lee EXIF (fecha y coords GPS) y sugiere personas de tu grafo (top 12 por menciones, excluyendo memorializadas). El LLM recibe esto como contexto y abre con preguntas concretas:

    "¿Esto fue en 2018? Veo que mencionás seguido a tu vieja, tu hermano y a Sole — ¿alguno aparece en esta foto?"

    En lugar de:

    "¿Quiénes aparecen en la foto?"

    La promesa del showroom ("como una mini-entrevista, no como un formulario") ahora es real, no solo aspiracional.

    Tooltip en el grafo de personas

    Cuando hovereás una línea entre dos personas en el grafo (/people/graph), aparece un tooltip con los títulos de las anécdotas en las que aparecen juntas. La línea ya no es solo un peso numérico — es la lista concreta de las historias compartidas.

  7. Nuevo

    Modo museo: si dejás de pagar, no perdés tu corpus

    Cuando cancelás tu suscripción, tu cuenta entra en modo museo: leés y exportás todo lo tuyo, las composiciones siguen ahí. Sin perder nada.

    Las apps que dependen de tu corpus tienen un problema feo: cuando dejás de pagar, te bloquean acceso a lo que vos escribiste. Eso convierte el corpus en una jaula.

    Anecdotario funciona distinto. Si dejás de pagar (porque no podés ese mes, porque te aburriste, porque querés volver más adelante), tu cuenta entra en modo museo:

    • Leés todo lo tuyo — anécdotas, recuerdos, capítulos de autobiografía, los libros y películas que ya generaste.
    • Exportás todo en .md, .pdf, .epub. Tu material, en tus manos, sin candados.
    • Sigue intacto. Si volvés en 6 meses o en 6 años, todo está donde lo dejaste.

    Lo que no podés en modo museo: crear nuevo (anécdotas, cofres, composiciones). Pero lo que ya escribiste es tuyo, para siempre, aunque nunca más nos pagues.

    Esa es la promesa: tu vida no se alquila.