гора.
Real estate / международный каталог

Aperwind — каталог недвижимости Таиланда

Каталог на 839 лотов, который каждое утро пересобирается из чужой Google-таблицы и при этом не теряет ни одного проиндексированного адреса.

Регион
Таиланд — Пхукет, Бангкок, Самуи, Паттайя
Роль
Fullstack-разработчик, архитектура
Период
2026
Ниша
Real estate / международный каталог

Сайт публичный (aperwind.com), NDA нет. Внутренние бизнес-метрики не публикуются.

Это сводка по проекту. Дальше — три параллельных рассказа: бизнес-логика, обзор админки, технический стек.

Каждый раздел самодостаточен.

Что внутри

  • 839 строк каталога в базе, 657 лотов на витрине, 600 адресов объектов в карте сайта — три разных числа, каждое считается своим правилом.
  • Каждому лоту выдаётся собственный постоянный номер (882 выдано); он переживает переименование кода в таблице поставщика и держит связь со старым URL.
  • Синк каталога идёт ежедневно в 10:00 по Бангкоку, применяет план одной транзакцией и останавливается на порогах: >25% изменённых лотов, >30% скачок цены, >5% пропавших строк.
  • 1 958 адресов в четырёх картах сайта: 979 страниц в двух локалях, `lastmod` только у тех лотов, чью правку мы застали.
  • Собственная аналитика на 7 таблиц: append-only события, идемпотентность на трёх уровнях, запись сеансов rrweb, сквозной отказ от сбора.
  • 22 508 исходных кадров, 70 076 webp-деривативов в четырёх ширинах; выбор обложки для каждого проекта записан в git с доказательством.
  • Семь зависимостей в проде: ни CSS-фреймворка, ни ORM, ни библиотеки локализации — 1 715 строк собственного CSS и 397 тестов.
  • Деплой по пушу в main: вебхук плюс страховочный крон, сборка, рестарт и smoke-запрос; провал smoke останавливает выкатку.

Стек

  • 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 (конвейер каталога)
  • rclone
  • Docker
  • nginx
  • systemd
  • Let's Encrypt / certbot
  • Google Search Console API
  • Google Analytics 4
  • Telegram Bot API
  • 7—13 сентября 2026GA4 тег теперь статический в HTML, а не после гидратации. Google видит его в исходнике.
  • 7—13 сентября 2026Каталог: рекомендованные ЖК из админки, пять проектов сняты по запросу, ручной порядок карточек.
  • 7—13 сентября 2026Описания лотов: даты в прошлом удалены, графики платежей таблицей, чужие типы скрыты, 69 переводов под git.
  • 31 августа — 6 сентября 2026Мобильная главная 9196px → 5200px, все тап-таргеты 44×44, фото на первом экране вместо текста.
вся хроника по Aperwind