Dory.md

Inspiration

We've all done it. You read a great paper, take detailed notes, file them somewhere, and three weeks later you can't recall the key insight when you need it. The notes exist—you just can't reach them in your head anymore.

The science behind this is older than computers. In 1885, Hermann Ebbinghaus published Über das Gedächtnis and plotted the first forgetting curve from his own self-experimentation: memory decays exponentially, and without review, you lose roughly half of new information within a few days. Anki and Duolingo use modern descendants of this curve, but they're built for flashcards—not for the messy, free-form notes students and researchers actually take.

Between the three of us, we have stacks of class notes, research PDFs, meeting writeups, and half-finished study docs that we've never opened a second time. We didn't want another note-taking app. We wanted one that treats our existing notes—PDFs, Markdown, Word docs, plain text—as a living memory system.

Not “make me a flashcard.” Just: track what we're losing, and tell us before it's gone.

What It Does

Dory.md ingests your notes from any source (PDF, DOCX, TXT, Markdown, HTML, or pasted text), splits them into study-sized chunks, embeds them, and tracks how likely you are to remember each chunk over time using the Ebbinghaus curve.

Then it works for you in five ways:

Dashboard

See at a glance what's strong, what's fading, and what's about to be forgotten. A Time Machine slider shows the same data projected forward in time, so you can watch your knowledge erode if you don't return.

Library

Full CRUD over every chunk, with folders, bulk operations, and inline editing. Encrypted notes (AES-256-GCM in the browser) for sensitive content the server should never see.

Semantic Search

Embedding-based search across everything you've ever imported, re-ranked to surface fading content first.

AI Toolbar

Three actions on any note:

  • Summarize (3–5 sentences)
  • Go Deeper (LLM-expanded study notes with structure)
  • Optimize (merges your original with the expansion into one clean note)

All powered through a provider-agnostic LLM service that runs on Groq, Ollama, or Anthropic with zero code changes.

Quiz Mode

Auto-generated multiple-choice questions from your lowest-retention chunks, with answers feeding back into the decay engine to boost retention on what you got right.

A Pomodoro timer that survives browser navigation and a Notion integration round it out.

How We Built It

Decay Engine

R(t) = e^(-t / (S · k · 216))

Where:

  • t = hours since last access
  • S = 1.0 + 0.5 ln(1 + access_count) captures memory stability gained through review
  • k = 0.5 + 1.5 · complexity_score accounts for how hard the material is

The 216-hour base gives a 9-day characteristic half-life for a new note.

Backend

  • FastAPI
  • SQLite (WAL mode)
  • Local ChromaDB instance for vectors
  • all-MiniLM-L6-v2 (384-dim) embeddings
  • Provider-swappable LLM layer

Frontend

  • React 18
  • TypeScript
  • Tailwind CSS
  • useState + localStorage

Security

Encryption runs entirely in the browser using the Web Crypto API:

  • PBKDF2 with 100,000 iterations
  • 256-bit key derivation
  • AES-GCM with fresh 12-byte IV per encryption

The server stores only opaque encrypted blobs.

Challenges We Ran Into

Cold-Start Latency

The embedding model took 3–8 seconds to load, so we moved loading into FastAPI startup.

Decay Tuning

Our first formula looked mathematically right, but felt wrong in practice. We iterated until transitions between strong, fading, weak, and critical matched real study intuition.

Live Database Migration

We added schema migrations that safely check missing columns before startup.

Search Re-ranking

Pure semantic similarity wasn't enough. Final ranking:

0.7 · similarity + 0.3 · (1 - retention)

Pomodoro Persistence

We stored only startedAt and recalculated remaining time using wall-clock time to avoid browser throttling.

Team Coordination

We agreed on a JSON contract first and built against mocks, which kept merges clean under hackathon pressure.

Accomplishments We're Proud Of

  • A 140-year-old psychology paper shipped as a real product.
  • Provider-agnostic LLM switching with zero code changes.
  • Browser-side encryption the server cannot undo.
  • Unified NoteDetailPanel reused across Library, Search, and Quiz.
  • Sub-millisecond decay computation across thousands of notes.
  • Robust FastAPI backend built under hackathon constraints.

What We Learned

  • Old research can still inspire modern products.
  • Search should prioritize what users are forgetting.
  • A clean LLM abstraction pays off immediately.
  • localStorage plus thoughtful state design solves more than expected.
  • Great demos hinge on one magical moment—for us, the Time Machine slider.
  • A JSON contract before coding is cheap insurance for a 3-person team.

What's Next for Dory.md

Real Spaced Repetition Scheduler

FSRS-style scheduling personalized to each user's review history.

Study Group Mode

Shared chunks with optional end-to-end encryption.

Mobile Experience

A fully redesigned phone-first interface.

Feynman Mode

Explain concepts as if to a curious 12-year-old.

Cross-Chunk Linking

Automatic discovery of relationships between notes, turning the library into a knowledge graph.

Built With

Share this project:

Updates