- Add gotify_url, gotify_app_token, gotify_enabled columns to users table
- Add sendGotifyNotification function with priority levels
- Add testGotifyConnection function to verify server connectivity
- Add test-gotify endpoint for connection testing before save
- Add Gotify section in Settings with:
- Server URL input with Test Connection button
- App Token input (masked)
- Enable/disable toggle
- Send Test button (after configured)
- Include Gotify in notification dispatching
Gotify is a self-hosted push notification server popular in the
self-hosted community, complementing the existing ntfy support.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add ai_extraction_disabled column to products table
- Add toggle in Advanced Settings alongside AI verification disable
- Pass skipAiExtraction flag through scheduler to scraper
- Skip AI extraction fallback when flag is set for product
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add anthropic_model and openai_model columns to database
- Allow users to select their preferred AI model in settings
- Update defaults to current models (Claude Haiku 4.5, GPT-4.1 Nano)
- Include model options: Claude 4.5 series, GPT-4.1/5.1 series
- Pass user-selected model to all AI extraction/verification functions
- Log which model is being used for debugging
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Users can now disable AI verification for individual products that
AI is having trouble with (e.g., Amazon products where AI keeps
picking the main buy box price instead of "other sellers").
Changes:
- Add ai_verification_disabled column to products table
- Add toggle in product detail page under "Advanced Settings"
- Pass skip flag to scrapeProductWithVoting
- Skip AI verification when flag is set
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 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>
- 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>
- 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>
- 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>
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>
- 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>
- 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>
- 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>
- 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>
- 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>
- 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>
- 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>
- 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>
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>
- 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>
- 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>
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>
- 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>
- 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>
- 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>
- 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>
- 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>
- 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>
- 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>
- 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>
- 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>
- 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>
- 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>
- 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>
- Use system dark/light preference on first visit
- Listen for system theme changes and update automatically
- Only persist to localStorage when user manually toggles
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add name field to auth login/register responses
- Update User interface in AuthContext to include name
- Show name (or email as fallback) in navbar dropdown
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add AI extraction service supporting Anthropic (Claude) and OpenAI
- Add AI settings UI in Settings page with provider selection
- Add database migration for AI settings columns
- Integrate AI fallback into scraper when standard methods fail
- Add API endpoints for AI settings and test extraction
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Always show checkboxes next to product items
- Add floating action bar at bottom when items are selected
- Add dropdown menu with bulk actions:
- Set Price Drop Alert (prompts for threshold)
- Set Target Price (prompts for target)
- Enable Stock Alerts
- Delete Selected
- Remove "Select multiple" toggle in favor of always-on selection
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Features:
- Target price alerts: Set a specific price target and get notified when reached
- Historical low indicator: Badge showing when current price is at/near all-time low
- Bulk actions: Select multiple products to delete at once
- Dashboard summary: Shows total products, items at lowest price, at target, biggest drops
Backend changes:
- Add target_price column to products table
- Add target_price notification type with Telegram/Discord support
- Include min_price in product queries for historical low detection
- Update scheduler to check target price conditions
Frontend changes:
- Add target price input to ProductDetail notification settings
- Show target price badge on product cards
- Add "Lowest Price" and "Near Low" badges to product cards
- Add bulk selection mode with checkboxes
- Add dashboard summary cards at top of product list
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Opens the product's URL in a new tab directly from the dashboard,
without needing to go to the product detail page first.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add ability to create new users from admin panel
- Add role dropdown (User/Admin) for each user
- Replace toggle buttons with select dropdown for role management
- Admin users can access the Admin section in settings
- Regular users see only Profile and Notifications sections
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add sidebar navigation to settings page
- Add profile section for name management and password change
- Add admin section for user management and registration toggle
- Add profile API endpoints (GET/PUT /profile, PUT /profile/password)
- Add admin API endpoints (users CRUD, system settings)
- Add system_settings table for registration control
- Add name and is_admin columns to users table
- First registered user automatically becomes admin
- Check registration status on register/login page
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Show configured notifications on dashboard:
- Bell icon with dollar amount for price drop threshold
- Package icon for back-in-stock alerts
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add refresh button to product list items with spinning animation
- Add editable refresh interval dropdown on product detail page
- Add user profile dropdown with settings link in navbar
- Create Settings page for Telegram and Discord configuration
- Add per-product notification options (price drop threshold, back in stock)
- Integrate notifications into scheduler for automatic alerts
- Add notification service supporting Telegram Bot API and Discord webhooks
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add stock_status column to products table (in_stock/out_of_stock/unknown)
- Detect out-of-stock status on Amazon by checking:
- #availability text for "currently unavailable"
- #outOfStock element presence
- Missing "Add to Cart" button
- Add generic stock status detection for other sites
- Allow adding out-of-stock products (they just won't have a price)
- Update background scheduler to track stock status changes
- Display stock status badge in product list and detail pages
- Dim out-of-stock products in the dashboard
- Show "Currently Unavailable" badge instead of price when out of stock
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add sparkline component for 7-day price history visualization
- Convert product cards to horizontal list items
- Add search functionality to filter products by name/URL
- Backend returns sparkline data and 7-day price change with products
- Show price trend indicator (green for drops, red for increases)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add dark theme CSS variables
- Theme toggle button in navbar and auth pages
- Persist theme preference in localStorage
- Update chart colors for dark mode
- Auto-detect theme changes via MutationObserver
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>