Store your mind — A personal knowledge storage system using RAG and Graph Database.
Memox lets you save quotes, images, and web content as interconnected knowledge nodes. Search your memory semantically using natural language queries.
- Semantic Search — Find knowledge by meaning, not just keywords (powered by LEANN)
- Graph Storage — Store knowledge as nodes in Neo4j for future relationship queries
- Web Scraping — Automatically extract content from URLs via Firecrawl
- Image Storage — Store images in Cloudflare R2 (S3-compatible)
- RESTful API — Simple FastAPI endpoints with OpenAPI docs
┌─────────────┐ ┌──────────────────────────────────────────┐
│ Client │────▶│ FastAPI │
└─────────────┘ └──────────────────────────────────────────┘
│
┌─────────────────────────────┼─────────────────────────────┐
▼ ▼ ▼
┌───────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ Firecrawl │ │ Neo4j │ │ Cloudflare │
│ (Scraper) │ │ (Graph DB) │ │ R2 (Storage) │
└───────────────┘ └─────────────────┘ └─────────────────┘
│
▼
┌─────────────────┐
│ LEANN │
│ (Vector DB) │
└─────────────────┘
- Python 3.11+
- uv package manager
- Neo4j (local or cloud)
- Firecrawl API key (optional, for URL scraping)
- Cloudflare R2 credentials (optional, for image storage)
# Clone the repository
git clone <your-repo-url>
cd memox
# Install dependencies
uv sync
# Configure environment
cp .env.example .env
# Edit .env with your credentials
# Start Neo4j (using Docker)
docker run -d --name neo4j \
-p 7474:7474 -p 7687:7687 \
-e NEO4J_AUTH=neo4j/password \
neo4j:latest
# Run the server
uv run uvicorn memox.main:app --reloadThe API will be available at http://localhost:8000
Create a .env file from the example:
| Variable | Description | Required |
|---|---|---|
NEO4J_URI |
Neo4j connection URI | Yes |
NEO4J_USER |
Neo4j username | Yes |
NEO4J_PASSWORD |
Neo4j password | Yes |
FIRECRAWL_API_KEY |
Firecrawl API key for web scraping | No |
R2_ENDPOINT |
Cloudflare R2 endpoint URL | No |
R2_ACCESS_KEY |
R2 access key ID | No |
R2_SECRET_KEY |
R2 secret access key | No |
R2_BUCKET |
R2 bucket name | No |
LEANN_INDEX_PATH |
Path to store LEANN vector index | No |
Visit http://localhost:8000/docs for Swagger UI.
GET /health{"status": "ok"}POST /knowledge
Content-Type: application/jsonRequest Body:
| Field | Type | Description |
|---|---|---|
quote |
string | Text/quote to store (optional) |
image_url |
string | Image URL to download and store (optional) |
url |
string | Source URL to scrape for context (optional) |
At least one field must be provided.
Example:
curl -X POST http://localhost:8000/knowledge \
-H "Content-Type: application/json" \
-d '{
"quote": "The only way to do great work is to love what you do.",
"url": "https://example.com/article"
}'Response:
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"quote": "The only way to do great work is to love what you do.",
"context": "Extracted content from the URL...",
"image_url": null,
"source_url": "https://example.com/article",
"created_at": "2026-01-02T10:00:00Z"
}GET /knowledge/search?q={query}&top_k={limit}Query Parameters:
| Param | Type | Default | Description |
|---|---|---|---|
q |
string | required | Search query |
top_k |
integer | 10 | Number of results (1-100) |
Example:
curl "http://localhost:8000/knowledge/search?q=great+work&top_k=5"Response:
{
"query": "great work",
"results": [
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"quote": "The only way to do great work is to love what you do.",
"context": "...",
"image_url": null,
"source_url": "https://example.com/article",
"score": 0.92
}
]
}memox/
├── pyproject.toml # Project dependencies
├── .env.example # Environment template
└── src/memox/
├── __init__.py
├── main.py # FastAPI application
├── config.py # Settings management
├── models.py # Pydantic schemas
├── routers/
│ └── knowledge.py # API endpoints
└── services/
├── scraper.py # Firecrawl HTTP client
├── storage.py # R2 (S3) operations
├── graph.py # Neo4j operations
└── vector.py # LEANN vector search
# Run with auto-reload
uv run uvicorn memox.main:app --reload
# Run on specific port
uv run uvicorn memox.main:app --port 3000
# Type checking (install mypy first)
uv run mypy src/memox-
Store Knowledge
- If
urlis provided: Scrape content via Firecrawl API - If
image_urlis provided: Download and upload to R2 - Create a node in Neo4j with all metadata
- Index the combined text (quote + context) in LEANN
- If
-
Search Knowledge
- Convert query to vector using LEANN
- Find similar nodes by semantic similarity
- Return ranked results from Neo4j
| Component | Technology |
|---|---|
| Web Framework | FastAPI |
| Vector DB | LEANN |
| Graph DB | Neo4j |
| Object Storage | Cloudflare R2 |
| Web Scraping | Firecrawl |
| Package Manager | uv |
MIT