0000000000000000000000000000000000000000 b75a5c01dacdd2024b913659e07f6cbec8adf8ca unknown <Administrator@WIN.(none)> 1782116653 -0700	reset: moving to origin/main
b75a5c01dacdd2024b913659e07f6cbec8adf8ca c9966d46c00fe8d18ce64e16b55c5b034558d12d Baikov <baikov@example.com> 1782117104 -0700	commit: Docs: mark deploy pipeline verified (e2e test)
c9966d46c00fe8d18ce64e16b55c5b034558d12d 600c09df1d45cfadfda91826cc37238a2f9d590c Baikov <baikov@example.com> 1782118587 -0700	commit: Auth: phone login/registration as primary (flash call), email secondary in modal
600c09df1d45cfadfda91826cc37238a2f9d590c c2c9d78cdf4cabbc2359bc18f5441e004ea53cba Baikov <baikov@example.com> 1782118904 -0700	commit: Reviews: strip HTML tags from review body on submit
c2c9d78cdf4cabbc2359bc18f5441e004ea53cba 8201180133e5a67d6ded36f1ba5a8b4350b9d7a1 Baikov <baikov@example.com> 1782120426 -0700	commit: Ads: allow changing category until first publish (blocked/never-published)
8201180133e5a67d6ded36f1ba5a8b4350b9d7a1 f05da3d9ebf42fc5161c2f71d9483b0c459680ed Baikov <baikov@example.com> 1782122512 -0700	commit: Cabinet: 'Внешние площадки' + Telegram mini-apps (Phase 1a)
f05da3d9ebf42fc5161c2f71d9483b0c459680ed a2332b40df49f59343a89ba2b92fa3091680701d Baikov <baikov@example.com> 1782123044 -0700	commit: Telegram mini-apps Phase 2: initData auth + start_param entry
a2332b40df49f59343a89ba2b92fa3091680701d 1b00bcb02ed436946b41dcd767be93887a743c70 Baikov <baikov@example.com> 1782124359 -0700	commit: Telegram mini-app: in-app ad posting + phone via Telegram contact
1b00bcb02ed436946b41dcd767be93887a743c70 2dd0a4976337d6190416e97d23be87bfbe644015 Baikov <baikov@example.com> 1782124648 -0700	commit: Telegram mini-app: link to existing account when shared phone is taken
2dd0a4976337d6190416e97d23be87bfbe644015 d1c4a103efeab0567809acdfae4446daffbb79c0 Baikov <baikov@example.com> 1782124911 -0700	commit: Widget/mini-app: empty categories = all (cascade full tree + postable any leaf)
d1c4a103efeab0567809acdfae4446daffbb79c0 ef3aadc7c8c9c24cbf670fd80c8013f114581d71 Baikov <baikov@example.com> 1782125254 -0700	commit: Mini-app posting: load & save category attributes (характеристики)
ef3aadc7c8c9c24cbf670fd80c8013f114581d71 c324ed53550cd601fa2494bc9b6d6d6573eeb36c Baikov <baikov@example.com> 1782126335 -0700	commit: Mini-app posting+viewing: contact method, location map, in-app ad card
c324ed53550cd601fa2494bc9b6d6d6573eeb36c 840708710c0829806b9f1b207af678cecbca1cc8 Baikov <baikov@example.com> 1782127268 -0700	commit: Add /external-app marketing landing (site widget + Telegram mini-app)
840708710c0829806b9f1b207af678cecbca1cc8 83d1d25c1df28ae2a06290acae92da61272b6519 Baikov <baikov@example.com> 1782127608 -0700	commit: Footer: add 'Виджеты и Telegram' link to /external-app landing
83d1d25c1df28ae2a06290acae92da61272b6519 0d37088cbdf998bd2a986e061ac1666168797052 Baikov <baikov@example.com> 1782127999 -0700	commit: Auth pages /login & /register: phone-first (reuse shared auth-form partial)
0d37088cbdf998bd2a986e061ac1666168797052 82021c743953c74cd859b9fc736166f8e8665987 Baikov <baikov@example.com> 1782128281 -0700	commit: Widget auth popup: phone-first login (flash call -> token), email/Yandex secondary
82021c743953c74cd859b9fc736166f8e8665987 53e2257737568db7b5a3f8d999a3b4b6d3d263db Baikov <baikov@example.com> 1782128791 -0700	commit: PWA: installable web app (manifest, service worker, icons, meta)
53e2257737568db7b5a3f8d999a3b4b6d3d263db 6096f3e938d4ad585b0445b82f629022c5d16b71 Baikov <baikov@example.com> 1782128901 -0700	commit: PWA: serve manifest via route for correct Content-Type across servers
6096f3e938d4ad585b0445b82f629022c5d16b71 14d63b2ebd914ee0574642c1a767de3e826ae637 Baikov <baikov@example.com> 1782129270 -0700	commit: Chat: wrap long unbroken text (fix widget stretch + message bubbles)
14d63b2ebd914ee0574642c1a767de3e826ae637 f6029793c06fc14eebe4c2bb673cf42c81d6abf5 Baikov <baikov@example.com> 1782131578 -0700	commit: Cabinet: bulk imports (Массовые загрузки) — YML with DeepSeek categorization
f6029793c06fc14eebe4c2bb673cf42c81d6abf5 433f702adbe0830ad8b258528183f6e1c349b78b Baikov <baikov@example.com> 1782131782 -0700	commit: docs: add imports.md (bulk imports mechanism) + README index
433f702adbe0830ad8b258528183f6e1c349b78b 666b454c4631da3e0cca6486836f4b320949b806 Baikov <baikov@example.com> 1782132396 -0700	commit: docs: phone-first auth + Telegram mini-apps; update widget popup auth
666b454c4631da3e0cca6486836f4b320949b806 254c56fed2841de5c10c8d6cdcb76dc00a3a921a Baikov <baikov@example.com> 1782132753 -0700	commit: Imports: multi-root category classification (fixes fabric→clothing misroute)
254c56fed2841de5c10c8d6cdcb76dc00a3a921a 2a0ea142a0a7b3a870959044ece009730a9def69 Baikov <baikov@example.com> 1782133304 -0700	commit: Imports: stronger source-category weighting + explicit fabric rule
2a0ea142a0a7b3a870959044ece009730a9def69 21a3deeff5cd7f2f6cc0e3747326d7071620a57e Baikov <baikov@example.com> 1782133703 -0700	commit: Imports: on source delete, ask to keep or delete its ads (required choice)
21a3deeff5cd7f2f6cc0e3747326d7071620a57e 35c79b69521c93e13d5436b449aa6508f97dd6b8 Baikov <baikov@example.com> 1782201178 -0700	commit: Imports: cleaner create-page hint (drop engine name and unfinished-attributes note)
35c79b69521c93e13d5436b449aa6508f97dd6b8 753b6fed016f0b14ae8c791fd004708c72b4e5ea Baikov <baikov@example.com> 1782201787 -0700	commit: Admin: site-wide custom meta tags & analytics counters (head/body)
753b6fed016f0b14ae8c791fd004708c72b4e5ea f0aee32cfb448fbbf892bd2df6bb24270b8fb5e3 Baikov <baikov@example.com> 1782202899 -0700	commit: Fonts: self-host Golos Text + Onest (Cyrillic) via Bunny, drop Google CDN
f0aee32cfb448fbbf892bd2df6bb24270b8fb5e3 725ed0c6cd4356a21ed0c6851c08d601664394c3 Baikov <baikov@example.com> 1782203735 -0700	commit: Fonts: stop preloading every variant (preload: false) - drops 28 <link> tags from <head>
725ed0c6cd4356a21ed0c6851c08d601664394c3 db0a40d481426a49885f2f7ccd4e55683433b6df Baikov <baikov@example.com> 1782204202 -0700	commit: Ad page: add 'Рекомендации для вас' block (contextual + personalized) under seller's other ads
db0a40d481426a49885f2f7ccd4e55683433b6df 26b17ddf6c5a4e782b60f2064ef6fe5c55e47ad9 Baikov <baikov@example.com> 1782204352 -0700	commit: Fix: ad page 500 - \ eagerly bound in when() closure before assignment
26b17ddf6c5a4e782b60f2064ef6fe5c55e47ad9 16ed209cd93462de5e86b8ff846d7253dd051e90 Baikov <baikov@example.com> 1782209048 -0700	commit: Cities: path-based city pages (/krasnodar, /krasnodar/c/...) with city-first listings + SEO
16ed209cd93462de5e86b8ff846d7253dd051e90 a2fa55297bc29954a833df1bf1dd93371d462e86 Baikov <baikov@example.com> 1782209327 -0700	commit: Cities: base indexing/footer/sitemap on real active-ad counts (ads_count is unmaintained)
a2fa55297bc29954a833df1bf1dd93371d462e86 32655b00f5422e09548ed0de537df27c5fcbb6a9 Baikov <baikov@example.com> 1782209984 -0700	commit: Cities: lower indexing threshold 30 -> 5 active ads
32655b00f5422e09548ed0de537df27c5fcbb6a9 2be8d247086d147ae10b1a87cd07e77f7aa744e8 Baikov <baikov@example.com> 1782214107 -0700	commit: Widget: allowed-domains restriction (per-domain incl. subdomains) via Origin/Referer check
2be8d247086d147ae10b1a87cd07e77f7aa744e8 078ab32c4113b1bb34f296cffecd9d8fe74c57db Baikov <baikov@example.com> 1782214412 -0700	commit: Widget: own-domain bypass only for exact APP_URL host, not its subdomains
078ab32c4113b1bb34f296cffecd9d8fe74c57db ee7f0fdd0cc78eca7ea424fd778d767ac4c55e5d Baikov <baikov@example.com> 1782286478 -0700	commit: Auth: phone/Telegram/Yandex accounts no longer get a fake email (fixes unchangeable email)
ee7f0fdd0cc78eca7ea424fd778d767ac4c55e5d a32229e94f23e78b757f5d33fa07f8db3118194d Baikov <baikov@example.com> 1782287550 -0700	commit: Cabinet: allow deleting archived (completed) ads, not just blocked ones
a32229e94f23e78b757f5d33fa07f8db3118194d 726eaa732b3e5069f4288b98e5d8ed0d3ee84aa4 Baikov <baikov@example.com> 1782956617 -0700	commit: Profile: don't 500 on email-change when mail sending fails
726eaa732b3e5069f4288b98e5d8ed0d3ee84aa4 cf3717f3ff7119fc949912766c690ddf1356d370 Baikov <baikov@example.com> 1783021715 -0700	commit: Admin: DeepSeek usage & cost tracking per user/ad
cf3717f3ff7119fc949912766c690ddf1356d370 d6a539509a625d81e06b2bc8d8ba5f8b11591aae Baikov <baikov@example.com> 1783022137 -0700	commit: Security: rate-limit DeepSeek-triggering endpoints
d6a539509a625d81e06b2bc8d8ba5f8b11591aae 16b3ac216c1df74e5ad3e717a4df75e3472fa3e9 Baikov <baikov@example.com> 1783156094 -0700	commit: Blog: articles section with admin, translit slugs and BlogPosting schema
16b3ac216c1df74e5ad3e717a4df75e3472fa3e9 47357cf7427ae542ff0d45d043104d957e6b6558 Baikov <baikov@example.com> 1783156183 -0700	commit: Build: recompile assets for blog views (line-clamp, aspect-ratio)
47357cf7427ae542ff0d45d043104d957e6b6558 38eed7fddd3e3e25e24f6651acaa7b1640f8f86c Baikov <baikov@example.com> 1783157040 -0700	commit: Docs: blog module, DeepSeek cost tracking & rate limiting
38eed7fddd3e3e25e24f6651acaa7b1640f8f86c 85fa383c29f3bbdfc5fe133e7eea40d5f3fb8228 Baikov <baikov@example.com> 1783472039 -0700	commit: Notifications: clickable links in new-ads batch notifications
85fa383c29f3bbdfc5fe133e7eea40d5f3fb8228 f151fde006ce54ddcd6424daa5f0939e7aab2724 Baikov <baikov@example.com> 1783473013 -0700	commit: Blog: WebP-сжатие обложек (превью + версия статьи) и фикс даты
f151fde006ce54ddcd6424daa5f0939e7aab2724 e08ba92271116757cb7f83cd177bb0c72d832739 Baikov <baikov@example.com> 1783488997 -0700	commit: Widget/MiniApp: настраиваемые фильтры ленты (категории, цена, поиск, сортировка)
e08ba92271116757cb7f83cd177bb0c72d832739 201db93cf5bc383e9947e95213931a35ed3933eb Baikov <baikov@example.com> 1783490458 -0700	commit: Widget: фикс CSS-коллизии классов фильтра категорий
201db93cf5bc383e9947e95213931a35ed3933eb 7d4313fa2b2d5c3c2b77ed1183d8b074383e0b3e Baikov <baikov@example.com> 1783491715 -0700	commit: Widget: перенос текста в вертикальных вкладках + select в одну строку с фильтрами
7d4313fa2b2d5c3c2b77ed1183d8b074383e0b3e 60e28d30df54f96ecac73f4cd801b2b5e5537dd4 Baikov <baikov@example.com> 1788438233 -0700	commit: Auth: Яндекс SmartCaptcha перед обратным звонком + журнал звонков
60e28d30df54f96ecac73f4cd801b2b5e5537dd4 2054f403c91a0287198b4093193ad064a12347a9 Baikov <baikov@example.com> 1788438607 -0700	commit: Auth: лимит 5 звонков на номер в час, независимо от IP
2054f403c91a0287198b4093193ad064a12347a9 ce277d1b0ba3a5d2e8e3a4009c49523e811db991 Baikov <baikov@example.com> 1788785703 -0700	commit: Журнал звонков: чистка по расписанию, два срока хранения
ce277d1b0ba3a5d2e8e3a4009c49523e811db991 754ae8721d5dace11e5a114afadffced3bad865c Baikov <baikov@example.com> 1788901426 -0700	commit: Фото объявлений: водяной знак Placeo.ru на большой версии
754ae8721d5dace11e5a114afadffced3bad865c 3f5c1a45dc5955b35dea32034a49348c3af8d952 Baikov <baikov@example.com> 1789135293 -0700	commit: Admin: /admin/ads падал с 500 из-за пользователей без имени
3f5c1a45dc5955b35dea32034a49348c3af8d952 38bf840190b42c77358cc3f73beada9ad9d75522 Baikov <baikov@example.com> 1789344219 -0700	commit: Docs: планировщик и воркер под Hestia — ловушка с pcntl_signal
