Локальный inference отгружен — теперь его должны найти: кластер страниц вокруг AI background remover

Соло-разработчик Convertify на неделе 16 выкатил on-device удаление фона на Rust — ort, ISNet, libvips, без Python в проде. На неделе 17 он сознательно не трогал inference-код и занялся тем, что для одного человека с ИИ-фичей в продукте часто важнее модели: превратить рабочий инструмент в страницы, которые поисковики связывают между собой. В отчёте автора это сформулировано жёстко — «shipping the feature is the easy half».
Неделя 16: нейросеть в продукте без Python-обвязки
Фича недели 16 — AI background remover. Стек зафиксирован в серии building in public: Rust-native рантайм, ort для inference, модель ISNet, обработка изображений через libvips. Python в цепочке нет — для соло-разработчика, который тащит нейросетевую capability в веб-инструмент сам, это практичный паттерн: меньше лишних звеньев в деплое, inference остаётся локальным относительно продукта.
Демо живёт на convertifyapp.net — в конце поста автор даёт ссылку на /remove-background. Сама capability уже работает; неделя 17 начинается с признания, что «скучная, но высокорычажная» часть только впереди.
Неделя 17: hub-and-spoke вокруг одной AI-фичи
Модель hub-and-spoke строится вокруг уже отгруженного background remover. Hub — общая страница инструмента (/remove-background в нарративе). Два spoke под конкретные use-case:
/remove-signature-background— удаление фона у подписи;/amazon-product-photo-background— подготовка фото товара для Amazon.
Итого три live-страницы в кластере. План на неделю предполагал один–два spoke; сделано два — эта часть в отчёте отмечена как удачная. Код нового engine на неделе не писался: весь фокус на том, чтобы одна уже отгруженная AI-фича стала набором страниц, которые могут ранжироваться.
«Не про написание ещё кода движка» — про превращение одной рабочей capability в страницы, которые могут ранжироваться, и про связку, по которой их находят поисковики.
Почему страницы AI background remover стали «сиротами»
До правки spokes ссылались на hub в body, но hub не ссылался обратно на spokes. Ссылки на инструменты сайта жили во фронтенд-константе IMAGE_TOOLS — compress, resize, crop, images-to-pdf — без background remover и его веток. Новые страницы попали в sitemap, но без внутренних ссылок, передающих сигнал. Для молодого домена, который ещё набирает доверие Google, такие URL индексируются медленно и ранжируются ещё медленнее. Параллельно на сайте около 180 converter-страниц, которые «не знали» о новом кластере.
Константа кластера и перелинковка вокруг inference-инструмента
Решение — единый источник правды BACKGROUND_TOOLS:
export const BACKGROUND_TOOLS = [
{ label: "Background Remover", href: "/background-remover" },
{ label: "Signature Background", href: "/remove-signature-background" },
{ label: "Amazon Product Photo", href: "/amazon-product-photo-background" },
] as const;
В тексте hub описан как /remove-background, в константе hub — /background-remover; демо-ссылка в посте ведёт на …/remove-background. Оба варианта зафиксированы в источнике — без выбора «канонического» URL.
Серверный компонент BackgroundTools рендерит секцию «Background Removal» со ссылками из константы. Prop exclude убирает текущую страницу из списка — страница не ссылается сама на себя. После внедрения hub ссылается на оба spoke; каждый spoke — на hub и «соседа»; блок показывается только на страницах background-removal кластера.
Детекция типа страницы упростилась: вместо трёх повторяющихся проверок slug'ов — одна строка:
const isBgRemoval = BACKGROUND_TOOLS.some((tool) => tool.href === `/${mode}`);
Тот же список добавлен колонкой в footer — ссылки на кластер есть на каждой странице сайта, не только внутри hub-and-spoke. Правило масштабирования: четвёртый spoke — одна строка в BACKGROUND_TOOLS, автоматическая перекрёстная перелинковка везде.
Баг доставки контента spokes — не в модели, но в проде
Spokes хранятся как structured content в БД; body секций рендерится через dangerouslySetInnerHTML внутри <p>. На одном spoke чеклист «before you upload» был оформлен как <ul> внутри <p> — hydration mismatch в production: браузер автозакрывает <p> перед списком, DOM расходится с server HTML.
Фикс: только inline-контент в body секции; чеклист — строки через <br>. Добавлен build-time guard: сканирует bodies секций на block-level теги (ul, ol, li, div, table, headings) и падает сборку, если находит — чтобы класс бага не ушёл в прод снова.
Для соло-цикла вокруг ИИ-фичи это напоминание: spokes вокруг inference — тоже код доставки. SEO-кластер не спасёт, если production-рендер ломается на CMS-разметке.
Честные цифры: inference, sandbox и citations
Метрики из раздела «The honest numbers»:
| Показатель | Значение |
|---|---|
| Live background-страницы | 3 (hub + 2 spokes) |
| Бенчмарк на VPS (4 ядра) | p50 ~2,4 с, p95 ~9,6 с на изображение |
| AI citations (Microsoft Copilot) | 75, в основном по HEIC-контенту |
| домен «всё ещё в sandbox»; impressions есть, средняя позиция ~mid-40s, клики — «trickle» | |
| Bing | те же страницы на первой странице выдачи |
Расхождение Google и Bing автор трактует как норму для молодого домена; стратегия — «waiting it out while the content compounds», не «fighting» sandbox. Локальный inference на VPS отрабатывает за секунды, но findability отстаёт — типичная картина, когда capability уже в проде, а органика ещё не догнала.
Планы недели 18: медленные spokes вокруг той же AI-фичи
Дальше — ещё spokes, но медленно: Google spam updates наказывают тонкие template-swap страницы. В посте зафиксировано правило: одна–две хорошие страницы с уникальными данными, не десять «оболочек». В списке — дополнительные use-case spokes, страница под низкоконкурентный запрос webp remove background из keyword data, продолжение «медленного» наращивания backlinks для domain authority — «real ceiling right now».
Вывод для соло-разработчика с on-device inference: отгрузить модель — половина пути; вторая половина — честно связанные страницы, footer как глобальный слой ссылок и терпение к sandbox, пока контент накапливается.
Источники
- Serhii Kalyna, «Building in public, week 17: turning one feature into a page cluster (and the internal-linking layer nobody sees)» — Dev.to (дата доступа: 2026-07-05)
- Convertify, демо background remover — https://convertifyapp.net/remove-background (дата доступа: 2026-07-05)