Short notes for each release. Most recent at the top.
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.
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.
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.
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.
Honest about scope:
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.
We stopped inventing dates for anecdotes that don't have one. Each anecdote now lands on the timeline with the precision you actually remember.
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.
Every anecdote now persists with one of four levels, picked from what the user actually said:
happened_date. "March 14th, 1996."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.
The editorial chat (/anecdotes/new) and the interview (/biography/interview) already parse Rioplatense Spanish naturally and infer the right level without asking:
Golden rule of the prompt: we prefer honesty over invented precision. When in doubt between "exact" and "approximate," it picks approximate.
/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.
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.
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.
Named closed circles (Family / Work / The band) + future letters with scheduled delivery.
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.
The slow-social-network promise becomes verifiable: "You decide what goes out, to whom, and when."
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:
2035-12-25.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.
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.
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:
/dashboard/profile, click, and everything is removed (anecdotes, photos, audios, profile). No retention chatbots, no paperwork.Heatmap of every anecdote across the years, photo-upload mini-interview that reads EXIF and suggests people.
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.
No heavy viz library β pure SVG plus math.
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.
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.
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:
.md, .pdf, .epub. Your material, in your hands, no locks.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.