(My) Pricecious
Price tracking using A-Eyes 🤦
> [!WARNING]
> This is 100% vibe-coded.
**Pricecious** is a self-hosted, AI-powered price tracking application. It uses **GenAI Vision Models** (OpenAI, Anthropic, Ollama, etc.) to visually analyze product pages, detect prices, and monitor stock status.
## Features
* **AI-Powered Analysis**: Uses GenAI Vision Models to "see" the price and stock status on any webpage, bypassing complex HTML structures.
* **Confidence Scoring**: AI provides confidence scores (0-1) for each extraction, enabling smart business rules and quality monitoring.
* **Robust JSON Parsing**: Hardened parsing pipeline with automatic JSON repair fallback when primary extraction fails.
* **Provider-Specific Optimization**: Leverages native JSON modes and structured output features for OpenAI, Ollama, and other providers.
* **Visual History**: Keeps a screenshot history of every check with full AI metadata (model, provider, confidence, etc.).
* **Smart Scrolling**: Automatically scrolls pages to load lazy-loaded content before capturing.
* **Text Context**: Optionally extracts page text to improve AI accuracy.
* **Notifications**: Supports multi-channel notifications (Discord, Telegram, Email, etc.) via [Apprise](https://github.com/caronc/apprise).
* **Dark Mode**: Beautiful UI with full dark/light mode support.
* **Dockerized**: Easy to deploy with Docker Compose.
## Prerequisites
* **Docker** and **Docker Compose**
* **AI Provider**: An API key for OpenAI, Anthropic, Gemini, OR a local Ollama instance.
* **PostgreSQL**: A database for storing items and history (handled via Docker Compose).
* **Browserless**: A headless browser service for scraping (handled via Docker Compose).
## Quick Start
1. **Create a `docker-compose.yml` file:**
Save the following content to a file named `docker-compose.yml`:
```yaml
services:
app:
image: ghcr.io/ds-sebastian/pricecious:latest
container_name: pricecious-app
ports:
- "8000:8000"
environment:
- DATABASE_URL=postgresql://user:password@db:5432/pricewatch
- BROWSERLESS_URL=ws://browserless:3000
depends_on:
- db
- browserless
extra_hosts:
- "host.docker.internal:host-gateway"
volumes:
- screenshots_data:/app/screenshots
db:
image: postgres:15-alpine
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: password
POSTGRES_DB: pricewatch
volumes:
- postgres_data:/var/lib/postgresql/data
browserless:
image: browserless/chrome:latest
ports:
- "3000:3000"
environment:
- MAX_CONCURRENT_SESSIONS=10
volumes:
postgres_data:
screenshots_data:
```
2. **Start the Application:**
Run the following command in the same directory:
```bash
docker compose up -d
```
3. **Access the Dashboard:**
Open your browser and navigate to `http://localhost:8000`.
## Configuration
### Environment Variables
The following environment variables can be configured in your `docker-compose.yml`:
| Variable | Description | Default | Example |
| :--- | :--- | :--- | :--- |
| `DATABASE_URL` | PostgreSQL connection string | `postgresql://user:password@db:5432/pricewatch` | `postgresql://u:p@localhost:5432/db` |
| `BROWSERLESS_URL` | WebSocket URL for Browserless | `ws://browserless:3000` | `ws://browserless:3000` |
| `LOG_LEVEL` | Application logging level | `INFO` | `DEBUG` |
| `SQL_ECHO` | Log all SQL queries to console | `false` | `true` |
| `CORS_ORIGINS` | Allowed CORS origins (comma-separated) | `*` | `http://localhost:3000,https://myapp.com` |
> [!TIP]
> LiteLLM environment variables should work too to prepopulate AI model default settings
### Scraper Settings
All scraper settings are configured via the **Settings** page in the UI:
* **Smart Scroll**: Enable to handle infinite scroll pages.
* **Text Context**: Enable to send page text to the AI for better accuracy.
* **Scraper Timeout**: Maximum time to wait for page load.
### AI Configuration
All AI settings are configured via the **Settings** page in the UI. No environment variables are required.
**Provider Settings**:
* **Provider**: Choose between OpenAI, Anthropic, Gemini, Ollama, or Custom.
* **Model**: Specify the model name (e.g., `gpt-4o`, `claude-3-5-sonnet`, `gemma3:4b`).
* **API Key**: Enter your API key (not required for Ollama).
* **Base URL**: Required for Ollama or custom OpenAI-compatible endpoints.
**Advanced AI Settings**:
* **Temperature**: Controls output randomness (0.0-1.0).
* **Max Tokens**: Maximum tokens for AI responses.
* **Price/Stock Confidence Thresholds**: Minimum confidence required to update values.
* **Enable JSON Repair**: Automatically attempt to repair malformed JSON responses.
**How Confidence Works**:
- The AI provides a confidence score (0.0 to 1.0) for each extracted value
- Scores represent the AI's subjective probability that the extraction is correct
- If confidence is below the threshold, the value is logged but doesn't overwrite the current value
- Large price changes (>20%) with low confidence (<0.7) are flagged for manual review
- All extractions are saved in history with their confidence scores for analysis
### Notifications
Create **Notification Profiles** in the Settings page using Apprise URLs.
* Example Discord: `discord://webhook_id/webhook_token`
* Example Telegram: `tgram://bot_token/chat_id`
## License
This project is licensed under the GNU General Public License v3.0 - see the [LICENSE](LICENSE) file for details.