Commit graph

505 commits

Author SHA1 Message Date
Viktor Barzin
8fcd530d7f
feat: UI/UX redesign — map-first with modern chrome
- Horizontal filter bar replacing sidebar (full-width map)
- React Router with URL-based filter state and deep linking
- Teal-accented color palette
- Redesigned property cards with better visual hierarchy
- Tabbed listing detail sheet (Overview, Travel, Price History, Details)
- Error boundary
- Shared utility extraction (format, task utils)
2026-02-28 17:18:11 +00:00
Viktor Barzin
3016cbb047
fix: use real Rightmove listings for dev mock data
Replace picsum.photos placeholders with actual Rightmove listing data
fetched from the API - real property photos, prices, addresses, and
coordinates. Skip auto-load API call in dev bypass mode.
2026-02-28 16:47:52 +00:00
Viktor Barzin
69ce458308
feat: add dev auth bypass for UI testing without backend
Guarded by VITE_DEV_BYPASS_AUTH env var + import.meta.env.DEV check.
Vite tree-shakes the DEV branch in production builds.
The .env.development.local file is gitignored (**.env pattern).
Includes mock listing data to preview property cards without API.
2026-02-28 16:37:33 +00:00
Viktor Barzin
dea930dbc4
fix: remove unused imports flagged by TypeScript 2026-02-28 16:23:36 +00:00
Viktor Barzin
ab02fb120c
feat: redesign listing detail with tabbed sections and larger drawer 2026-02-28 16:21:20 +00:00
Viktor Barzin
812bfece4a
style: redesign PropertyCard with better visual hierarchy 2026-02-28 16:21:17 +00:00
Viktor Barzin
be2f0ef282
feat: add error boundary to prevent white-screen crashes
Wraps the entire app in an ErrorBoundary that shows a friendly
error message with reload button instead of crashing to white.
2026-02-28 16:18:10 +00:00
Viktor Barzin
8f112f30e3
feat: integrate FilterBar into layout, remove sidebar
Replace the fixed w-80 sidebar with a horizontal FilterBar below the
header, giving the map full viewport width. Key changes:

- App.tsx: Remove sidebar layout, add FilterBar + FilterChips + inline
  StreamingProgressBar between header and main content area
- Header.tsx: Add Rent/Buy listing type toggle (compact Tabs) after logo
- StatsBar.tsx: Add "Color by" metric selector (moved from
  VisualizationCard) as a compact Select alongside view mode toggles
- Mobile: Replace Sheet-based filter panel with full-screen Dialog
2026-02-28 16:16:03 +00:00
Viktor Barzin
4053c0c759
feat: create FilterBar and FilterChips components
Add a horizontal FilterBar component with popover-based dropdowns for
Price, Beds, Size, and a "More Filters" panel with advanced options
(price/m2, furnishing, district, date, POI travel filters). Action
buttons (Show Listings / Scrape New) are aligned to the right.

Add FilterChips component that renders active (non-default) filter
values as removable pills below the filter bar.
2026-02-28 16:12:09 +00:00
Viktor Barzin
de47e2cca8
feat: add React Router with URL-based filter state and deep linking
- Wrap App in BrowserRouter in main.tsx
- Create useFilterParams hook that syncs filter state with URL search params
  and derives viewMode from the URL pathname
