Commit graph

102 commits

Author SHA1 Message Date
clucraft
6327fd6cf1 Skip AI verification when multiple price candidates exist
When the scraper finds multiple valid prices (e.g., Amazon main price +
other sellers), skip AI verification entirely. AI was "correcting"
valid alternative prices to the main buy box price.

Now with multiple candidates, users see all options in the modal and
choose themselves - no AI interference.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-24 19:23:04 -05:00
clucraft
3a3291a779 Fix Amazon multi-price extraction and prevent AI override
Amazon products can have multiple prices:
- Main buy box price
- "Other Sellers" prices
- Subscribe & Save prices
- New & Used prices

The scraper now extracts ALL prices, not just the main one. This allows
anchor price matching to find the specific price the user selected.

Also fixed AI verification overriding user's anchor price selection.
When user deliberately chose a price (e.g., "other sellers" at $52.91),
don't let AI "correct" it to the main buy box price ($79.99).

Changes:
- Amazon scraper now collects all price variants
- extractSiteSpecificCandidates handles allPrices array
- Anchor matching now always returns (no fall-through to AI override)
- Increased anchor tolerance from 10% to 15% for small sales
- Added debug logging showing all candidate prices

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-24 19:15:32 -05:00
clucraft
8131017f3a Fix anchor price selection - prioritize anchor over method
The previous logic checked preferred method first, which could select
a wrong price even when anchor price was available. Now:

1. PRIORITY 1: Anchor price - if user confirmed a price, find closest
   match (within 10% tolerance) across ALL candidates
2. PRIORITY 2: Preferred method - only used if no anchor match found
3. PRIORITY 3: Consensus voting

Also added debug logging to trace anchor price saving and retrieval.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-24 19:01:15 -05:00
clucraft
389915a6ec Add anchor price support for variant products
When a user confirms a price from the modal, we now store it as an
"anchor price". On subsequent refreshes, if multiple price candidates
are found (common with variant products like different sizes/colors),
we select the candidate closest to the anchor price.

This fixes the issue where variant products would randomly switch to
a different variant's price on refresh.

Changes:
- Add anchor_price column to products table
- Save anchor price when user confirms a price selection
- Use anchor price to select correct variant on refresh
- 20% tolerance - if no candidate is within 20% of anchor, fall back to consensus

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-24 15:50:18 -05:00
clucraft
bffc427fff Update README with emphasis on Price Voting Modal feature
- Add prominent "You Choose the Price. Always." section at the top
- Explain the 4-method extraction system (JSON-LD, site-specific, CSS, AI)
- Detail the Price Selection Modal and its benefits
- Compare to competitors (Keepa, CamelCamelCamel, Honey)
- Add new "Multi-Strategy Price Extraction" feature section
- Add "Supported Retailers" table with browser rendering info
- Mention AI Arbitration as a new capability

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-24 15:46:04 -05:00
clucraft
196ff8fd0b Fix Best Buy price extraction and add browser rendering for JS-heavy sites
- Fix TypeScript narrowing issue in Best Buy scraper
- Add browser rendering for JS-heavy sites (Best Buy, Target, Walmart, Costco)
- Improve Best Buy site-specific scraper with better selectors and logging
- Skip payment plan prices (/mo, per month, etc.)
- Enhance AI HTML preparation:
  - Extract JSON-LD data before removing scripts
  - Add price element extraction for better context
  - Increase character limit from 15000 to 25000

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-24 15:09:42 -05:00
clucraft
cf23ac9db1 fix: Always show price selection modal and use browser for JS-heavy sites
- Always show price selection modal when adding a product so users can verify
- Use browser rendering for known JS-heavy sites (Best Buy, Target, Walmart, Costco)
- Update modal text to say "Confirm Price" for single candidates

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-24 14:58:58 -05:00
clucraft
4fd04cd160 feat: Multi-strategy price voting system with user selection
- Add multi-strategy voting: runs JSON-LD, site-specific, generic CSS,
  and AI extraction methods in parallel
