Commit graph

53 commits

Author SHA1 Message Date
clucraft
d9374c2f57 Add Gotify notification support
- 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>
2026-01-24 21:52:33 -05:00
clucraft
be6dd6382e Add per-product AI extraction disable option
- 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>
2026-01-24 21:09:19 -05:00
clucraft
0a66d55d79 Add AI model selector to settings
- 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>
2026-01-24 20:58:54 -05:00
clucraft
b9d8d15e68 Add per-product AI verification disable option
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>
2026-01-24 20:32:25 -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
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
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
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
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
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
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
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
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
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
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
clucraft
afda0b3f01 Auto-detect system theme preference
- 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>
2026-01-21 22:33:43 -05:00
clucraft
2ecb02677e Display user's name instead of email in profile button
- 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>
2026-01-21 22:17:36 -05:00
clucraft
d98138fe7c Add AI-powered price extraction fallback
- 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>
2026-01-21 21:49:55 -05:00
clucraft
cfca33b4ea Add toast notifications for user feedback
- Created ToastContext with showToast hook
- Toast notifications appear in bottom-right, auto-dismiss after 3s
- Added success/error toasts for:
  - Saving notification settings
  - Refreshing prices
  - Updating check interval
  - Deleting products
- Replaced alert() calls with toast notifications

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 21:35:28 -05:00
clucraft
fd09d77f05 Improve bulk selection UI with always-visible checkboxes and action menu
- 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>
2026-01-21 19:52:47 -05:00
clucraft
a85e22d8bc Add target price alerts, historical low indicator, bulk actions, and dashboard summary
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>
2026-01-21 13:40:39 -05:00
clucraft
2acc47c21c Add external link button to product list items
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>
2026-01-21 13:28:10 -05:00
clucraft
040cdb9c42 Add user management features to admin section
- 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>
2026-01-21 13:17:27 -05:00
clucraft
f46c6ad9d4 Add settings page with profile, notifications, and admin sections
- 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>
2026-01-21 07:58:11 -05:00
clucraft
0c8ce22cc1 Add product list sorting feature
Sort options:
- Date added (default)
- Product name
- Price
- Price change (7d)
- Website

Features:
- Ascending/descending toggle
- Preferences saved to localStorage
- Works with search filtering

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-20 22:46:21 -05:00
clucraft
7be9906c61 Add notification badges to product list items
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>
2026-01-20 22:35:06 -05:00
clucraft
59db0f5bb0 Fix product update route to include notification settings
Add price_drop_threshold and notify_back_in_stock to PUT /products/:id

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-20 22:18:44 -05:00
clucraft
4acd5c1432 Fix navbar button heights for visual consistency
Match theme toggle and profile dropdown to same 42px height

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-20 21:36:46 -05:00
clucraft
a6928a0c17 Add refresh controls and notification support
- 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>
2026-01-20 21:15:04 -05:00
clucraft
8c5d20707d Add out-of-stock detection and display
- 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>
2026-01-20 20:54:12 -05:00
clucraft
ba9e52b90f Redesign dashboard with list layout, sparklines, and search
- 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>
2026-01-20 19:32:25 -05:00
clucraft
4ef61517e3 Add dark mode with theme toggle
- 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>
2026-01-20 14:27:17 -05:00