Curio is a deterministic-first taste engine for discovering anime, manga, and animated films. Recommendations come from a weighted scoring engine, not an LLM.
backend/
app/
api/
core/
models/
services/
scoring/
data/
frontend/
docs/
cd backend
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
uvicorn app.main:app --reloadAPI defaults to http://127.0.0.1:8000.
POST /recommend- Input:
UserPreferences(core taste + refinement/session signals) - Output:
RecommendationResponsewith ranked items and response metadata
curl -X POST http://127.0.0.1:8000/recommend \
-H "Content-Type: application/json" \
-d '{
"tone": "emotional",
"pacing": "medium",
"format": "series",
"complexity": "complex",
"violenceTolerance": "medium",
"discoveryMode": "hidden_gems",
"recommendationMode": "stretch",
"commitmentLevel": "medium",
"favoriteTitles": ["Monster"],
"avoidTitles": ["romance"],
"likedTitles": ["Odd Taxi"],
"dislikedTitles": []
}'{
"recommendations": [
{
"id": "monster",
"title": "Monster",
"imageUrl": "https://...",
"genres": ["Psychological", "Thriller"],
"tags": ["cat-and-mouse", "slow-burn"],
"rating": 8.9,
"score": 83.4,
"scoreBreakdown": {"format": 25.0, "tone": 22.0},
"matchReasons": ["fits your emotional tone preference"],
"explanation": "Picked because it fits your emotional tone preference.",
"detailsUrl": "https://myanimelist.net/search/all?q=Monster"
}
],
"meta": {
"summary": "Top picks tuned for emotional tone, medium pacing, medium commitment, and stretch mode.",
"appliedRefinements": ["session likes incorporated", "stretch mode"]
}
}cd frontend
python -m http.server 4173Open http://127.0.0.1:4173.
The frontend uses a curio-api-base meta tag (or window.CURIO_API_BASE) to configure backend URL.
Each ContentItem is scored by explicit weighted signals:
- format / tone / pacing / complexity
- violence tolerance
- mainstream vs hidden gems discovery preference
- favorite overlap
- session refinements (liked/disliked titles)
- avoid-term penalties
- recommendation mode and commitment-level adjustments
Explanations are assembled from scored signals only.