Dreams are the only data we generate every night and lose every morning. You wake up holding fragments, and by breakfast they're gone. Journaling apps exist, but nobody opens a notes app at 6 AM with their eyes half shut — capture has to be voice, at the bedside, in seconds. And a single dream means little on its own; the value is longitudinal: the same staircase appearing three weeks in a row, the exam dream that only shows up before stressful days. Dreamline is built on one line: capture is voice, insight is longitudinal.
What it does
You narrate your dream out loud to Alexa, hands-free, before it fades. Behind the conversation sits a Model Context Protocol (MCP) server with four tools:
- log_dream — saves the transcript (date + optional mood tag) and extracts structured features with Amazon Bedrock Nova Lite: symbols, themes, mood, and lucid markers
- get_dreams — recalls past dreams, filterable by mood or date
- analyze_patterns — the longitudinal layer: recurring symbols and themes ranked across your whole history, plus mood correlations — computed from stored features, no model call needed
- dream_stats — totals, feature coverage, lucid count, mood breakdown
Weeks later you can ask "what keeps showing up in my dreams?" and get an answer built from your own history — not a horoscope.
How I built it
- FastMCP (Python) over Streamable HTTP, exposing the tools to any MCP host — including a simulated Alexa+ host, since the real Alexa+ toolkit is partner-gated and US-only, and the track explicitly allows simulated hosts
- SQLite store (
dreams+dream_featurestables): pattern analysis is instant local SQL — the model is used once, at capture, never at query time - Amazon Bedrock Nova Lite (APAC inference profile) for extraction, wired failure-safe: if Bedrock is unreachable, the dream still saves and a backfill pass extracts features later
- A friction log kept from day 1, as the track rewards — every tooling surprise documented the day it happened
Challenges I ran into
- FastMCP crashed at startup in my sandbox: its version check choked on bracketed IPv6 entries in
NO_PROXY. Root-caused it to the proxy config and sanitized the env in code — a localhost server shouldn't care about proxy settings - Bedrock in APAC needs the inference-profile ID, and the IAM policy needs both the profile ARN and the foundation-model ARNs, or invokes fail silently. Documented in the README so nobody else loses an evening to it
- Mid-build, review caught my own docstring claiming pattern tools that were built in a side file but never wired in. Actually wiring extraction into
log_dreamis why the pattern tools have real data to work with
Accomplishments that I'm proud of
A complete MCP backend for a voice product — capture → extraction → longitudinal analysis — verified end-to-end over HTTP from day 2. And the failure-safe design: the journal never breaks because an AI call failed. Dreams are precious data; the AI is an enhancement, not a dependency.
What I learned
MCP changes how you think about voice apps: the "skill" is really a set of tools with memory, and the host becomes interchangeable. Extraction-at-write / analysis-at-read is a clean split — one model call per dream, then free, instant, explainable pattern queries forever. And the friction log, which sounds like paperwork, turned out to be the best debugging diary I kept all month.
What's next for Dreamline
A bedside morning routine where Alexa asks "what did you dream?" unprompted at wake time; weekly pattern digests ("your staircase appeared 4 times this month, always on Sunday nights"); and full export and data ownership for the dreamer.
Log in or sign up for Devpost to join the conversation.