home / 02 — projects / moire
Moire
A journal that remembers the promises you make to yourself.
- status
- shipped
- when
- dec 2025 – now
- took
- ongoing
- team
- solo project




about
Live at https://moire-xi.vercel.app/
Moire is a journal that remembers. Journals fill up with half-made promises to yourself: call grandma, learn to surf properly, sort out sleep. Brain-dumping feels good for a moment, then the tasks sink into old entries and are forgotten. Moire is built so that writing something down is the start of acting on it, not the end.
You write freely, with no tags, templates or organising. After each entry, Moire suggests open loops worth keeping, and you decide which to hold onto, in your own words; nothing is added without you. Kept items are sorted into This week, Ongoing and Someday, then come back when they're due, when you write about them again, or in a weekly look back: a short summary of your week, a line you wrote, and a moment to sort what's still open. You can tick a loop off or let it go, and both count.
Underneath, an LLM pipeline reads each entry for open loops and recurring themes. Themes are canonicalised into persistent Fragments (growth, friendship, uni, running) and connected over time, and when something keeps coming up, Moire gently asks whether it should become a goal. Check-ins are deliberately rare, back off when ignored, and can be snoozed or dismissed in a tap. There are no stats or streaks, by design.
stack
next.js · react · javascript · tailwind css · prisma orm · postgresql · clerk · openai api · eslint
what I learned
- Designed and implemented an end-to-end semantic processing pipeline using LLMs, embeddings, and graph-based representations
- Built a canonicalisation system that maps noisy, LLM-generated topics into stable conceptual nodes using embedding similarity, centroid updates, and LLM fallback checks
- Implemented semantic chunking to preserve context while enabling fine-grained insight extraction without over-fragmentation
- Used vector embeddings and cosine similarity to manage concept identity, merging, and drift over time
- Architected a clean separation between API orchestration and core domain logic, improving extensibility and testability
what was hard
- Preventing topic explosion and semantic drift from LLM outputs by introducing TopicAlias mapping and node centroids
- Balancing automation vs interpretability, deciding when to trust embedding similarity and when to defer to LLM reasoning
- Preserving contextual meaning while chunking entries, especially when themes reappear non-linearly
- Designing a graph system that evolves incrementally without regenerating or invalidating existing structure
- Avoiding 'therapy-bot' failure modes by constraining tone, scope, and assumptions in reflective summaries
- Making resurfacing feel helpful rather than naggy: rare check-ins that back off when ignored, and letting go of a loop counts as closing it