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 accessS = 1.0 + 0.5 ln(1 + access_count)captures memory stability gained through reviewk = 0.5 + 1.5 · complexity_scoreaccounts 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
NoteDetailPanelreused 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.
localStorageplus 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
- api
- beautifulsoup4
- chromadb
- css
- fastapi
- html
- huggingface
- javascript
- notion
- numpy
- python
- react
- sql
- sqlite
- tailwindcss
- typescript
- uvicorn
Log in or sign up for Devpost to join the conversation.