Commit graph

517 commits

Author SHA1 Message Date
Viktor Barzin
73823bd381 ci: bump frontend test-shard memory to 2Gi (fix exit-137 OOM)
The 4 vitest shards were getting SIGKILL (exit code 137) because the
container memory limit was tighter than NODE_OPTIONS=--max-old-space-size=1024,
and 1024 wasn't enough headroom for the test workers either.

Set explicit kubernetes resources (request 1Gi / limit 2Gi) and bump
the V8 heap to 1.5Gi on install-frontend-deps and all 4 test shards.

Confirmed-by: pipeline 2081 step states (test-shard-1..4 all
state=failure exit_code=137; build/deploy steps then skipped).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-10 19:43:38 +00:00
Viktor Barzin
4338a5c069 ci: retrigger frontend pipeline (queue still inconsistent) 2026-05-10 19:30:32 +00:00
Viktor Barzin
cca33829be ci: retrigger frontend pipeline (woodpecker queue inconsistency) 2026-05-10 19:18:36 +00:00
Viktor Barzin
fad834c20b ui: harden a11y, plurals, NaN guards, map viewport persistence
Surgical UX/a11y fixes layered on top of the team's UI redesign,
keeping the teal palette and FilterBar architecture intact.

- TaskIndicator: NaN-safe progressPercentage (Number.isFinite +
  clamp 0..100). No more "NaN%" when a task posts undefined progress.
- StreamingProgressBar: same NaN guard on the inline width calc.
- StatsBar: pluralize listings ("1 listing" / "30 listings"), drop
  the duplicated "Avg:" label (now "Avg price" / "<n>/m²" / "Size"),
  tabular-nums on every numeric.
- FilterPanel furnishing pills: aria-pressed + data-state for
  screen readers and tests.
- ListView sort buttons: aria-pressed + aria-sort
  (ascending/descending/none); listing count pluralizes
  ("1 property" / "N properties") with tabular-nums.
- Map: only fitBounds the FIRST time data loads (hasFittedOnceRef).
  The previous lastDataLengthRef-based gate refit when results
  went N → 0 → M, blowing away the user's pan/zoom.

Verified: tsc --noEmit clean, 125/125 vitest specs pass.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-10 18:52:49 +00:00
Viktor Barzin
ebc58cd8a1
remove local agents, replaced by global dev team [ci skip] 2026-03-23 00:17:54 +02:00
Viktor Barzin
f5a92dc0c9
fix: increase install-api-deps memory to 1Gi for CI
LimitRange defaults to 192Mi which is too low for pip installing
~30 packages. Set 512Mi request / 1Gi limit.
2026-03-15 23:47:30 +00:00
Viktor Barzin
546f6957e3
ci: migrate from plugins/docker to woodpeckerci/plugin-docker-buildx
Replace the old Docker-in-Docker build approach (plugins/docker) with
the modern buildx plugin that natively supports BuildKit. This fixes:
- "Cannot connect to the Docker daemon" errors (no DinD needed)
- "the --mount option requires BuildKit" errors (buildx = BuildKit)
- OOM in publish step (skopeo no longer needed, buildx pushes directly)

Also removes the intermediate build-tag/skopeo-copy/publish dance —
buildx pushes both versioned and latest tags in a single step.
2026-03-15 22:52:01 +00:00
Viktor Barzin
55aff55025
ci: retrigger after woodpecker restart 2026-03-01 19:47:49 +00:00
Viktor Barzin
cfa8038bfa
ci: retrigger build 2026-03-01 19:16:11 +00:00
Viktor Barzin
94e3ec7408
ci: remove slack notification step (secret not configured) 2026-02-28 21:48:30 +00:00
Viktor Barzin
99e75177b5
ci: make slack notification non-blocking when secret is missing 2026-02-28 20:22:49 +00:00
Viktor Barzin
c5398d865a
ci: trigger build 2026-02-28 20:11:50 +00:00
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