Reddit → Bar Assistant cocktail recipe import pipeline with LLM-powered parsing and a side-by-side review UI.
- Multi-source fetching: Import from XLSX spreadsheets, local HTML files, PullPush API, or Browserless.io
- Multi-LLM parsing: Claude, OpenAI, Google AI, Ollama (local), LM Studio (local)
- Side-by-side review: Original Reddit post on the left, parsed recipe proposal on the right
- Direct BA import: Approve recipes and they're POSTed directly to your Bar Assistant instance, including images
- Ingredient matching: Auto-matches parsed ingredients against your BA ingredient database
- Persistent state: Recipe queue and settings survive container restarts
- Docker-ready: Single container, minimal config
git clone https://github.com/YOUR_USER/cocktail-pipeline.git
cd cocktail-pipeline
docker compose up -dnpm install
npm run devFrontend runs on :5173 (Vite), backend on :3847 (Express). Vite proxies /api/* to the backend automatically.
All configuration is done through the Settings page in the UI:
| Setting | Description |
|---|---|
| BA API URL | Your Bar Assistant API base URL |
| BA API Token | Bearer token for BA authentication |
| Browserless Key | Optional — for fetching Reddit posts via headless Chrome |
| LLM Providers | Add one or more: Claude, OpenAI, Google, Ollama, LM Studio |
When running in Docker, local LLM endpoints should use http://host.docker.internal:11434 (Ollama) or http://host.docker.internal:1234 (LM Studio) instead of localhost.
- Settings → Configure BA connection and LLM provider(s)
- Fetch → Load recipes from spreadsheet or HTML files
- Browse → Filter/search the recipe queue
- Parse & Review → Select a recipe, parse with your chosen LLM, review the proposal side-by-side
- Approve/Edit/Reject → Approved recipes are imported to BA with images
The ./data volume stores:
html/— Fetched Reddit post HTML filesimages/— Downloaded cocktail imagespipeline-state.json— Recipe queue, config (minus API keys), and processing state
The Express backend proxies all external calls to avoid CORS issues:
| Endpoint | Purpose |
|---|---|
GET/POST /api/ba/* |
Bar Assistant API proxy |
POST /api/ba-image/:id |
Upload images to BA cocktails |
POST /api/browserless/content |
Browserless.io proxy |
GET /api/pullpush/submission |
PullPush Reddit archive |
GET /api/pullpush/comments |
PullPush comments |
POST /api/llm/chat |
LLM inference proxy (all providers) |
POST /api/import/xlsx |
Parse XLSX spreadsheet |
GET/POST /api/files/html |
Local HTML file management |
GET /api/state |
Load persisted state |
POST /api/state |
Save state |
┌─────────────────────────────────────────────┐
│ Docker Container │
│ │
│ ┌─────────┐ ┌──────────────────────┐ │
│ │ React │───▶│ Express Backend │ │
│ │ Frontend │ │ │ │
│ │ (Vite) │ │ /api/ba/* ──▶ BA │ │
│ │ │ │ /api/llm/* ──▶ LLM │ │
│ └─────────┘ │ /api/files ──▶ disk │ │
│ └──────────────────────┘ │
│ │ │
│ ./data/ volume │
└─────────────────────────────────────────────┘