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_features tables): 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_dream is 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.

Built With

  • alexa+
  • amazon-bedrock
  • amazon-nova-lite
  • fastmcp
  • model-context-protocol-(mcp)
  • python
  • sqlite
Share this project:

Updates

Submission history