Watches
Search the build
-
9430e0e2026-06-21 auto-save: 2026-06-21T18:53:05 (1 files) — .env.example -
e4d2c682026-05-30 fix: restore missing dependencies in package.json and respect PORT env var -
91776272026-05-30 security: strip hardcoded dw_admin DSN password -> env-first. No rotation/deploy. -
10ed7982026-05-19 fix(app.js): /api/watches now returns paginated wrapper, not bare array -
db8e98e2026-05-19 Add snapshot-file 404 guard for .bak/.pre-/.orig/.rej paths -
1f77b3d2026-05-19 Add rel=noopener noreferrer + serve /docs static for api-playground links -
6aff5062026-05-19 Add /api 404 guard before SPA catch-all -
253afbe2026-05-19 Broaden .gitignore: snapshot leftovers + SQLite WAL/SHM -
08f02d62026-05-19 Add sort + density slider with localStorage persistence to watch search -
96a9a732026-05-13 snapshot: 1 file(s) changed, ~1 modified -
08ed49d2026-05-06 initial scaffold (gitify-all 2026-05-06)
Authors
- Steve11
Agents used
Skills used
- /docs4
- /watches2
- /start1
- /deploy1
- /rsync1
- /markdown1
- /index1
- /journal1
- /advanced-search1
Creative ideas + design notes
e4d2c68 · 2026-05-30 · fix: restore missing dependencies in package.json and respect PORT env var
- package.json had empty dependencies{} so npm install was a no-op; restored
all 54 deps from package-lock.json so the project is installable fresh
- added "type":"module" and corrected main/start entries (server.js, not index.js)
- server.js hardcoded PORT=7600 ignoring the PORT env var; changed to
process.env.PORT with 7600 fallback so pm2/test runners can override the port
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
10ed798 · 2026-05-19 · fix(app.js): /api/watches now returns paginated wrapper, not bare array
loadWatches() was doing `allWatches = await response.json()` against
/api/watches, but server.js:442 returns `{total, page, limit, totalPages, watches: [...]}`
(default limit=50). So allWatches was getting the wrapper object, and every
subsequent .forEach/.filter on it was broken (silently — Array.prototype
methods don't exist on plain objects so the comparison list on index.html
was non-functional).
Defensive fix: extract .watches if the response is an object (handles old
bare-array API too), and request ?limit=9999 so we still get the whole
catalog now that the endpoint paginates.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
db8e98e · 2026-05-19 · Add snapshot-file 404 guard for .bak/.pre-/.orig/.rej paths
Returns plain 404 for any request matching editor or merge-leftover extensions before reaching express.static. Backstop in case a snapshot file ever lands inside dist/ or public/ via deploy/rsync. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1f77b3d · 2026-05-19 · Add rel=noopener noreferrer + serve /docs static for api-playground links
api-playground.html had three target=_blank quick-links without rel attrs (window.opener exploit risk pre-2021 browsers). Added rel on all three. The "Full Guide" link points at /docs/API_COMPLETE_GUIDE.md but no static handler served /docs — added express.static for ./docs with text/markdown content-type so the link no longer dead-404s. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
6aff506 · 2026-05-19 · Add /api 404 guard before SPA catch-all
Unknown /api/* paths were being swallowed by the app.get('*') fallback
that serves dist/index.html, so a typo'd API URL returned the React shell
(200 with HTML) instead of a proper 404. JSON 404 makes API misuse
detectable on the client + in logs.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
253afbe · 2026-05-19 · Broaden .gitignore: snapshot leftovers + SQLite WAL/SHM
Adds *.bak.*, *.pre-*, *.orig, *.rej plus SQLite WAL/SHM/journal so the search FTS db's transient sidecar files don't show up as untracked. *~ and *.swp already covered under IDE block above. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
08f02d6 · 2026-05-19 · Add sort + density slider with localStorage persistence to watch search
Sort hydrates BEFORE first /api/advanced-search call. Default sort flipped from "relevance" to "Newest (Year)". Density slider rewrites a CSS var so the auto-fill min card width updates without re-rendering. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
File tree
- .env.example
- .github/workflows/ci-cd-production.yml
- .github/workflows/production-ci-cd.yml
- .gitignore
- AFFILIATE_SIGNUP_GUIDE.md
- AFFILIATE_SYSTEM_COMPLETE.md
- API_DOCUMENTATION.md
- API_IMPLEMENTATION_COMPLETE.md
- AUTOMATION_GUIDE.md
- BACKEND_API.md
- CHART_BUTTON_ADDED.md
- CLAUDE.md
- DATA_SOURCES.md
- DEPLOYMENT.md
- DEPLOYMENT_RUNBOOK.md
- DEPLOYMENT_STATUS.md
- ENHANCEMENTS.md
- ENTERPRISE_SECURITY_GUIDE.md
- FEATURES.md
- FINAL_SYSTEM_REPORT.md
- IMPLEMENTATION_SUMMARY.md
- INFRASTRUCTURE.md
- INFRASTRUCTURE_GUIDE.md
- JAPAN_ARBITRAGE_MANUAL.md
- LUXURY_FEATURES.md
- LUXURY_SUMMARY.md
- MISSION_COMPLETE.txt
- MOBILE_FEATURES_SUMMARY.md
- MOBILE_PWA_GUIDE.md
- OMEGA_RESEARCH_REPORT.json
- OMEGA_WATCHES_SYSTEM.md
- OPTIMIZATION_SUMMARY.md
- PERFORMANCE_REPORT.md
- PRODUCTION_SETUP.sh
- PWA_DEPLOYMENT_CHECKLIST.md
- PWA_GUIDE.md
- QUICK_START.md
- QUICK_START_INTEGRATION.md
- README.md
- REAL_DATA_SOURCES.md
- RESEARCH_SUMMARY.md
- RUNBOOKS/DEPLOYMENT_RUNBOOK.md
- RUNBOOKS/DISASTER_RECOVERY.md
- SEARCH_API_DOCS.md
- SEARCH_FEATURES_COMPLETE.md
- SECURITY_AUDIT_REPORT.md
- SECURITY_IMPLEMENTATION_GUIDE.md
- SEO_CHECKLIST.md
- SEO_IMPLEMENTATION_SUMMARY.md
- SEO_OPTIMIZATION_REPORT.md
- SOURCE_VERIFICATION.md
- THIBAUT-ROOM-SETTINGS-SUMMARY.md
- UX_IMPLEMENTATION_GUIDE.md
- UX_IMPROVEMENTS_SUMMARY.md
- add-real-price-data.html
- affiliate-applications.sh
- analytics/ANALYTICS_COMPLETE.md
- analytics/ANALYTICS_SUMMARY.md
- analytics/IMPLEMENTATION_COMPLETE.md
- analytics/INVESTMENT_REPORT.md
- analytics/README.md
- analytics/ab-testing.js
- analytics/analytics-integration.js
- analytics/analytics-server-complete.js
- analytics/analytics-server.js
- analytics/cohort-analysis.js
- analytics/comprehensive_report.json
- analytics/dashboard.html
- analytics/data/analytics-2025-11-17.json
- analytics/funnel-tracker.js
- analytics/ga4-integration.js
- analytics/market_analysis.json
- analytics/market_analysis.py
- analytics/price_prediction.py
- analytics/price_predictions.json
- analytics/report-generator.js
- analytics/report_generator.py
- analytics/reports/pdf/test-pdf.pdf
- analytics/run_all_analytics.py
- analytics/scheduler.js
- analytics/statistical_insights.json
- analytics/statistical_insights.py
- analytics/utils.py
- api/advanced-search.js
- api/alerts.js
- api/auth/email.js
- api/auth/github.js
- api/auth/google.js
- api/auth/logout.js
- api/exchange-rates.js
- api/predictions.js
- api/search-api.js
- api/search-simple.js
- api/user/profile.js
- arte-specs-scraper.js
- backups/daily/backup_20251117_093433_manifest.txt
- backups/daily/config_20251117_093433.tar.gz
- backups/daily/config_20251117_093433.tar.gz.sha256
- backups/daily/database_20251117_093433.tar.gz
- backups/daily/database_20251117_093433.tar.gz.sha256
- backups/daily/full_backup_20251117_093433.tar.gz
- backups/daily/full_backup_20251117_093433.tar.gz.sha256
- backups/daily/logs_20251117_093433.tar.gz
- backups/daily/logs_20251117_093433.tar.gz.sha256
- benchmark.sh
- blog/articles/article-data-part2.json
- blog/articles/article-data-part3.json
- blog/articles/article-data.json
- config/currencies.js
- crawler-with-notifications.js
- data/crawl-status.json
- data/expanded-omega-watches.json
- data/historical-prices.json
- data/omega-official-prices.json
- data/omega-watches-expanded-v2-backup-20251117-094843.json
- data/omega-watches-expanded-v2.json
- data/omega-watches-expanded-v3.json
- data/omega-watches.json
- data/rolex-historical-prices.json
- data/rolex-official-prices.json
- data/watch-wayback-map.json
- data/watches-backup-20251117.json
- data/watches.json
- database/DATABASE_ARCHITECTURE.md
- database/POSTGRESQL_MIGRATION_GUIDE.md
- database/blog-schema.sql
- database/cache/RedisCache.js
- database/connection.js
- database/deploy-database.sh
- database/enhanced-schema.sql
- database/etl-pipeline.js
- database/init.sh
- database/migrate-json-to-postgres.js
- database/migrations/001-users.sql
- database/migrations/002-price-alerts.sql
- database/migrations/003-affiliates.sql
- database/pool-manager.js
- database/repositories/PriceHistoryRepository.js
- database/repositories/WatchRepository.js
- database/repositories/users.js
- database/repositories/watch-repository.js
- database/schema-users.sql
- database/schema.sql
- database/services/WatchService.js
- database/setup-replication.sh
- database/sqlite-fts5-setup.js
- database/sqlite-fts5-simple.js
- database/watches-search.db
- database/watches.db
- deploy-luxury.sh
- deploy-seo.sh
- docker-compose.monitoring.yml
- docs/API_COMPLETE_GUIDE.md
- docs/API_VERIFICATION.md
- docs/MIGRATION_GUIDE.md
- docs/README.md
- ecosystem.config.cjs
- ecosystem.crawler.config.cjs
- examples/websocket-client.html
- fetch-watch-data.js
- index.html
- infrastructure/nginx-omega-watches.conf
- lighthouse-test.sh
- middleware/auth.js
- middleware/gdpr.js
- middleware/security.js
- monitoring/alertmanager/alertmanager.yml
- monitoring/grafana/provisioning/dashboards/dashboard.yml
- monitoring/grafana/provisioning/datasources/prometheus.yml
- monitoring/health-monitor.js
- monitoring/logger.js
- monitoring/prometheus/alerts.yml
- monitoring/prometheus/prometheus.yml
- museum/crawl-data/progress.json
- museum/index.html
- museum/omega-museum-top-100.json
- nginx/omega-watches.conf
- openapi.yaml
- package-lock.json
- package.json
- performance-optimize.sh
- performance-test.js
- postcss.config.js
- postman_collection.json
- public/api-playground.html
- public/app.js
- public/ar-viewer.js
- public/biometric-auth.js
- public/camera-scanner.js
- public/favicon.svg
- public/icons/README.md
- public/icons/icon-128x128.svg
- public/icons/icon-144x144.svg
- public/icons/icon-152x152.svg
- public/icons/icon-192x192.svg
- public/icons/icon-384x384.svg
- public/icons/icon-512x512.svg
- public/icons/icon-72x72.svg
- public/icons/icon-96x96.svg
- public/icons/icon-converter.html
- public/index.html
- public/manifest.json
- public/offline.html
- public/price-history.html
- public/privacy-policy.html
- public/pwa-app.js
- public/pwa-index.html
- public/pwa-styles.css
- public/robots.txt
- public/screenshots/test-screenshot.png
- public/search-interface.html
- public/service-worker.js
- public/sitemap.xml
- public/styles.css
- public/sw-advanced.js
- public/watches/constellation.svg
- public/watches/deville.svg
- public/watches/railmaster.svg
- public/watches/seamaster.svg
- public/watches/speedmaster.svg
- public/watches/watch1.jpg
- public/watches/watch2.jpg
- push-notifications.js
- pwa-routes.js
- schema/watch-schema.json
- scrape-real-prices.sh
- scripts/aggregate-prices.js
- scripts/backup-automation.sh
- scripts/backup-postgres.sh
- scripts/backup-system.sh
- scripts/bulk-wayback-crawler.py
- scripts/chrono24-scraper.py
- scripts/crawl-orchestrator.js
- scripts/cron-setup.sh
- scripts/deploy.sh
- scripts/health-monitor.sh
- scripts/migrate.sh
- scripts/nginx-setup.sh
- scripts/omega-daily-scraper.py
- scripts/prepare-ml-data.js
- scripts/price-scheduler.js
- scripts/production-deploy.sh
- scripts/restore-postgres.sh
- scripts/rolex-daily-scraper.py
- scripts/rolex-wayback-crawler.py
- scripts/security-audit.sh
- scripts/setup-cron-jobs.sh
- scripts/setup-monitoring.sh
- scripts/setup-nginx.sh
- scripts/warmup-market-cache.js
- scripts/wayback-price-scraper.py
- sdk/README.md
- sdk/omega-api-client.js
- sdk/omega_api_client.py
- sdk/package.json
- sdk/setup.py
- sdk/types.d.ts
- security/captcha-handler.js
- security/intrusion-detection.js
- security/security-scanner.js
- security/sql-injection-prevention.js
- server-enterprise-security.js
- server-optimized.js
- server-secure.js
- server.js
- services/affiliate-links.js
- services/alert-evaluator.js
- services/chrono24-scraper.js
- services/email-notifications.js
- services/exchange-rates.js
- services/github-dataset.js
- services/ml/linear-regression.js
- services/ml/polynomial-regression.js
- services/ml/random-forest.js
- services/price-aggregator.js
- services/push-notifications.js
- services/wayback-scraper.js
- setup-cron-price-monitor.sh
- setup-price-monitoring.sh
- setup-pwa.sh
- src/App-optimized.jsx
- src/App.jsx
- src/App.luxury.jsx
- src/components/AccessibilityEnhancements.jsx
- src/components/AdvancedFilters.jsx
- src/components/AffiliateDisclosure.jsx
- src/components/AlertPreferences.jsx
- src/components/AlertsPage.jsx
- src/components/ArbitrageCalculator.jsx
- src/components/BuyNowDropdown.jsx
- src/components/CollapsibleSection.jsx
- src/components/ComparisonView.jsx
- src/components/CookieConsent.jsx
- src/components/CurrencySelector.jsx
- src/components/Dashboard.jsx
- src/components/EnhancedDashboard.jsx
- src/components/EnhancedHeader.jsx
- src/components/EnhancedWatchList.jsx
- src/components/FavoritesManager.jsx
- src/components/FreshnessIndicator.jsx
- src/components/GestureControls.jsx
- src/components/GitHubLoginButton.jsx
- src/components/GoogleLoginButton.jsx
- src/components/Header.jsx
- src/components/HeroCarousel.jsx
- src/components/InstallPrompt.jsx
- src/components/LoginForm.jsx
- src/components/LuxuryDataVisualizations.jsx
- src/components/LuxuryHero.jsx
- src/components/LuxuryInteractions.jsx
- src/components/LuxuryLoadingStates.jsx
- src/components/LuxuryWatchCard.jsx
- src/components/MarketPrice.jsx
- src/components/MobileEnhancements.jsx
- src/components/OfflineIndicator.jsx
- src/components/OmegaPriceHistoryChart.jsx
- src/components/ParallaxSection.jsx
- src/components/PremiumLoader.jsx
- src/components/PriceChart.jsx
- src/components/PriceComparison.jsx
- src/components/PriceDisplay.jsx
- src/components/PriceHistoryPage.jsx
- src/components/PriceIndicator.jsx
- src/components/PricePrediction.jsx
- src/components/ProfilePage.jsx
- src/components/RecentSales.jsx
- src/components/RefreshButton.jsx
- src/components/RegisterForm.jsx
- src/components/RetailVsMarket.jsx
- src/components/SetAlertModal.jsx
- src/components/ShareButton.jsx
- src/components/SkeletonLoader.jsx
- src/components/TrendIndicator.jsx
- src/components/WatchCard.jsx
- src/components/WatchComparison.jsx
- src/components/WatchList.jsx
- src/components/affiliate/JapanArbitrageCalc.jsx
- src/components/affiliate/OmegaAffiliateGrid.jsx
- src/components/affiliate/OmegaCommissionCalc.jsx
- src/components/affiliate/OmegaPriceChart.jsx
- src/config/luxury.config.js
- src/design-system/tokens.js
- src/hooks/useAutoRefresh.js
- src/hooks/useLocalStorage.js
- src/index.css
- src/main-simple.jsx
- src/main.jsx
- src/main.jsx.backup
- src/services/marketDataService.js
- src/utils/dealers/dealer-apis.js
- src/utils/offlineStorage.js
- src/utils/pwaUtils.js
- src/utils/seo.js
- tailwind.config.js
- tasks/prd-historical-price-crawl.md
- tasks/prd-new-feature-for-watches.md
- tasks/prd-omega-daily-scraper.md
- tasks/prd-omega-platform-v2.md
- tasks/prd-omega-watches-historical-price-tracking-and-visualization-system.md
- tasks/prd-real-api-integration.md
- tasks/prd-real-time-market-data.md
- tasks/prd-rolex-daily-scraper.md
- test-automation.sh
- test-seo.sh
- test/api-tests.sh
- thibaut-description-backfill.js
- thibaut-login-debug.js
- thibaut-login-test.js
- thibaut-page-inspector.js
- thibaut-price-scraper.js
- thibaut-price-test.js
- thibaut-room-settings-api-example.js
- thibaut-room-settings-scraper.js
- utils/generate-icons.js
- utils/migrations.js
- utils/notify-steve-on-crawl.js
- utils/omega-museum-curator.js
- utils/pdf-generator.js
- utils/price-monitor-simple.js
- utils/price-monitor.js
- utils/price-scraper.js
- utils/screenshot-capture.js
- utils/slow-crawler.js
- utils/validator.js
- vite.config.js