Project Info
This project did not submit a demo video on Devpost.
Inspiration
Our inspiration came from the importance of connecting with family and cherishing proud personal stories. We recognized that many elderly people in nursing homes feel isolated from their families, despite the wealth of memories they carry. These memories hold so much value about family history, wisdom, and identity. By creating a platform that enables them to reflect on and share these moments, we aimed to bridge generational gaps and strengthen family bonds. Through storytelling, we want to foster a tight family bond, ensuring that cherished memories are passed down and that the elderly feel heard, valued, and connected. We wanted to emphasize the story aspect of these memories. When people want to share their memories with their family, especially virtually, they aren't able to fully relive or cherish that memory- a simple text message can't fully do justice to a fond memory. Thus, we wanted to bring life into these memories that shared within families online and especially provide elderly people who might not meet their families often to have an immersive experience with their family's memories.
What it does
Memento allows families to document fond memories that they have, and share them to the user. Families can upload memories that contain a date, description, and image. We target this product to the elderly in nursing homes who are usually alone and can benefit from having someone like family to talk to. The elderly user can then speak to the application and can have a conversation about the details of any memory. The application will also display the most relevant image to the conversation to help improve the experience. This enables the elderly user to feel like they are talking to a family member or someone they know well. It allows them to stay connected with their loved ones without the continuous presence of them.
How we built it
We designed Memento to be simple and accessible for both elderly users and their families. For this reason, we used Reflex to implement an elegant UI, and implemented a Chroma database to store the memories and their embeddings for search. We also integrated Whisper, a speech-to-text model through Groq’s fast inference API to decode what the elderly person is saying. Using this input, we query our database, and feed this information through Gemini, an LLM developed by Google, to give a coherent response that incorporates information from the families’ inputs. Finally, we used Deepgram’s text-to-speech model to convert the LLM’s outputs back to an audio format that we could speak back to the elderly user.
Challenges we ran into
Integration: It was difficult to integrate all of the sponsor’s softwares into the final application; we had to pore over documentation while becoming familiar with each API, which led to many hours of debugging. Non-determinism: Our models were non-deterministic; errors caused by specific outputs from the LLM were hard to replicate. Due to the background noise, we also could not efficiently test our speech-to-text model’s accuracy. Inference speed: Throughout this application, we make many API calls to large models, such as Whisper, Gemini, and the Aura TTS model. Because of this, we had to find clever optimizations to speed up the inference time to quickly speak back to the elderly user, especially since the WiFi was unusable most of the time.
Accomplishments we're proud of
Design and User Experience: We are proud of our design since it encompasses the mood we were aiming for – a warm, welcoming environment, focusing on the good things that happen in life. Large Language Model and Vector Search: We are especially proud of how the LLM turned out and how well the RAG model worked. We spent lots of time prompting the different components to create the warm, empathetic, and welcoming environment the LLM provides. TTS and STT: Although we struggled a bit with this part, we are really proud about how it turned out. We feel we did a great job encompassing the ideals of the product by allowing users to reflect on past memories and connect closer with family.
What we learned
Working with STT and TTS models: many members of our group had never worked with speech-to-text or text-to-speech models, so this was a learning experience for all of us. We learned about the impressive accuracy that the state-of-the-art models are able to achieve but also encountered some of the drawbacks of these models, since many of them don’t work as well with moderate levels of background noise. How to make a great UI:
What's next
Because of time constraints, there were many features and improvements we wanted to implement but could not. Continuous LLM Conversation: We wanted to be able to talk to the LLM continuously without having to press a microphone button. Due to time constraints, we were not able to implement this feature User Personalization and Customization: We aimed to personalize the website to users by adding custom themes, colors, and fonts, but we ran out of time to do so.
Memento
Cal Hacks 11.0 (2024) Winner: Best app built using reflex.dev
Devpost: https://devpost.com/software/memento-1p0jel
Tech Stack
- Python
- Reflex
- Groq
- Chroma
- Google Gemini
- Deepgram
Analysis
View
Metric
- 26
- 11
- 5
Figures cover GitHub contributors during the hackathon window. A co-authored commit counts in full for each author, so per-member totals add up to more than the whole-team figures.
Technology
- PythonIn code
- Google GeminiClaimed
1 of 2 appear in the indexed code. 1 claimed on Devpost could not be matched to code, which may simply mean the tool leaves no trace in the repository.
AI coding agents
No AI coding agent signals were found in this repository.
Detected from committed agent config files and commit authorship. Absence of a signal is not proof an agent was unused.
Codebase size
Source size
45 KB
Source files
7
Counts recognized source files only; vendored directories, binaries and lockfiles are excluded, so this is smaller than the repository on disk.
Repository
AlexLuu1/Memento
14 files · 139 KB · @ 96a7afb
Structure
Application logic
6 files · 43%Domain rules, services and shared utilities.
Supporting
Layers are inferred from where files sit in the tree, not from reading the code. A project that names its directories unconventionally will read oddly here — open the file browser to check anything the diagram implies.
Languages
- Python99%
- Markdown1%
Share of indexed source by file size. Binary and vendored files are excluded.
Dependencies
requirements.txt
pypi · 7- chromadb
- deepgram-sdk
- google.generativeai
- groq
- pillow
- reflex
- reflex_audio_capture
Declared in the repository’s manifests at the indexed commit. A declared package is not proof it is used, and runtime dependencies are listed first.
Feature verification
Display most relevant memory image during conversationVerified
The application will also display the most relevant image to the conversation to help improve the experience
Claimed on Devposthigh confidenceMemento/user.py:176— fileNameGrabber tool call lets Gemini return the most relevant image name, parsed via regex into img_to_displayMemento/user.py:345— UI conditionally renders rx.image using UserState.img_to_display
Elegant, accessible UI built with ReflexVerified
We used Reflex to implement an elegant UI
Claimed on Devposthigh confidenceMemento/Memento.py:1— Entire app is built using the reflex (rx) framework: pages, components, state classes, app = rx.App()
Family album / timeline view of memoriesVerified
Families can upload memories... displayed to the user (implicit in what-it-does; Family Album feature listed in UI copy)
Claimed on readmemedium confidenceMemento/family.py:191— family_index page fetches all Chroma documents and renders a vertical TimelineEvent list sorted by date
Family memory upload (date, description, image)Verified
Families can upload memories that contain a date, description, and image
Claimed on Devposthigh confidenceMemento/family.py:325— add_new_memory page renders a form with date, description, and image upload fieldsMemento/family.py:256— NewMemory.handle_submit and handle_upload store date/description/image into ChromaDB and save the JPEG to the upload dir
Image description auto-generation for uploaded memory photosVerified
implied by 'Image Summary' used in memory retrieval and conversation context (not explicitly a top-level claim but supports 'immersive experience')
Claimed on Devpostmedium confidenceMemento/family.py:306— handle_upload calls genai.upload_file and text_to_img_model.generate_content to produce a description of the uploaded image, appended into the Chroma document
LLM conversational response via GeminiVerified
Feed this information through Gemini, an LLM developed by Google, to give a coherent response that incorporates information from the families' inputs
Claimed on Devposthigh confidenceMemento/user.py:187— genai.GenerativeModel gemini-1.5-flash is instantiated with a system prompt built from retrieved memories, then chat.send_message is called with the transcript
RAG memory retrieval via Chroma vector databaseVerified
Implemented a Chroma database to store the memories and their embeddings for search; query database based on speech input
Claimed on Devposthigh confidenceMemento/user.py:109— chromadb.HttpClient collection.query() retrieves relevant memory documents using the transcript as the queryMemento/family.py:261— NewMemory.handle_submit upserts memory documents/embeddings into the same Chroma collection
Speech-to-text via Whisper/GroqVerified
Integrated Whisper, a speech-to-text model through Groq's fast inference API
Claimed on Devposthigh confidenceMemento/user.py:91— client.audio.transcriptions.create called with model=whisper-large-v3-turbo via Groq client
Text-to-speech via Deepgram to speak response backVerified
Used Deepgram's text-to-speech model to convert the LLM's outputs back to an audio format that we could speak back to the elderly user
Claimed on Devposthigh confidenceMemento/user.py:243— get_tts computed var calls deepgram.speak.v('1').save with SpeakOptions model aura-asteria-en to synthesize audio from text_outputMemento/user.py:353— rx.audio component plays the generated tts_output_file back to the user
Voice conversation with elderly user (speech input)Verified
The elderly user can speak to the application and have a conversation about the details of any memory
Claimed on Devposthigh confidenceMemento/user.py:82— on_data_available captures mic audio via AudioRecorderPolyfill and sends it to Groq Whisper for transcriptionMemento/user.py:285— user_index page wires up mic_button and capture component for recording
Continuous LLM conversation without pressing microphone each timeClaimed only
We wanted to be able to talk to the LLM continuously without having to press a microphone button. Due to time constraints, we were not able to implement this feature
Claimed on Devposthigh confidenceUser personalization and customization (themes, colors, fonts)Claimed only
We aimed to personalize the website to users by adding custom themes, colors, and fonts, but we ran out of time to do so
Claimed on Devposthigh confidenceBest app built using Reflex.dev award (Cal Hacks 11.0 winner)Blocked
Cal Hacks 11.0 (2024) Winner: Best app built using reflex.dev
Claimed on readmelow confidence
An AI agent derived these features from the project’s Devpost page and readme, then searched the code for each one. Verified features are backed by cited code; claimed-only features had no supporting code, which is not by itself proof a feature is missing.
Export this project's context (description, README, evidence, key source files) to chat with an AI agent elsewhere.