Commit graph

92 commits

Author SHA1 Message Date
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
clucraft
6c2aece1e8 Add stock status history tracking and timeline visualization
- Create stock_status_history table to track status changes over time
- Add stockStatusHistoryQueries with getByProductId, recordChange, getStats
- Update scheduler to record status changes
- Update product creation and manual refresh to record initial/changed status
- Add GET /products/:id/stock-history API endpoint
- Create StockTimeline component with:
  - Visual timeline bar showing in-stock (green) vs out-of-stock (red)
  - Availability percentage
  - Outage count and duration stats
- Integrate timeline into ProductDetail page

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 14:23:55 -05:00
clucraft
4928d6b9d3 Add Swiss franc (CHF) and improve Euro currency support
- Add CHF to currency detection patterns in priceParser
- Add getCurrencySymbol helper in notifications service
- Update all frontend price formatting to support CHF
- Swiss francs display as "CHF 29.99" format

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 14:16:01 -05:00
clucraft
c2cec6d4f1 Update README with current features and AI recommendation
- Add "Built by AI. Built Right." section addressing AI code quality
- Add prominent section recommending AI extraction feature
- Document all current features including Pushover, notification toggles,
  dark mode, countdown timers, and progress bars
- Update notification setup docs with toggle information
- Add Pushover setup instructions

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 14:09:57 -05:00
clucraft
433c0a0b12 Add toggles to enable/disable notification channels
- Add telegram_enabled, discord_enabled, pushover_enabled columns to database
- Update notification service to check enabled status before sending
- Add toggle switches in Settings UI for each configured channel
- Update ProductDetail to only show badges for enabled channels
- Channels default to enabled so existing users keep notifications

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 14:07:44 -05:00
clucraft
f1deb924d8 Show all configured notification channels on product page
- Add Pushover badge to notification settings section
- Update description to clarify all channels receive notifications
- Fix condition to show section when Pushover is configured

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 13:55:40 -05:00
clucraft
3fa913814d Add Pushover notification support
- Add pushover_user_key and pushover_app_token columns to users table
- Add sendPushoverNotification function to notifications service
- Add Pushover test endpoint
- Add Pushover settings UI in Settings page
- User provides both User Key and App Token (self-hosted friendly)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 13:48:31 -05:00
clucraft
3b7dce8bde Fix countdown timer using server's next_check_at
- Add next_check_at to Product interface
- Use server-calculated next check time instead of client-side estimate
- Accounts for server-side jitter (±5 min) correctly

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 08:18:26 -05:00
clucraft
d09850d84e Add progress bar and countdown timer to product cards
- Show time remaining until next refresh (e.g., "12m 45s")
- Animated progress bar at bottom of card (blue → cyan → green gradient)
- Glowing edge effect on the progress bar leading point
- Pulse animation when progress reaches 100%

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 08:08:15 -05:00
clucraft
e8123b27dc Add 5 and 10 minute refresh interval options
- Add 5, 10, and 15 minute intervals to both ProductForm and ProductDetail
- Show warning when 5 minute interval is selected (rate limiting risk)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 07:48:24 -05:00
clucraft
0a762eba76 Hide sign up link when registration is disabled
- Check registration status on login page load
- Only show sign up link if registration is enabled

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