- Implement consensus voting to select the correct price when methods agree
- Add AI arbitration when extraction methods disagree
- Add PriceSelectionModal for users to select correct price when ambiguous
- Store preferred extraction method per product for faster re-checks
- Add database columns for preferred_extraction_method and needs_price_review

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-24 14:45:51 -05:00
clucraft
40c45b49c8 Fix Best Buy scraper picking up payment plan prices
- Add global filter in priceParser to reject monthly/payment plan prices
- Filters: "/mo", "per month", "payments starting", "4 payments", etc.
- Update Best Buy scraper to check each price element for payment terms
- Prevents scraping "$25/mo" instead of actual "$229.99" price

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-24 04:01:16 -05:00
clucraft
710e4c0483 Update changelog with particle background effect
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-24 03:41:49 -05:00
clucraft
2bbaab8793 Add particle background effect
- Pure CSS/JS particle animation behind all content
- Multiple layers with different speeds for depth effect
- Theme-aware: white particles on dark mode, purple on light mode
- Low opacity for subtle, non-distracting ambiance
- Uses box-shadow technique for performance

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-24 03:41:02 -05:00
clucraft
c4c05236c0 Update changelog for v1.0.3
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-24 03:21:46 -05:00
clucraft
28d6523959 Add Clear button to notification bell dropdown
- Add notifications_cleared_at column to users table
- Clear button marks notifications as seen without deleting history
- Badge and dropdown only show notifications after last clear
- History page still shows all notifications

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-24 03:20:03 -05:00
clucraft
262a91b558 Fix notification history crash when prices are strings
PostgreSQL DECIMAL fields are returned as strings by node-postgres.
Convert to numbers before calling toFixed() to prevent TypeError.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-24 03:10:06 -05:00
clucraft
38faf59d1e Add star history chart to README
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-23 20:40:34 -05:00
clucraft
fe857e3625 Move version info to sidebar in Settings page
- Relocate PriceGhost version, changelog, and GitHub links from bottom
  of page to underneath the left navigation buttons
- Update sidebar CSS to use flexbox for proper layout

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-23 20:37:57 -05:00
clucraft
63fcaebfd8 Add notification history feature with bell icon and history page
- Add notification_history database table for logging all triggered notifications
- Create API endpoints for fetching recent and historical notifications
- Add NotificationBell component in navbar with badge showing recent count
- Dropdown shows 5 most recent notifications with links to products
- Create full NotificationHistory page with filtering by notification type
- Log notifications when sent: price drops, target prices, back-in-stock
- Track which channels (telegram, discord, pushover, ntfy) received each notification
- Update sendNotifications to return which channels succeeded
- Bump version to 1.0.3

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-23 20:32:34 -05:00
clucraft
45363e4d97
Update image in README.md 2026-01-23 14:12:29 -05:00
clucraft
01d6da7cea Center PriceGhost header SVG in viewBox
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-23 13:57:30 -05:00
clucraft
afa4f0c96a Fix stock status false positives for in-stock items
- Remove overly generic pre-order phrases that caused false positives
  ("available in", "coming in", "arriving in" matched normal text)
- Add in-stock phrase priority check - "in stock", "add to cart",
  "add to basket" now take precedence over pre-order detection
- Add Magento 2 stock status detection using stock classes and
  add-to-cart buttons
