feat: brain service — self-contained second brain knowledge manager

Full backend service with:
- FastAPI REST API with CRUD, search, reprocess endpoints
- PostgreSQL + pgvector for items and semantic search
- Redis + RQ for background job processing
- Meilisearch for fast keyword/filter search
- Browserless/Chrome for JS rendering and screenshots
- OpenAI structured output for AI classification
- Local file storage with S3-ready abstraction
- Gateway auth via X-Gateway-User-Id header
- Own docker-compose stack (6 containers)

Classification: fixed folders (Home/Family/Work/Travel/Knowledge/Faith/Projects)
and fixed tags (28 predefined). AI assigns exactly 1 folder, 2-3 tags, title,
summary, and confidence score per item.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Yusuf Suleman
2026-04-01 11:48:29 -05:00
parent 51a8157fd4
commit 8275f3a71b
73 changed files with 24081 additions and 4209 deletions

View File

@@ -15,6 +15,8 @@ export interface Food {
protein_per_base: number;
carbs_per_base: number;
fat_per_base: number;
sugar_per_base: number;
fiber_per_base: number;
status: string;
image_path?: string;
servings: FoodServing[];
@@ -55,6 +57,8 @@ export interface FoodEntry {
snapshot_protein: number;
snapshot_carbs: number;
snapshot_fat: number;
snapshot_sugar: number;
snapshot_fiber: number;
source: string;
entry_method: string;
raw_text?: string;
@@ -69,6 +73,8 @@ export interface DailyTotals {
total_protein: number;
total_carbs: number;
total_fat: number;
total_sugar: number;
total_fiber: number;
entry_count: number;
}
@@ -81,6 +87,8 @@ export interface Goal {
protein: number;
carbs: number;
fat: number;
sugar: number;
fiber: number;
is_active: number;
}
@@ -103,6 +111,8 @@ export interface MealTemplateItem {
snapshot_protein: number;
snapshot_carbs: number;
snapshot_fat: number;
snapshot_sugar: number;
snapshot_fiber: number;
}
export interface QueueItem {
@@ -126,6 +136,8 @@ export interface ExternalFood {
protein_per_100g: number;
carbs_per_100g: number;
fat_per_100g: number;
sugar_per_100g: number;
fiber_per_100g: number;
serving_size_text?: string;
serving_grams?: number;
source: string;