A web application that helps elderly users share their life stories through conversational AI, featuring two specialized agents that work together to capture and organize memories.
On the backend, Memory Keeper utilizes Dandelion Intelligent Platform for AI (Assistive Intelligence) interaction and storage and retrieval of cherished memories, ideas and creative work.
The Collaborator Agent leverages Dandelion's Biographer functionality and offers:
- Empathetic conversation facilitator
- Asks thoughtful follow-up questions about family, childhood memories, and life events
- Maintains warm, conversational tone optimized for elderly users
The Memory Keeper leverages Dandelion's Biographer and Member Avatar functionality and offers:
- Real-time extraction of structured data from conversations
- Organizes memories into categories: People, Dates, Places, Relationships, Events
- Provides visual feedback on captured information
- Clean, accessible chat interface adapted from Memorial Mosaic design
- Large text and high contrast for elderly users
- Toggle switches for agent metadata and memory display
- Mobile-responsive design
- Export functionality for stories and extracted memories
- Frontend: Vanilla JavaScript, Custom CSS with CSS Custom Properties
- AI Backend: Dandelion Intelligence Platform via API
- Architecture: Server-backed with SSE streaming (Collaborator) and background tool processing (Memory Keeper)
This repo now targets a demo-friendly, single-origin architecture on Render:
- Single Render Web Service serves the static frontend and exposes API endpoints
- Collaborator streams responses to the UI via SSE (
POST /chat) - Memory Keeper runs as a background extraction publishing updates via SSE (
GET /events)
See detailed docs in docs/:
docs/PROJECT_ROADMAP.mddocs/architecture/overview.mddocs/api.mddocs/agents.mddocs/technical-implementation.md
-
Prerequisites
- Node.js 18+ (recommended: use nvm with
.nvmrc) - Anthropic API key
- Node.js 18+ (recommended: use nvm with
-
Clone the repository
git clone <repository-url> cd dandelion-memory-keeper
-
Environment Setup
# Copy environment template cp .env.example .env # Edit .env and add your Anthropic API key: # ANTHROPIC_API_KEY=sk-ant-api03-...
-
Install Dependencies
npm install
-
Start Development Server
# Option 1: Use development script (recommended) ./scripts/dev.sh # Option 2: Direct npm command npm start
-
Access Application
http://localhost:3000
Node.js Isolation: This project uses nvm for Node.js version management to avoid conflicts with other development projects.
Node.js Version: 18+ (specified in .nvmrc)
# Recommended: Use nvm for version isolation
nvm use # Use project-specific version
nvm install # Install if version not availableProject Setup: Run the setup script for complete environment isolation
./scripts/setup.sh # One-time setup
./scripts/dev.sh # Daily developmentEnvironment Variables: All configuration in .env file
ANTHROPIC_API_KEY- Required for AI agentsNODE_ENV- development/productionPORT- Server port (default: 3000)
Isolation Benefits
- Project-specific Node.js version
- Isolated npm dependencies
- No interference with other projects
- Clean environment setup/teardown
- Create a Web Service on Render connected to this repo
- Render auto-detects
render.yaml(or set Build:npm install, Start:npm start) - Environment Variables (Render Dashboard)
ANTHROPIC_API_KEY(required)SESSION_SECRET(required)- Optional:
PORT=3000(default) β server respectsprocess.env.PORT
- Health Check:
/healthz - Open the service URL; the frontend and API are both served from the same origin.
-
Start a Story Session
- Click "Start Sharing Your Story" on the welcome screen
- The Collaborator agent will introduce itself and ask an opening question
-
Share Your Stories
- Type responses in the chat interface
- The Memory Keeper automatically extracts and organizes key information
- Toggle agent details and memory display using the header switches
-
Export Your Session
- Click "Export" to download your conversation and extracted memories as JSON
- Includes timestamp, all messages, and organized memory data
# Required
ANTHROPIC_API_KEY=your_anthropic_api_key_here
# Optional
NODE_ENV=development
LOG_LEVEL=info
ENABLE_ANALYTICS=false- Colors: Modify CSS custom properties in
css/styles.css - Agent Prompts: Update system prompts in
js/app.js(TODO: Move to Claude API integration) - Memory Categories: Adjust categories in the memory extraction logic
- Basic UI with mosaic-inspired design
- Empathetic Collaborator agent (Claude) integrated
- Memory Keeper tool with Anthropic extraction
- SSE streaming for collaborator tokens and memory updates
- Firebase Authentication (client + admin) with user data isolation
- Export functionality
- Voice input support
- Enhanced memory visualization
- Session persistence and history
- Multi-language support
- Advanced export formats (PDF, Word)
- Context Enrichment Agent (photo/ancestry integration)
- Memory Assessment Agent (healthcare integration)
- Family sharing and collaboration features
- Advanced analytics and insights
Agents are accessed via the app server (never call Anthropic directly from the browser):
# Stream collaborator response (SSE)
curl -N \
-H "Authorization: Bearer <FIREBASE_ID_TOKEN>" \
-H "Content-Type: application/json" \
-X POST http://localhost:3000/chat \
-d '{"text":"Hi there","conversationId":"demo","messageId":"1"}'
# Run memory extraction (REST)
curl -s \
-H "Authorization: Bearer <FIREBASE_ID_TOKEN>" \
-H "Content-Type: application/json" \
-X POST http://localhost:3000/api/memory-keeper \
-d '{"message":"I grew up in Chicago","conversationId":"demo","messageId":"1"}'- API keys are handled via environment variables
- Content Security Policy configured via Helmet in
server.js - No sensitive data stored client-side
- HTTPS enforced in production
- Large, high-contrast text optimized for elderly users
- Keyboard navigation support
- Screen reader compatibility
- Mobile-responsive design
- Simple, intuitive interface
- Fork the repository
- Create a feature branch
- Make your changes
- Test thoroughly with elderly user scenarios in mind
- Submit a pull request
[License information to be added]
For questions or support, please create an issue or contact [contact information].
Built with β€οΈ for preserving and sharing life stories