- Bump version to 1.0.2

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-23 13:56:26 -05:00
clucraft
2c8843ed8a Fix Ghost text gradient - keep end visible at 20% opacity
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-23 13:48:48 -05:00
clucraft
a8126e0fb3 Fix header SVG - widen viewBox to show full Ghost text
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-23 13:46:22 -05:00
clucraft
e18be5bbc7 Add Magento 2 site scraper for better price extraction
- Added dedicated Magento 2 scraper that targets data-price-amount
- Looks for price in correct context (price-box, special-price, finalPrice)
- Properly detects CHF, EUR, GBP, USD currencies
- Improved generic currency detection with multiple text sources
- Fixes CHF price extraction for Degussa gold shop and other Magento sites

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-23 13:43:35 -05:00
clucraft
5a682276b6 Add Magento price selector support
- Added data-price-amount selector (Magento 2 stores numeric price here)
- Added .price-wrapper, .price-box, .special-price selectors
- Extract price directly from data-price-amount attribute
- Detect currency from surrounding text when using numeric attribute
- Fixes CHF price extraction from Magento/Degussa gold shop

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-23 13:35:48 -05:00
clucraft
925ff1cb27 v1.0.1: CI optimization, changelog update
- CI/CD now only rebuilds images when backend/ or frontend/ changes
- Uses dorny/paths-filter to detect which components changed
- README, docs, and asset changes no longer trigger builds
- Updated CHANGELOG with all recent changes
- Bumped version to 1.0.1

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-23 13:31:27 -05:00
clucraft
18cf8125cd
Update header image width in README
Increased the width of the header image from 450 to 500 pixels.
2026-01-23 13:30:58 -05:00
clucraft
5bafab3623
Update header image width in README
Reduced header image width in README.
2026-01-23 13:30:19 -05:00
clucraft
85dc4b9b34
Update header image width in README
Increased the width of the header image from 500 to 600 pixels.
2026-01-23 13:30:00 -05:00
clucraft
9398b5989c Fix README header: remove space, adjust gradient opacity
- Removed space between Price and Ghost (now one word)
- Ghost gradient starts at 85% opacity for smoother transition
- Price text remains fully prominent

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-23 13:26:24 -05:00
clucraft
b8c3b80db7 Add ghostly header SVG for README
- Combined icon + PriceGhost text in single SVG header
- Ghost text has gradient fade effect (solid to transparent)
- Subtle glow filter for ethereal look
- Replaces separate icon and h1 in README

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-23 13:23:54 -05:00
clucraft
25936f4c9d Add Puppeteer fallback for JavaScript-rendered prices
- If no price found in static HTML, automatically try headless browser
- Re-runs all extraction methods on browser-rendered HTML
- Fixes price extraction for Magento, React, Vue, and other JS-heavy sites
- AI extraction now also benefits from rendered HTML

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-23 13:21:07 -05:00
clucraft
61ffafdd8c Detect pre-order/coming soon products as out of stock
- AI verification now checks if product is purchasable RIGHT NOW
- AI returns stockStatus field for pre-order/coming soon detection
- Enhanced generic stock status detection with pre-order phrases:
  - Coming soon, available soon, releases on, pre-order, etc.
  - Notify me when available, join waitlist, etc.
- Pre-order buttons no longer count as Add to Cart
- Fixes issue where unreleased products showed as in stock

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-23 10:55:08 -05:00
clucraft
059336536f Add ghostly wispy effect to Ghost text in navbar
- Ghost text fades from solid to transparent (left to right)
- Soft ethereal glow effect via text-shadow
- Enhanced glow on hover
- Works in both light and dark modes

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-23 10:24:42 -05:00
clucraft
6896dd0c7e Use official PriceGhost icon in header and login page
- Replace ghost emoji with SVG icon in navbar
- Replace ghost emoji with SVG icon on login/register page
- Consistent branding throughout the app

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-23 10:22:00 -05:00
clucraft
3073f1a010 Fix fresh install 500 error - add base table creation to migrations
- Backend now creates all required tables if they do not exist
- Migrations run BEFORE server accepts connections (prevents race condition)
- Server exits if migrations fail instead of running with broken DB
- Fixes registration failure on fresh Docker installs without init.sql

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-23 10:06:51 -05:00
clucraft
5e67e76504 Add version tracking and v1.0.0 release
- Create CHANGELOG.md documenting all features
- Add version.json for version tracking
- Display version in Settings page footer with links to Changelog and GitHub
- Tag release as v1.0.0

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-23 09:54:15 -05:00
clucraft
ccbc188487 Add AI status badges to show verification status on prices
- Add ai_status column to price_history table (verified/corrected/null)
- Track AI verification status through scraper and scheduler
- Display badges next to prices:
  - ✓ AI (green): AI verified the price is correct
  -  AI (orange): AI corrected an incorrect price
