gora.
Real estate / international catalogue

Aperwind — Thailand property catalogue

A catalogue of 839 listings that is rebuilt every morning from someone else's Google sheet and still never loses an indexed URL.

Region
Thailand — Phuket, Bangkok, Samui, Pattaya
Role
Fullstack developer, architecture
Period
2026
Industry
Real estate / international catalogue

The site is public (aperwind.com), there is no NDA. Internal business metrics are not published.

This is the project overview. What follows are three parallel accounts: business logic, admin panel tour, technical stack.

Each section stands on its own.

What's inside

  • 839 catalogue rows in the database, 657 listings on the storefront, 600 object URLs in the sitemap — three different numbers, each counted by its own rule.
  • Every listing gets its own permanent number (882 issued); it survives a renamed supplier code and keeps the link to the old URL.
  • The catalogue sync runs daily at 10:00 Bangkok time, applies its plan in one transaction and stops at thresholds: >25% of listings changed, >30% price jump, >5% rows missing.
  • 1,958 URLs across four sitemaps: 979 pages in two locales, with `lastmod` only on listings whose edit we actually witnessed.
  • In-house analytics over 7 tables: append-only events, idempotency at three levels, rrweb session replay, end-to-end opt-out.
  • 22,508 source images, 70,076 webp derivatives in four widths; the cover chosen for each project is recorded in git with its evidence.
  • Seven production dependencies: no CSS framework, no ORM, no i18n library — 1,715 lines of hand-written CSS and 397 tests.
  • Deployment is a push to main: webhook plus a fallback cron, build, restart and a smoke request; a failed smoke stops the release.

Stack

  • Next.js 15 (App Router)
  • React 19
  • TypeScript 5.7
  • PostgreSQL 16
  • node-postgres (pg)
  • Node.js 22
  • node:test
  • sharp
  • rrweb
  • isbot
  • tsx
  • Python 3 (catalogue pipeline)
  • rclone
  • Docker
  • nginx
  • systemd
  • Let's Encrypt / certbot
  • Google Search Console API
  • Google Analytics 4
  • Telegram Bot API