Β§Changelog

What we're shipping

Short notes for each release. Most recent at the top.

  1. New

    Other versions of this memory

    When you retell the same story with different details, the app detects it and links the versions. You confirm whether they're the same or keep them separate.

    Why this exists

    Memory is reconstructive. The same person tells the same story three times over the years and each time remembers something different β€” a new detail, a tidier version, a contradiction with themselves. What was lost until now was the trace of how memory changed β€” the app overwrote, or it kept two separate anecdotes without recognizing they were the same event.

    How it works

    When you save a new anecdote, a similarity pass runs in the background (token-bag cosine β€” no AI call, ~50ms) against your last 100 anecdotes. If it finds a near match above threshold, it leaves a candidate link in a new table (anecdote_links).

    Later, when you come back to the anecdote, you see a discreet section at the foot of the detail view:

    Β§ Other versions of this memory

    "Saturday cookies" β€” 2026-08-12 Β· 67%

    With two inline buttons: Same story βœ“ or Different stories βœ—. The UI mirrors the one we already use for interview-theme validation β€” optimistic confirm/dismiss, link to the other anecdote, fade-out on dismiss.

    The insight: linking is versioning

    We don't need an anecdote_versions table, a "save as new version" flow, or an explicit selector. You retell the story (because you recalled it differently), the app links it with the older version, and you confirm. Chronology emerges for free from each one's created_at.

    What this MVP does not do

    Honest about scope:

    • No side-by-side diff. To compare two versions you have to open both. If the feature catches on, it comes later.
    • No factual contradictions. We detect content similarity, not "you say 14 in one and 12 in the other." That needs structured extraction we won't add without signal.
    • No detection across friends. The pass only runs against your own archive. Inter-personal contradictions live in the existing "merge anecdotes" flow.
    • No LLM second pass. Conservative threshold (0.55), visible confirm/dismiss β€” false positives cost a click. If detection quality isn't enough, that's where we'd add Claude to disambiguate borderline pairs.

    Cost

    One async POST endpoint dispatched fire-and-forget after save (same pattern as the AI rate dispatch that already exists). No new cron, no heavy table, zero extra LLM calls. Detection is nearly free in infra; the value is giving the user the space to recognize their own memory as an object that changes with time.

  2. New

    Honest dates: day, year, era β€” or none at all

    We stopped inventing dates for anecdotes that don't have one. Each anecdote now lands on the timeline with the precision you actually remember.

    The problem the timeline carried

    Until now, if an anecdote didn't have an explicit date, the timeline placed it on the day you wrote it, not the day it happened. We grayed it out as "inferred," but the dot was still a tiny lie: a story from your adolescence ended up in the month you uploaded it.

    A story written yesterday didn't happen yesterday. The creation date is metadata about the system, not about the memory.

    Four precisions, not one

    Every anecdote now persists with one of four levels, picked from what the user actually said:

    • Day β€” exact happened_date. "March 14th, 1996."
    • Year β€” one known year. "In 1985." / "Summer of '87."
    • Era β€” a range. "The nineties." / "While we lived in Pocitos, between '88 and '92."
    • Unknown β€” the user can't remember and we won't invent.

    The heatmap renders each level distinctly: exact dates are month cells, year-only entries are dim columns with a β‰ˆ mark, and eras are translucent bands with diagonal hatching across the years they span. Unknown anecdotes don't appear on the grid β€” a discreet footer counter tells you how many there are.

    Automatic extraction from the chat

    The editorial chat (/anecdotes/new) and the interview (/biography/interview) already parse Rioplatense Spanish naturally and infer the right level without asking:

    • "I was about 7, the summer before school started" β†’ if your birth year is known, computes exact year; otherwise leaves it as Unknown.
    • "In the seventies, at grandma's house" β†’ era 1970-1979.
    • "The day my daughter was born, it was a Friday" β†’ if a full date is given, exact.

    Golden rule of the prompt: we prefer honesty over invented precision. When in doubt between "exact" and "approximate," it picks approximate.

    Manual editor

    /anecdotes/[id]/edit now has a precision selector next to the text: Day / Year / Era / Unknown. If the chat got it wrong, you correct it without having to coax the model.

    Score functions updated

    The SQL functions compute_user_score and evaluate_achievements (achievement five_years) now read anecdotes.happened_date as the canonical source, falling back to the inherited-source column and the era start year as appropriate. Anecdotes you tagged with a real date no longer count by the day you wrote them.

    Optional backfill

    For older anecdotes whose only temporal signal was created_at (now precision = "Unknown" after the migration), there's a one-shot script at scripts/backfill-anecdote-dates.mjs that runs them through an LLM extraction and populates the fields when the text gives clear cues. Supports --dry-run, --user filter, and is idempotent.

  3. New

    Share with whoever you choose, speak across time

    Named closed circles (Family / Work / The band) + future letters with scheduled delivery.

    Closed circles

    You can create small named groups of friends β€” "Family", "Neighborhood friends", "The band" β€” at /dashboard/circulos. Add members one by one (they must be accepted friends first). When you share an anecdote, the share dialog now has a "Circles" section above the friends list: tick the circles you want and only their members can read it.

    • Single-owner: each circle belongs to you. Marina in your "Family" doesn't mean she has a "Family" circle of her own that includes you.
    • No double-acceptance: if Marina is already your friend, adding her to your circle is unilateral. Removing her too.
    • No notification: the other person isn't told when you add or remove them. Anecdotes marked for a circle show up in their feed; ones that aren't, don't.
    • Zero anonymous audience: when an anecdote belongs to a circle, you know exactly who can read it β€” it's a concrete list of names, not a number.

    The slow-social-network promise becomes verifiable: "You decide what goes out, to whom, and when."

    Future letters

    New route /cartas. You write a letter now for someone β€” your daughter at 18, your partner on your next anniversary, yourself in 10 years β€” and choose when to deliver it:

    • Fixed date: 2035-12-25.
    • Recipient's birthday: "when my daughter turns 18" (requires the person to have a known birthday in your address book).

    A daily cron wakes the letters when their date arrives. If the recipient has an Anecdotario account, the letter materializes as a chest in their /keepsakes. If not, you get a notification saying "your letter for X is ready" and you send it manually from the chest editor pre-filled (auto-send to external recipients waits on Resend).

    While sealed you can cancel. Once delivered it lives in the chest.

    Not yet shipped: self-letter (the "to yourself in 10 years" path) and the post-mortem trigger (depends on digital inheritance). The form mentions both explicitly as "in progress" where they apply β€” we prefer honesty over marketing.

  4. New

    Caring for hard dates

    Memorialization, silent reading, hard dates, and per-anecdote tone β€” so the app knows when to stay quiet.

    An app that holds years of your life has a strange responsibility: learning when to stay quiet.

    When you mark someone's date of death, we stop surfacing them in automated suggestions β€” no more birthday reminders, no more "this week, five years ago…", no more cheerful prompts. They stay in your anecdotes; you can write about them whenever.

    We added a silent reading mode β€” a clean screen for re-reading someone's anecdotes one at a time, without metrics or chrome.

    For dates you want to reserve beyond a single person β€” a diagnosis, a difficult anniversary β€” you can mark them as hard dates (with an opt-in reminder) or as quiet days (the app sends nothing automated).

    And every anecdote can carry a tone β€” happy, hard, mixed β€” so the suggestions know when to stay quiet.

  5. Improvement

    Question of the week, birthdays, regional transcription

    A round of smaller improvements: a curated question every Monday, 7-day birthday lead time, Whisper that understands rioplatense, and deleting your account without retention chatbots.

    A round of smaller improvements:

    • Question of the week β€” beyond the chrono recall ("this week N years ago you wrote X"), every Monday you now also get a curated question: "What was the first time you felt like an adult?", "What smell takes you straight back to childhood?" β€” 28 initial prompts, biased toward the chapters your archive says are less covered, alternating tone week to week.
    • Birthdays at 7 days' notice β€” the daily cron spots birthdays in your address book, picks an anecdote you wrote that includes that person, and notifies you a week ahead with a pre-filled chest. Click β†’ chest editor with the anecdote selected and the title "For your birthday, mom".
    • Rioplatense transcription β€” Whisper now receives a per-language vocabulary prompt. Spanish: vos, che, boluda, dale, mate, asado, bondi, laburo. Portuguese: vocΓͺ, cara, mano, churrasco, feijoada. The model stops "normalizing" regional slang into neutral Spanish.
    • No AI training β€” we formalized in code and in the privacy policy the promise that your material is not sent to train models. Anthropic and OpenAI clients are centralized with the commercial terms cited explicitly.
    • Delete my account β€” if you want to, you can. Confirm by typing your email in /dashboard/profile, click, and everything is removed (anecdotes, photos, audios, profile). No retention chatbots, no paperwork.
  6. New

    Your life on a screen, and photos that become memories

    Heatmap of every anecdote across the years, photo-upload mini-interview that reads EXIF and suggests people.

    Timeline

    New route /timeline with your whole life on one screen. Editorial-broadsheet heatmap: months on the vertical axis, years on the horizontal. Each monthly cell glows brighter with more anecdotes in that month. Click a cell to open its featured anecdote.

    • Amber for hard months. When a month is dominated by anecdotes tagged "hard," the cell renders in amber instead of violet. Loss doesn't share the color of celebration.
    • "Today" marker β€” a dashed vertical line on the current month with a dot on the present month's row, anchoring the eye when you see 50+ years at once.
    • Decade chunking. Decade boundaries (1970 / 1980 / 1990...) get visibly thicker hairlines than the rest of the grid β€” you navigate decades without counting columns.
    • Bloom halo on peaks. Months with many anecdotes have a violet halo behind them β€” your life's peaks glow from across the room.

    No heavy viz library β€” pure SVG plus math.

    Photo-upload mini-interview

    When you upload a photo, the editorial chat we already had now reads EXIF (date taken and GPS coords) and suggests people from your graph (top 12 by mention count, excluding memorialized). The LLM gets this as context and opens with concrete questions:

    "Was this in 2018? I see you mention your mom, your brother, and Sole often β€” is anyone in this photo?"

    Instead of:

    "Who's in the photo?"

    The showroom promise ("like a mini-interview, not a form") is now real, not just aspirational.

    Edge tooltip in the people graph

    When you hover the line between two people on the graph (/people/graph), a tooltip surfaces the titles of the anecdotes they appear in together. The line is no longer just a numeric weight β€” it's the concrete list of shared stories.

  7. New

    Museum mode: if you stop paying, you don't lose your corpus

    When you cancel your subscription, your account enters museum mode: you read and export everything that's yours, your compositions stay. Nothing lost.

    Apps that depend on your corpus have an ugly problem: when you stop paying, they lock you out of what you wrote. That turns the corpus into a cage.

    Anecdotario works differently. If you stop paying (because you can't this month, because you got bored, because you want to come back later), your account enters museum mode:

    • You read everything that's yours β€” anecdotes, memories, autobiography chapters, the books and movies you already generated.
    • You export everything in .md, .pdf, .epub. Your material, in your hands, no locks.
    • It stays intact. If you come back in 6 months or in 6 years, everything is where you left it.

    What you can't do in museum mode: create new (anecdotes, chests, compositions). But what you already wrote is yours, forever, even if you never pay us again.

    That's the promise: your life isn't rented.