- Replace window.location.pathname callback check with React Router Routes
- Split App into AppContent (main UI) and App (route definitions)
2026-02-28 16:07:14 +00:00
Viktor Barzin
676fad520c
style: update color palette from neutral to teal-accented property theme
- Primary/accent changed from achromatic black to teal (oklch 0.55 0.14 175)
- Background/foreground given subtle cool slate tint
- Added --deal-good (emerald) and --deal-above (amber) custom properties
- Ring color updated to teal for focus states
- Dark mode updated to match teal theme
2026-02-28 16:03:56 +00:00
Viktor Barzin
1037ff164d
refactor: extract shared utility functions to eliminate duplication 2026-02-28 16:02:06 +00:00
Viktor Barzin
b720013a08
chore: add react-router-dom dependency for URL-based navigation 2026-02-28 15:58:39 +00:00
Viktor Barzin
706a60c741
docs: add UI/UX redesign implementation plan
11 tasks across 5 phases:
1. Foundation: Router, shared utils, color palette
2. Filter Bar: Replace sidebar with horizontal filter bar
3. Property Cards: Visual redesign with better hierarchy
4. Polish: Error boundary, cleanup
5. Verification: End-to-end visual check
2026-02-28 15:46:30 +00:00
Viktor Barzin
6f8eb8a0ba
docs: add UI/UX redesign design document
Approach C: Map-First with Modern Chrome
- Horizontal filter bar replacing sidebar
- React Router for URL state / deep linking
- Redesigned property cards with better visual hierarchy
- Refined color palette and typography
- Tabbed listing detail sheet
2026-02-28 15:44:13 +00:00
Viktor Barzin
c7c3331d30
Migrate CI from Drone to Woodpecker
Replace .drone.yml with .woodpecker/ pipeline configs (frontend.yml, api.yml).
Convert Drone env vars to Woodpecker equivalents (CI_PIPELINE_NUMBER, CI_COMMIT_SHA),
use woodpeckerci/plugin-git for clone with retry, woodpeckerci/plugin-slack for
notifications, and plugins/docker for image builds. Update all docs and skills.
2026-02-23 22:00:09 +00:00
Viktor Barzin
2357722e80
Add Server-Timing headers to all API endpoints for per-request latency breakdown
Instrument every API endpoint with Server-Timing headers so sub-operation
durations are visible in browser DevTools Network tab. Also adds Grafana
dashboard panels for per-endpoint latency comparison (p50/p95 timeseries
and p95 ranking bar gauge).
2026-02-23 21:30:51 +00:00
Viktor Barzin
35f1987ac1
Add navigation & usage metrics for end-user experience visibility
Instrument DB query timing (11 operations across 3 repositories),
streaming lifecycle (TTFB, duration, feature count), cache operation
latency, listing detail step breakdown, and frontend page load /
time-to-first-listing / stream download / detail load metrics.

Adds 16 new OTel instruments, extends the perf ingestion endpoint
with 4 new frontend metrics, and adds ~20 Grafana dashboard panels
across 4 new rows (DB Query Performance, Streaming Performance,
Listing Detail Breakdown, Cache Performance, Frontend Navigation).
2026-02-23 20:28:42 +00:00
Viktor Barzin
1ae00b7cbf
Add multi-layer caching: 24h Redis TTL, stale-while-revalidate, frontend LRU cache
- Increase Redis cache TTL from 30 minutes to 24 hours
- Add stale-while-revalidate: serve stale cache (>4h) immediately while
  repopulating in background with SETNX lock to prevent concurrent rebuilds
- Add in-memory frontend LRU cache (5 entries) so repeat filter visits
  are instant without network requests