- Show badges on Dashboard product cards and ProductDetail page
- Add legend explaining badges in Settings when AI Verification is enabled

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-23 09:45:45 -05:00
clucraft
3d91489f12 Fix AI verification toggle not persisting
The GET and PUT /api/settings/ai endpoints were missing
ai_verification_enabled in the request/response handling.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-23 09:32:49 -05:00
clucraft
715765bc58 Update README with AI verification docs and Ollama support
- Rename section to "Strongly Recommended: Enable AI Features"
- Document AI Extraction (fallback) and AI Verification separately
- Add Ollama as a provider option throughout
- Add AI price verification to features list

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-23 09:26:26 -05:00
clucraft
dc4e7b9665 Add AI price verification feature
When enabled, AI verifies every scraped price to ensure accuracy.
This catches issues like scraped "savings" amounts instead of actual prices.

- Add ai_verification_enabled column to users table
- Create verification prompt and functions for Anthropic, OpenAI, Ollama
- Integrate verification step into scraper after traditional scraping
- Add verification toggle to Settings page (separate from AI extraction)
- AI verification is independent of AI extraction fallback

Flow: Traditional scraping -> AI verification (if enabled) -> AI extraction fallback (if no price found)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-23 09:24:17 -05:00
clucraft
7afa3ccec3 Update README with new icon and recent features
- Add PriceGhost logo at top of README
- Center header with icon and description
- Add ntfy.sh to notification options and setup guide
- Add Ollama as local AI extraction option
- Add ntfy test endpoint to API reference

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-23 04:39:33 -05:00
clucraft
31732b814f Fix Newegg scraper picking up bundle savings instead of product price
- Add helper to detect savings/combo/bundle containers
- Prioritize JSON-LD data as primary price source (most reliable)
- Skip price elements inside savings containers
- Add minimum price threshold to filter out discount amounts

Fixes issue where $189.99 bundle savings was extracted instead of
actual $675.59 product price for items like AMD Ryzen 9 9950X3D.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-23 04:25:12 -05:00
clucraft
1029a0b08c
Update README.md 2026-01-23 04:21:21 -05:00
clucraft
2079357b9b
Update README.md 2026-01-23 04:20:50 -05:00
clucraft
3cedae65bc Add PWA support for mobile app-like experience
- Create ghost icon with gradient background and price tag
- Add manifest.json with app metadata and icon references
- Implement service worker with network-first caching strategy
- Update index.html with PWA meta tags and SW registration

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-23 04:11:27 -05:00
clucraft
3d6af13ac4 Add ntfy.sh notification support
- Add ntfy_topic and ntfy_enabled columns to database
- Add sendNtfyNotification function with emoji tags
- Add /settings/notifications/test/ntfy endpoint
- Add ntfy section in Settings UI with topic input
- Show ntfy badge in ProductDetail notification status

ntfy.sh is a free, simple notification service - no account needed.
Users just pick a topic name and subscribe in the ntfy app.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 21:02:49 -05:00
clucraft
a4da43c127 Return actual sensitive values from API for visibility toggle
Backend:
- Update /settings/notifications to return actual tokens/keys
- Update /settings/ai to return actual API keys

Frontend:
- Update NotificationSettings and AISettings types
- Populate form fields with actual saved values on load
- Eye toggle now reveals actual stored values
- Always show toggle button for consistent UX

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 20:45:06 -05:00
clucraft
b885e4ef57 Fix password visibility toggle UX
- Change confusing placeholder from bullets to "Saved - enter new value to replace"
- Only show eye toggle when field has actual content to reveal
- Add z-index and improved click handling for toggle button

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 20:39:47 -05:00
clucraft
81bbd8538f Add password visibility toggle for sensitive fields in Settings
- Create reusable PasswordInput component with eye icon toggle
- Apply to Telegram bot token, Discord webhook, Pushover keys
- Apply to Anthropic and OpenAI API keys
- Toggle switches between masked and visible text

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 20:33:58 -05:00
clucraft
082aae8789 Add Ollama support for local AI-powered price extraction
- Add database migration for ollama_base_url and ollama_model columns
- Update backend models and queries for Ollama settings
- Add extractWithOllama function using Ollama's /api/chat endpoint
- Add /api/settings/ai/test-ollama endpoint to test connection and list models
- Update frontend Settings page with Ollama configuration UI
- Support model selection from dropdown after testing connection

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 20:14:14 -05:00