# Написал агрегатор скидок DealHunter на React Native и Node.js и запустил PWA
Мне 18. Несколько месяцев назад мне в голову залетела идея — сделать один сервис, который собирает скидки отовсюду. Не знаю откуда она взялась, просто сидел, втыкал в телефон и подумал: «а было бы прикольно». Через пару дней уже писал первый парсер. Вот что из этого вышло.
##Что это вообще такое
DealHunter — агрегатор скидок. Парсит 37 магазинов каждые 6 часов: Steam, Ozon, Wildberries, Яндекс Маркет, Aviasales, Спортмастер и ещё кучу всего. Собирает в одну ленту, фильтрует, показывает историю цен.
Стек: React Native (Expo) для мобилки, Node.js для парсеров, Supabase как база, GitHub Actions для автоматизации.
Самая жирная часть проекта — 19 парсеров, ~4000 строк. Каждый магазин — отдельная головная боль.
У Ozon XML-фид весит 800 МБ. Я не опечатался — восемьсот мегабайт. Когда первый раз запустил, нода сожрала 4 гига RAM и упала. Переписал на потоковый парсинг.
Спортмастер — 86 МБ, 21 тысяча товаров. Парсю через Python регексами по XML. Да, я знаю. Но работает быстрее нормального парсера, и мне норм.
Яндекс Маркет — открытого API для скидок нет. Парсю поисковую выдачу с пагинацией.
Steam — есть API, но с Rate Limiting. Если часто дёргать — банят.
У каждого парсера свой прикол. Где-то HTML меняется раз в неделю, где-то обрезают API, где-то блокируют по User-Agent. Постоянно что-то чинишь.
##Почему PWA, а не App Store
Сначала сделал приложение на Expo. Работало нормально. Потом полез публиковаться.App Store — $99/год + комиссия 30% с каждой продажи. У меня подписка 249 рублей. Apple забирает 75 рублей. Просто за то что хостят.
Google Play — $25 + 15% комиссия + модерация неделю.
Я подумал и сделал PWA. Один HTML-файл, 2700 строк, ванильный JS, без фреймворков. Хостинг — GitHub Pages, бесплатно. Деплой — git push. Push-уведомления работают, оффлайн-кэш есть, иконка на домашнем экране.
Работает быстрее Expo-версии, потому что нет React Native моста.
##Как устроено
Каждые 6 часов: sync-all.js → 19 парсеров → фильтр → Supabase → data.json для PWA → push-уведомления подписчикам
Раз в неделю: cleanup — убирает протухшие скидки
Есть админка — один HTML-файл, показывает магазины, клики, подписчиков, логи. Никакого React, просто fetch и таблицы.
Загружаю скидки нового магазина в 3 ночи — ошибка foreign key. Забыл добавить магазин в таблицу `stores` перед тем как пихать туда скидки. Потерял час.Задеплоил фикс — пользователи видят старую версию. Service Worker закэшировал. Теперь при каждом обновлении меняю версию кэша вручную.Web Push на iOS работает только если PWA на домашнем экране и iOS 16.4+. На старых айфонах — никак.
Есть телеграм-бот для входа в аккаунт через телегу.
- 37 магазинов
- ~1700 скидок в базе
- 19 парсеров, 20к строк кода
- Синхронизация автоматическая, каждые 6 часов
- PWA работает из РФ без VPN
##Что дальше
Больше магазинов, публикация в RuStore, регулярные обновления ну и, естественно, какой-нибудь заработок.
-**PWA**: [pwa.dealhunterapp.online]( https://pwa.dealhunterapp.online )
-**Лендинг**: [dealhunterapp.online]( https://dealhunterapp.online)
Настроен я не оптимистично, но и не пессимистично, думаю какая-никакая аудитория соберётся, но не на уровне какой-нибудь копии Notion для РФ :) Проект на 98% закончен, остались всякие мелочи по типу -поправить это, исправить то.
Кстати, кому интересно сколько было потрачено на проект — 200 рублей на покупку домена. Ну и конечно куча нервов и 2 месяца на создание.
*Забавный случай: полчаса при добавлении таблиц через SQL в Supabase я ломал мозг почему они не находятся через код — оказалось, что это был совсем другой проект, я просто забыл поменять *