← На главную

Разработчик собрал Marlin: 560 тыс. домашних страниц, $10 и выходные

13.08.2026 13:36 · hackernews

Разработчик собрал поисковик на 560 183 домашних страницах за выходные и примерно $10 на аренду GPU. Идея появилась в два часа ночи: его бесило, что в поиске личные сайты тонут под корпоративными доками и SEO-мусором. Хотелось находить портфолио, маленькие арт-проекты, зины, софт и не натыкаться на docs.company.com.

Архитектура — четыре процесса. Фетчер тянет домен по HTTPS, при ошибке по HTTP, достаёт title, текст и ссылки простым HTML-парсером без JavaScript. Воркер отдаёт страницу локальной модели Gemma на 4B параметров, получает название, описание, категорию и теги, а потом стирает сырой текст. Стюард независимо следит за доменами, которые производят подозрительно много страниц, и спрашивает модель, блокировать ли их. API и маленький веб-интерфейс дают поиск, фильтры и скрытие ненужных категорий.

Первая версия заработала за пару часов, но каталог оказался неправильным: больше 90% — корпоративные сайты. Вместо блокировок автор ввёл приоритеты в очереди: страницы из категорий portfolio, zine и software поднимают свои исходящие ссылки вверх, corporate и docs опускают. Файл category-priority.txt стал главным инструментом управления краулером.

Затем поплыли баги: модель записала «academic-profile» в описание и выдумала целый сайт фурри-сообщества для пустой GoDaddy-парковки. Отсюда правило: верить видимому тексту, а не заголовку и не домену.

Tumblr и Neocities начали затапливать индекс. Их не заблокировали, а поставили лимит: максимум 100 поддоменов на корневой домен. Это мгновенно удалило 45 000 страниц из очереди. Tumblr всё равно дал больше 9 000 страниц, но перестал доминировать.

Для суммаризации автор арендовал облачный GPU. Первая схема с wrapper на Vast.ai/vLLM заняла CPU и недогружала GPU. Вторая — обычный vLLM с выделенным CPU — выдала около 600 суммаризаций в минуту при цене $0.35 в час. Получается примерно доллар за 100 000 сайтов.

Автоматический стюард сам заблокировал 177 проблемных доменов — почти все отельные и букинговые помойки. Благодаря ему индекс вырос с 65 000 до 560 000 страниц без ручного контроля.

Главная боль — теги и категории. Модель нагенерила 671 категорию и больше 121 000 тегов, половина встречается один раз. Вручную такое не вычистить. Если делать что-то серьёзнее, нужно заранее ограничивать модель фиксированным списком. Ещё 15% страниц оказались пустыми: это JavaScript-оболочки и бот-защита. Рендерить полноценный браузер автор не стал — это отдельный дорогой проект.

Код он выложит как open source под названием Marlin — из Finding Nemo, про поиск через океан.

Читать оригинал →