# Написал агрегатор скидок 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 я ломал мозг почему они не находятся через код — оказалось, что это был совсем другой проект, я просто забыл поменять *