Project Info
Inspiration
Two weeks ago, I spent 20 minutes explaining my background to ChatGPT for career advice. The next day, I switched to Claude for the same conversation... and had to start over. Then I opened my IDE, and... same thing. I realized: We're in an AI revolution, but memory is still stuck in the 1990s. Every AI tool treats you like a stranger. Your context dies the moment you switch platforms. We use 5-7 AI tools daily (ChatGPT, Claude, Cursor, Copilot, Notion AI) but switching between services means losing all context, making every conversation repetitive and disconnected. Memory isn't just a missing feature. It's the fundamental infrastructure layer AI needs to be truly intelligent. Without it, we're talking to the world's smartest assistant with amnesia. That's why we built Synk.
What it does
Synk is the universal memory layer for AI. It's a cross-platform memory system that works across desktop, web, IDEs, and terminals. It captures, structures, and recalls key personal context so every AI you use instantly feels personalized. Here's how it works: 1. Capture Once, Intelligently You tell ChatGPT: "I'm a Berkeley student in SF, .... vegetarian,... job hunting in AI safety" Synk extracts and structures what matters: location, preferences, facts, goals Upload files like your resume → Synk automatically extracts relevant context (name, college, work experience) 2. Recall Everywhere, Instantly Switch to Claude: "Find me a breakfast spot" → Synk intelligently injects "SF, vegetarian, student budget" based on relevance. Open up Cursor: "Tell me an app that I can build that aligns with my interests and would make my resume stronger." → Already knows your background and target roles No re-explaining. Ever. 3. Works Across Everything Desktop apps, websites, IDEs, terminals. One memory, infinite platforms Every AI interaction becomes context-aware and personalized
How we built it
We built Synk as a three-layer architecture: 1. Capture Layer (Intelligent Extraction) Integrated hooks into popular AI interfaces (ChatGPT, Claude, Cursor, terminal) Built an LLM-powered extraction engine that identifies and categorizes personal context into structured types: preferences, facts, events, notes, tasks, ideas File parsing system to extract context from uploads (resumes, documents, notes) 2. Memory Layer (Storage & Structure) Created a semantic memory database that stores context as structured, queryable entities Privacy-first encryption to ensure user data stays secure Deduplication and conflict resolution to keep memory clean and accurate 3. Injection Layer (Context Recall) Real-time context retrieval that identifies relevant memories based on the current conversation Built adapters for each platform (browser extension, desktop app, IDE plugin, terminal wrapper) Seamless injection of context into AI prompts before they're sent to the model
Challenges we ran into
1. Intelligent Context Extraction Not everything someone says is worth remembering — we had to build smart filters to capture signal, not noise Teaching the system to distinguish between facts ("I live in SF"), preferences ("I'm vegetarian"), and temporary context ("I'm hungry right now") 2. Cross-Platform Integration Each AI platform has different APIs, UI structures, and access methods Building a universal adapter layer that works across web, desktop, IDE, and terminal without breaking user experience 3. Context Relevance Knowing when to inject memory is just as important as what to inject Building a retrieval system that surfaces the right context at the right time without overwhelming the AI or the user
Accomplishments we're proud of
Built a working universal memory layer that actually works across multiple AI platforms in one weekend Intelligent extraction that works — our system accurately categorizes personal context with 85%+ accuracy Real cross-platform support — not just a browser extension, but working integrations for desktop, web, IDEs, and terminal Made AI feel personal — experiencing Synk for the first time genuinely feels like AI finally "gets you"
What we learned
1. Memory is infrastructure, not a feature The more we built, the more we realized this isn't just a nice-to-have — it's foundational to making AI truly useful 2. Context is king The quality of AI responses dramatically improves when you inject even small amounts of relevant personal context 3. The problem is universal Everyone we talked to during the hackathon had the same pain point — this isn't a niche problem, it's the problem 4. LLMs are great at structure Using LLMs to extract and categorize information from natural language works surprisingly well
What's next
Immediate (Next 3 months): Expand platform support: Notion AI, GitHub Copilot, VS Code, more IDEs Build memory management UI: let users view, edit, and delete their memory graph Improve extraction accuracy with fine-tuning and user feedback loops Medium-term (6-12 months): Shared memory spaces for teams — imagine your whole team's AI tools having shared context about projects, decisions, and preferences Smart memory suggestions — proactively suggest what context to capture based on conversation patterns Memory analytics — show users how their memory is being used and what's most valuable Long-term Vision: Become the standard memory protocol for AI — the HTTP of AI memory Build an open memory format that any AI tool can plug into Create a memory marketplace where users can share anonymized memory structures (e.g., "memories for software engineers" or "memories for students") The big picture: Just like the internet needed HTTP as its universal protocol, AI needs a universal memory layer. Synk is that layer. We're building the memory infrastructure for the AI era.
Synk - Universal Memory Layer
A production-ready universal memory layer that extracts personal information from text and files using Claude AI, then stores and retrieves memories using hybrid search with Elasticsearch cloud.
Quick Start
1. Install Dependencies & Config
cp env.example .env # copy env file and add keys
pip install -r requirements.txt
2. Test complete flow
You can test the complete flow by running the end-to-end test.
python test_e2e_flow.py
3. Test Memory Extraction
Text Input Extraction
python tests/test_definite_extraction.py
File Processing (PDF, DOCX, Images, Text)
python tests/test_file_extraction.py
Resume Processing with MCP Prompts
# Test with PDF resume
python tests/test_resume.py tests/sample_resume_2.pdf
# Test with PNG resume (OCR)
python tests/test_resume.py tests/example_resume.png
# Test with DOCX resume
python tests/test_resume.py tests/sample_resume_3.pdf
4. Run the Hybrid Search Demo
python3 examples/hybrid_search_demo.py
5. Run Test Suite
python3 tests/test_hybrid_search.py
6. Start MCP Server
python3 mcp_server.py
Or using FastMCP CLI:
fastmcp run mcp_server.py:mcp
This will:
- Start the MCP server for LLM integration
- Expose hybrid search and memory extraction as MCP tools
Project Structure
memry-mcp/
├── models/
│ └── memory.py # Memory data models and validation
├── utils/
│ ├── claude_extractor.py # Claude AI memory extraction
│ └── file_processor.py # File processing (PDF, DOCX, OCR)
├── hybrid_search_client.py # Core hybrid search functionality
├── hybrid_search_service.py # High-level service interface
├── examples/ # Example applications
│ └── hybrid_search_demo.py # Demo application
├── tests/ # Test suite
│ ├── test_definite_extraction.py # Text extraction tests
│ ├── test_file_extraction.py # File processing tests
│ ├── test_resume.py # Resume processing tests
│ ├── test_hybrid_search.py # Search functionality tests
│ ├── example_resume.png # Sample resume (image)
│ ├── sample_resume_2.pdf # Sample resume (PDF)
│ └── sample_resume_3.pdf # Sample resume (PDF)
├── docs/ # Documentation
│ └── ARCHITECTURE.md # Architecture documentation
├── requirements.txt # Dependencies
└── README.md # This file
Architecture
Service Layers
- Client Layer: Direct Elasticsearch operations and query construction
- Service Layer: High-level interface with formatting and analysis
- Demo Layer: Example applications and usage demonstrations
How It Works
┌─────────────────────┐ ┌──────────────────┐
│ Hybrid Search │────│ Elasticsearch │
│ Service Layer │ │ (Cloud) │
│ │ │ │
│ • Client Layer │ │ • semantic_text │
│ • Service Layer │ │ • text search │
│ • Demo Application │ │ • hybrid search │
└─────────────────────┘ └──────────────────┘
Key Features
🧠 Claude AI Memory Extraction
- Intelligent Processing: Uses Claude AI to extract personal information from text and files
- Definite-Only Extraction: Only extracts explicitly stated information (no inference)
- High Confidence: All extracted memories have 100% confidence scores
- Multiple Memory Types: Supports preferences, facts, events, notes, tasks, and ideas
📄 Universal File Processing
- PDF Processing: Extract text from PDF documents
- DOCX Support: Process Microsoft Word documents
- Image OCR: Extract text from images using Tesseract OCR
- Text Files: Handle plain text files
- Auto-Detection: Automatically detects file types and processing methods
🔍 Hybrid Search Capabilities
- Semantic Search: Find content by meaning using ELSER model
- Text Search: Traditional keyword matching for exact terms
- Hybrid Approach: Combines both for optimal results
- Performance Analysis: Built-in timing and scoring metrics
🚀 MCP Server Integration
- FastMCP Framework: Modern, Pythonic MCP server implementation
- LLM-Ready Tools: Expose functionality as MCP tools for AI applications
- Memory Management: Extract, store, and search personal memories
- Batch Operations: Efficient processing of multiple queries
Example Queries
- "Python performance optimization" → Finds Python optimization content
- "Database query tuning" → Finds database performance content
- "Machine learning evaluation" → Finds ML evaluation content
- "API design best practices" → Finds API development content
MCP Tools
The MCP server exposes the following core tools for LLM applications:
search_memories
Search through personal memories using hybrid search.
- Parameters:
query(string),limit(int, default: 5),min_score(float, default: 8.0) - Returns: Search results with scores and metadata
extract_memories
Extract personal memories from text or files using Claude AI.
- Parameters:
input_text(string, optional): Direct text inputinput_file(string, optional): File path for processingfile_type(string, optional): File type ("text", "pdf", "docx", "image")source(string, default: "chat")
- Returns: Extracted memories with confidence scores
- Supported Files: PDF, DOCX, images (PNG, JPG), text files
MCP Usage
The MemMe MCP server exposes your hybrid search and memory management capabilities as tools for LLM applications. See MCP_USAGE.md for detailed usage instructions.
Quick MCP Examples
Text Extraction
import asyncio
from fastmcp import Client
async def main():
async with Client("http://localhost:8000/mcp") as client:
# Search memories
result = await client.call_tool("search_memories", {
"query": "Where should I eat breakfast?",
"limit": 3
})
print(f"Search results: {result}")
asyncio.run(main())
What You'll See
The demo will show:
- Service initialization and connection
- Individual hybrid search results with scores
- Batch search processing
- Performance metrics and analysis
- Real-time search with your actual data
Requirements
- Python 3.7+
elasticsearchpackage- Your Elasticsearch cloud instance (already configured)
Flow
- User says: "I love Italian food and prefer morning meetings"
- Claude AI processing (
claude_extractor.py) -- extracts personal info from the user. Analysis result:
[
{
"type": "preference",
"content": "User loves Italian food",
"confidence": 1.0
},
{
"type": "preference",
"content": "User prefers morning meetings",
"confidence": 1.0
}
]
- Memory object creation
for item in extracted_data:
if all(key in item for key in ['type', 'content', 'confidence']):
try:
memory_type = MemoryType(item['type'])
memory = Memory(
type=memory_type,
content=item['content'],
source=SourceType.CHAT,
confidence=1.0, # Always 1.0 for definite information
)
memories.append(memory)
- Created Memory Objects:
Memory(
id=UUID('12345678-1234-5678-9012-123456789abc'),
type=MemoryType.PREFERENCE,
content="User loves Italian food",
source=SourceType.CHAT,
created_at=datetime(2025, 10, 25, 19, 2, 30),
confidence=1.0
)
Memory(
id=UUID('87654321-4321-8765-2109-987654321def'),
type=MemoryType.PREFERENCE,
content="User prefers morning meetings",
source=SourceType.CHAT,
created_at=datetime(2025, 10, 25, 19, 2, 30),
confidence=1.0
)
- Store in Elasticsearch - these memories can stored as Elasticsearch documents
- Search & Retrieval: Later, the user asks "Where should I eat dinner tonight?"
- Hybrid search execution:
def hybrid_search(self, query: str, limit: int = 5) -> Dict[str, Any]:
search_body = {
"query": {
"bool": {
"should": [
{
"match": {
"content": {
"query": query,
"boost": 1.0
}
}
},
{
"semantic": {
"field": "text",
"query": query,
"boost": 1.5
}
}
]
}
},
"size": limit,
"_source": ["content", "source", "category", "tags"]
}
Search Process:
- Text Search: Looks for keywords like "eat", "dinner" → Low relevance
- Semantic Search: ELSER model understands "dinner" relates to "Italian food" → High relevance
- Combined Scoring: Semantic match gets higher boost (1.5x vs 1.0x)
- Now, we get a context-aware recommendation:
Based on your preferences:
- You love Italian food
- Consider Italian restaurants for dinner tonight
- Score: 2.34 (High confidence match)
Complete Data Flow Diagram
User Input: "I love Italian food and prefer morning meetings"
↓
PHASE 1: EXTRACTION
Claude AI → Extract personal info → Create Memory objs
↓
PHASE 2: STORAGE
Memory.to_vector_document() → Elasticsearch indexing
↓
PHASE 3: RETRIEVAL
User query → Hybrid search → Semantic + Text matching
↓
PHASE 4: RESPONSE
Format results → Confidence scoring → Smart suggestions
Analysis
View
Metric
- 14
- 14
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
- AnthropicIn code
- FastAPIIn code
- PythonIn code
3 of 3 appear in the indexed code.
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
113 KB
Source files
25
Counts recognized source files only; vendored directories, binaries and lockfiles are excluded, so this is smaller than the repository on disk.
Repository
calhacks12/mem-me
31 files · 285 KB · @ 9231d89
Structure
Application logic
13 files · 42%Domain rules, services and shared utilities.
Data & schema
1 file · 3%Schema definitions, migrations and data access.
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
- Python77%
- Markdown22%
- Shell1%
Share of indexed source by file size. Binary and vendored files are excluded.
Dependencies
requirements.txt
pypi · 11- anthropic
- elasticsearch
- fastapi
- groq
- Pillow
- PyPDF2
- pytesseract
- python-docx
- python-dotenv
- python-multipart
- uvicorn
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.
This project’s features have not been analysed yet.
Export this project's context (description, README, evidence, key source files) to chat with an AI agent elsewhere.