- Invalidate frontend cache on listing refresh and task completion
- Add unit tests for get_cache_age, is_cache_stale, acquire_repopulation_lock
2026-02-23 20:09:36 +00:00
Viktor Barzin
04bda8c127
Fix FilterPanel test: button text changed to 'Show Matching Listings'
The FilterPanel component's submit button was renamed from 'Apply Filters'
to 'Show Matching Listings' but the test was not updated to match.
2026-02-23 19:40:06 +00:00
Viktor Barzin
9b3d35669f
Fix API crash: status_code=204 with response body assertion error
FastAPI rejects status_code=204 on routes with a return type annotation.
Return an explicit Response(status_code=204) instead.
2026-02-23 19:22:10 +00:00
Viktor Barzin
7dc8dc736f Retrigger CI build 2026-02-22 23:59:21 +00:00
Viktor Barzin
6dcb0d8787 fix clone backoff duration format 2026-02-22 23:40:50 +00:00
Viktor Barzin
af29295793 fix clone backoff duration format 2026-02-22 23:40:49 +00:00
Viktor Barzin
f02e27e9ba test clone retry 2026-02-22 23:37:46 +00:00
Viktor Barzin
b2904c03c2 [ci skip] Add clone retry settings for DNS resilience 2026-02-22 23:37:21 +00:00
Viktor Barzin
c68841e499 [ci skip] Add clone retry settings for DNS resilience 2026-02-22 23:37:19 +00:00
Viktor Barzin
432ceb575d Remove custom clone override, use built-in Woodpecker clone 2026-02-22 23:30:38 +00:00
Viktor Barzin
62fe594be2 Remove custom clone override, use built-in Woodpecker clone 2026-02-22 23:30:38 +00:00
Viktor Barzin
e3d8939d17 test CI secrets reload 2026-02-22 23:22:51 +00:00
Viktor Barzin
0666411570 test CI with fixed secrets 2026-02-22 23:20:05 +00:00
Viktor Barzin
553fa55102 trigger CI rebuild 2026-02-22 23:16:35 +00:00
Viktor Barzin
3efe7e251a Fix clone: no-op clone override + step-level auth 2026-02-22 23:02:54 +00:00
Viktor Barzin
2000ea5403 Fix clone: no-op clone override + step-level auth 2026-02-22 23:02:53 +00:00
Viktor Barzin
d3b8cb1f84 Standardize clone: skip_clone + step-level retry 2026-02-22 22:55:12 +00:00
Viktor Barzin
9e702a3f5f Standardize clone: skip_clone + step-level retry 2026-02-22 22:54:43 +00:00
Viktor Barzin
4e881780d9 Fix clone: use GitHub token for auth + DNS retry 2026-02-22 22:49:03 +00:00
Viktor Barzin
3a875c70a7 Fix clone: use GitHub token for auth + DNS retry 2026-02-22 22:48:31 +00:00
Viktor Barzin
813a0d7379 Fix clone: add netrc auth + cleanup between retries 2026-02-22 22:28:49 +00:00
Viktor Barzin
8747db4aaf Fix clone: add netrc auth + cleanup between retries 2026-02-22 22:28:16 +00:00
Viktor Barzin
32b38c432b Add clone retry logic for DNS resilience 2026-02-22 22:13:53 +00:00
Viktor Barzin
71f1d324a1 Add clone retry logic for DNS resilience 2026-02-22 22:13:22 +00:00
Viktor Barzin
23b544f73a Add Woodpecker CI API pipeline 2026-02-22 21:43:26 +00:00
Viktor Barzin
7c857cab75 Add Woodpecker CI frontend pipeline 2026-02-22 21:43:00 +00:00
Viktor Barzin
692d68c270
Unpause deployments and add ReplicaSet/status debug output
Add spec.paused: null to the strategic merge patch to clear any
paused state that might be blocking rollouts. Also add detailed
deployment status debug output (conditions, replica counts,
paused state) and list ReplicaSets to diagnose why new pods
aren't being created despite spec changes.
2026-02-22 19:40:44 +00:00
Viktor Barzin
0a2b207bee
Use strategic merge patch with restart annotation in deploy step
The JSON Patch was updating the deployment spec image but K8s wasn't
creating new pods — the rollout was stuck from previous failed builds.
Switch to strategic-merge-patch that also sets restartedAt annotation,
equivalent to 'kubectl rollout restart', which forces K8s to create
a new ReplicaSet regardless of stalled rollout state.
2026-02-22 19:21:56 +00:00
Viktor Barzin
339e2cf2ab
Improve frontend UI/UX: accessibility, discoverability, and cleanup
- Add prefers-reduced-motion support (global CSS + SwipeCard spring config)
- Add dismissible map click hint overlay with localStorage persistence
- Replace generic image alt text with descriptive property info across 4 components
- Rename filter buttons to clarify intent (Show Matching Listings / Scrape New from Rightmove)
- Fix mobile FAB overlap with bottom sheet via dynamic snap-aware positioning
- Add swipe review onboarding overlay with gesture explanations and button labels
- Delete unused components: AppSidebar, ActiveQuery, SavedView
2026-02-22 18:47:09 +00:00
Viktor Barzin
268f4fd272
Add detailed debug output to API verify-deploy
Show deployment spec image to confirm patch worked, dump all pod
details (image, ready, phase, restarts, reason) on attempts 1/10/30
and on failure. This will reveal whether pods are crashlooping, stuck
in Pending, or if the deployment patch didn't take effect.
2026-02-22 18:35:20 +00:00
Viktor Barzin
67d4ab3821
Fix celery metrics not reaching Prometheus and update Grafana dashboard
Init OTel metrics at module level in celery_app.py so prefork child
processes inherit the MeterProvider and PrometheusMetricReader from
the parent.  Previously, worker_process_init created a separate
MeterProvider in each child, disconnected from the HTTP server in
the main process — so all scrape/celery/OCR metrics were silently
lost.

Update Grafana dashboard with API Performance and Frontend Performance
sections, synced from the live cluster dashboard.
2026-02-22 17:58:20 +00:00
Viktor Barzin
bfee06525b
Fix verify-deploy image comparison to handle docker.io prefix
Kubernetes may normalize image references to include docker.io/ prefix
(e.g., docker.io/viktorbarzin/realestatecrawler:356), causing exact
string match to fail. Use endswith() instead. Also add debug output
on first attempt to show actual pod images and readiness state.
2026-02-22 17:52:32 +00:00