The problem of remembering what you once wrote, and the kind of memory it takes to solve it.
Most journals forget as fast as you fill them. You write something meaningful in March, and by October it is buried — either lost in a stack of notebooks, or stuck inside an app that can only search for words you actually typed.
This is not a minor inconvenience. It is the central problem of writing to remember.
The problem with forgetting
A journal is a promise to your future self: here is something I want to come back to. Then life moves on. Six months later, you cannot remember which week you wrote the thing, let alone what you called it. You search for mom and the right post does not come up because that day you wrote Mak. You search for grief and find nothing — because the post that was really about grief was titled The morning coffee.
The classical solution is tags. You add a #grief label when you write, and later you can list everything tagged #grief. Where it works, it works well. But tags rely on three things going right:
- You remember to tag in the first place.
- You know what the post is really about, at the moment you are writing it.
- Your tag vocabulary stays stable over time.
All three fail, all the time. You write in a rush and skip the tag. You think you are writing about "running" when what you are really writing about is escape. You use #therapy for a while, then slide into #inner-work, and the same theme ends up labelled two different ways. The system that was supposed to keep you organised starts feeling like one more chore.
Three layers of memory
This journal tries to solve the problem by layering three different kinds of memory on top of each other. You still tag posts when you feel like it — in the vocabulary of the moment, by the intuition of the day. But tags are no longer the only way in.
┌────────────────────┐
│ a post you write │
│ text · voice · photo│
└─────────┬──────────┘
│
┌───────────────────┼───────────────────┐
│ │ │
▼ ▼ ▼
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ tags │ │ embedding │ │ graph │
│ │ │ │ │ │
│ your │ │ meaning as │ │ connections │
│ shorthand │ │ a number │ │ │
│ │ │ │ │ │
│ #grief │ │ [0.02, │ │ Mak ↔ Elías │
│ #letters │ │ -0.41, …] │ │ Elías ↔ park │
└──────┬───────┘ └──────┬───────┘ └──────┬───────┘
│ │ │
▼ ▼ ▼
"posts tagged "posts that "everything
grief" feel like this" about Mak"
exact match meaning match entity walk
later, when you ask a question…
Three layers of memory. Each one catches what the others miss.
Layer one — the tags you give it
When you write a post, you tag it however you want. Tags here are a writer's shorthand, not a librarian's taxonomy. #letters-to-elias, #mak, #boxing, #startup-lessons — each one is the classification you made in the moment, in whatever words felt honest that day. Tags are fast, personal, imprecise, and exactly the right tool for the thing you knew you were writing about.
But tags can only capture what you noticed. Suppose you write about your morning run. You are in a hurry, you tag it #running. Six months later you look back and realise the post was really about escape — a small act of getting out, of moving your body away from something you could not sit with. The tag does not know that. A different kind of search — one that cares about meaning instead of labels — might still find it.
Layer two — the meaning underneath the words
Every time a post is saved, it is also turned into a number. A very long number — 1,536 digits. This number is called an embedding. It is a fingerprint of the post's meaning, not its words.
Two posts can be semantically close without sharing a single word in common. Imagine one post called "The quiet after" about losing your mother, and another called "The morning coffee" about making teh ais the way she used to make it. The word grief appears in neither. The word mother might only appear in one. A keyword search misses the connection entirely. An embedding search finds both, because the model that turned them into numbers knew they were about the same kind of ache.
Embeddings are produced by a language model. The model has, in a sense, read most of the public internet. It has read grief essays and love letters and half-finished drafts and clumsy attempts at saying something hard. It has learned — in the mechanical way that models learn — what longing sounds like, what anger sounds like, what tenderness sounds like, what uncertainty sounds like. When it turns your post into a number, it places that post inside a vast invisible space where every piece of writing it has ever seen also sits. Posts that feel alike are close together. Posts that feel different are far apart.
This means you can ask questions tags could never answer.
"Find me posts where I was uncertain." There is no #uncertain tag, but the model knows what uncertainty sounds like in your own writing.
"What have I already written that echoes this new thing I am feeling?" You start writing a fresh post, and before you have even published it, the system can reach back into everything you have ever written and pull out the three or four things that sit nearest to it in meaning.
"Find the voice note where I was talking about something I could not name." Even a rambling voice note becomes part of the space once its transcript is embedded.
Layer three — a quiet knowledge graph
The third layer runs even quieter. Every time a post is saved, a small background process reads it and notes the people, places, works, projects, and events it contains. It writes these into a shared ledger. Over time, the ledger becomes a graph: Mak is a node, so is USJ 2/6H, so is Elías. Every post that mentions both your mother and your son becomes an edge between them.
The graph builds itself without you ever thinking about it. You never typed out "Elías is connected to Mak" as a fact — you just wrote a post where they appeared in the same paragraph, and another post where you described teaching him a small gesture she used to make. That was enough.
Once the graph exists, you can walk it. Ask "who is connected to Elías in my writing?" and the system follows the edges: Elías to Papa, via every letter you wrote to him. Elías to Mak, via the posts where they appeared together. Elías to the park, via an afternoon with a pressure rocket. The pressure rocket is its own node, linked back to that afternoon, linked forward to the next time you describe play or childhood or flight. Each of those nodes has its own neighbours. You can keep walking.
The graph is not accurate in the way a census is accurate — it reflects only what you have written about, and only what a language model noticed while reading what you wrote. But it captures something a pile of tagged posts never can: the shape of who and what your writing is made of.
Voice notes and photos, not just text
A journal is rarely just words. Voice notes carry tone and hesitation that writing flattens. A photo holds what you cannot describe.
This journal saves both as first-class entries. A voice note becomes a post with a transcript attached — the transcript is passed through the same three memory layers as any written post. It gets tagged (by you), embedded (by the model), and entity-extracted (into the graph). The raw audio stays linked to the post, so you can listen back to what the transcript can only approximate.
Photos get the same treatment. The image is saved on the blog. Whatever you write about it — a caption, a memory, a question — is embedded and graphed like any other post. The photo becomes part of the web.
Writing in more than one language
This journal is sometimes written in English, sometimes in Malay, sometimes in both inside the same paragraph. Embeddings do not care. A post about losing your mother in Malay has a similar embedding to a post about losing your mother in English — the language model was trained on both, and learned that Mak and mother and ibu and my mum all point to the same ache.
The practical consequence: you can write whichever language is honest in the moment. A future search for "posts about loss" will find them regardless.
Why it matters for journaling
Journals are supposed to stretch memory. The trouble is that memory only helps if you can find the thing. A journal you cannot search is a shoebox full of mixed-up Polaroids — precious, but silent. A journal you can only search by keyword is a slightly better shoebox.
A journal whose memory is tagged and embedded and graphed is closer to how your own mind actually works. You can find things by:
- What you called them — the tag you put on it:
#grief - What they were about — the meaning you did not label: "posts that feel like this new one"
- Who or what they mention — the people and places inside them: "everything about Mak"
- How things connect — the shape of the pattern: "what links my mother to my son in my writing?"
Each layer catches what the others miss. Tags are deliberate classification. Embeddings are the meaning you did not label. The graph is the pattern of your life, drawn out of the sentences you wrote one at a time.
What it feels like in use
A good moment for this system is the moment you need it most: when a new feeling arrives and you do not know what to do with it.
You sit down and write. Before you have even finished writing, the system has already started threading your new words through the older ones. When you pause and ask, "what have I written that touches on this?" — the answer is not a list of posts that say the same thing literally. It is a list of posts that meant the same thing, even when the words were different, the tags were different, the month was different, the life was different.
That is the promise. A journal that can find its own echoes. A memory that grows with you instead of behind you.
Curious how this is actually built? → How it's built