---
name: freetierradar_overview
description: "FreeTierRadar — TG-бот-радар бесплатных тарифов нейросетей/облаков/хостинга (новый, 2026-06-15)"
metadata: 
  node_type: memory
  type: project
  originSessionId: c6abb068-77dd-4154-a110-71fd998b29e3
---

**FreeTierRadar** — новый TG-бот (@FreeTierRadar_bot, токен 8810417101) на mac mini:
сам сканирует сеть, отбирает актуальную халяву по нейросетям/облакам/VPS, проверяет
площадку (бейдж ✅/⚠️/🚫), переводит на русский, шлёт владельцу (1005954706, тест
8688355181) карточку с пошаговой инструкцией + ссылкой на оригинал.

**Хранение:** код `~/Services/freetierradar`, данные `/Volumes/Ext/Services/freetierradar`
(внешний диск, mount-guard). venv `~/.venvs/freetierradar` на **brew Python 3.14**
(системный 3.9+LibreSSL ломает TLS). Токен в `~/.config/freetierradar.env` (chmod 600,
keychain по SSH залочен). launchd `com.cebers.freetierradar`.

**Источники (Phase 0 recon):** Reddit нативный `.rss` (API НЕ нужен — `.json` 403, `.rss`
200), HN Algolia, RSS HuggingFace/Groq/ProductHunt, free-VPS LowEndBox/LowEndTalk, ddgs
через [[cebersresearch_overview]], **TG-каналы** (t.me/s/, см. ниже), **GitHub** (v0.3.3:
Search API по нише + сиды cheahjs/free-llm-api-resources + ripienaar/free-for-dev; README
вместо HTML; отказ от репо-дампов чужих ключей; опц. `FTR_GITHUB_TOKEN`; пометка 🐙). **X/
Twitter отложен — Nitter мёртв (5/5).**

**Ключевая боль — LLM:** бесплатные web2api [[deepseek_qwen_free_api]] под нагрузкой дают
429 И 200-с-пустым-content (~1/3 надёжность). Решение (D3): обогащение = медленный
дренажер, транзиентный сбой НЕ реджектит (остаётся `new`), **2 транспорта** —
CebersResearch OpenAI :20130 → [[omniroute_cloud_bus]] Anthropic :20127 codex (/v1/messages),
backoff на 429, префильтр до LLM. Claude-модели запрещены (правило). Цепочка: deepseek-chat
→ gpt-5.4-mini → codex/gpt-5.4-mini.

**Фичи отбора:** `/mode` fresh|all (свежие за 10д ↔ все неистёкшие), автоудаление
неактуального (purge_stale: истёкшие expires_at, старые отказы, доставленное >30д).

**Прод (launchd жив, e2e пройден 2026-06-15):**
- TG с RU-IP мини недоступен напрямую → бот ходит через xray HTTP-прокси
  `http://127.0.0.1:2081` (`AiohttpSession(proxy=...)`, нужен пакет `aiohttp-socks`).
- launchd падал `EX_CONFIG (78)` из-за лог-путей на /Volumes/Ext → **логи на внутренний
  диск** `~/Library/Logs/freetierradar/`, данные/БД остаются на внешнем.
- e2e через [[tg-web-e2e]] (gaechkin-venv, прокси 2081): /start /latest /mode /stats — ок,
  карточка рендерится (бейдж+инструкция+ссылки+превью).
- **Enrichment LLM РЕШЁН (v0.2):** primary = **z.ai glm-4.5-flash через OmniRoute-шину
  :20129** (модель `zai/glm-4.5-flash`, Bearer общий `OMNIROUTE_API_KEY`, `stream:false`+
  `thinking:{type:disabled}` обязателен, ~1с). Ключ z.ai хранит OmniRoute (юзер завёл
  провайдер `zai`), в боте прямого ключа НЕТ. ⚠️ бесплатная только glm-4.5-flash; glm-5/5.1
  на шине могут жечь деньги. Цепочка: z.ai(20129)→web2api(20130)→codex(20127). 80 офферов.
- **Фильтр качества (v0.2):** LLM даёт `kind`(offer/guide/question/discussion/news/ad)+
  `topic`(ai/cloud/hosting/devtools/offtopic)+`hosting`(cloud/local/na); проходит только
  offer|guide И не offtopic И **hosting!=local** — отсекает чужие вопросы «помогите найти»,
  Q&A, новости, офтоп (игры) и **локальное** (GGUF/llama.cpp/Ollama/on-device/скачиваемые
  веса). Юзер хочет ТОЛЬКО облачный доступ (API/кредиты/VPS/плейграунд). D13.
- **UI (v0.2):** постоянное меню снизу (Свежие/Поиск/Надёжность/Категории/Режим/Статус/
  🙈Скрыть кнопки → ReplyKeyboardRemove, вернуть `/menu`).
  Фильтры/просмотр = **master-detail**: список кнопок (1 кнопка=оффер, бейдж+заголовок) →
  клик → то же сообщение редактируется в карточку + «⬅️ Назад к списку» → возврат. Пагинация
  ⬅️/➡️ внутри списка (PAGE_LIST=8). НЕ сыпать карточки пачкой (юзер просил). Доставка НОВЫХ
  находок — по-прежнему карточками (DELIVER_PER_CYCLE=6). e2e в реальном TG пройден.
- **Контентный дедуп (D14):** колонка `dedup_key`=хост целевой ссылки (иначе провайдер);
  все выборки через `_all_freebies()` схлопывают по ключу, `deliverable()` исключает уже
  доставленные ключи → один оффер из разных источников шлётся 1 раз (UNIQUE(source,source_id)
  ловил только повтор из ОДНОГО источника). Маршрут z.ai теперь через OmniRoute :20129.

- **Спринт 1 / v0.3.0 (2026-06-16) — качество выдачи, всё проверено реально в проде:**
  (1) **liveness** `linkcheck.py`: `dead` только при HTTP 404/410 или NXDOMAIN, иначе
  `unknown` (консервативно — ложный dead прячет рабочий оффер); `dead` вон из `_all_freebies`.
  (2) **репутация** `reputation.py`: keyless-first — Freenom-зоны (.tk/.ml/.ga/.cf/.gq)→🚫
  + мягкие (IP-литерал/punycode/сокращатель/дешёвый TLD); опц. усиление Google Safe Browsing
  при `FTR_SAFE_BROWSING_KEY`; флаг `needs_card` «❗ нужна карта» в карточке. (3) **фидбэк**
  `✅/❌/👎` (callback `fb:<id>:ok|bad|junk`) на доставленных и в детальном просмотре → таблица
  `feedback`; bad/junk→`hidden=1` (вон из выдачи/доставки)+клавиатура убирается. Новые колонки
  `needs_card/link_status/link_checked_ts/hidden`+таблица `feedback` (миграция в `_migrate`).
  Даунранк источника/провайдера по голосам — отложен (D17, нужна выборка). **Открыто:** TG-
  каналы (ждём @хэндлы), курируемые free-LLM трекеры — Спринт 2. Decisions D15/D16/D17.

- **Спринт 2 / v0.3.1 (2026-06-16) — TG-каналы ВКЛючены.** `FTR_TG_CHANNELS` в
  `~/.config/freetierradar.env` = 6 шт: `neyroskuf, denissexy, neurohive,
  ai_machinelearning_big_data, Artificial_intelligence_in, AI_Best_Tools` (последние 2 нашёл
  и проверил сам — дают реальные free-офферы; правка набора = одна строка env, без релиза).
  Читаем через `t.me/s/<канал>` (прокси :2081). **Приватные invite `t.me/+…` НЕ читаются**
  (нет публичного превью → нужен MTProto-юзеробот, не делаем). Курируем по offer-density:
  neyroskuf высокий выход, остальные смешанные; новости/мемы/промты отвергнуты (жгут LLM,
  префильтр гасит до вызова). Карточка показывает `📨 источник: Telegram @<канал>`. Проверено
  реально: 67 постов собрано, TG-оффер «Google AI Studio» в выдаче (verified, link=ok), TG e2e
  с пометкой источника. Решение D18.

- **v0.3.2 (2026-06-16) — самодостаточные карточки (D19).** Боль: карточка-список вела
  «перейдите на reddit и почитайте», а нужны КОНЕЧНЫЕ ссылки в инструкции. Фикс 3 слоя:
  `content.py` `fetch_readable` дочитывает целевую страницу (href сохраняются; **reddit — через
  тред-RSS `<permalink>/.rss`**, HTML пустой/`.json` 403; 1 ретрай, reddit троттлит повторы);
  промпт ужесточён + temperature=0; **страховка кодом** — `content.offer_links` извлекает
  конечные ссылки, и если модель выдала <2 при ≥3 в источнике, дописываем блок «🔗 Прямые
  ссылки» без доп. LLM-вызова (flash нестабилен в извлечении: то 13, то 0 при одном входе).
  `llm.chat_json(temperature=)`, z.ai max_tokens 2200. Проверено реальным TG: карточка «Список
  бесплатных API для LLM» показывает 13 провайдерских ссылок.
  **Бэклог пропатчен БЕЗ LLM (2026-06-16):** полный ре-энрич дорог (~1 карточка/мин, жжёт
  квоту) → отвергнут; вместо него LLM-free патч — для «бедных на ссылки» (208) дочитываем
  источник и, если это список (≥3 ссылок), дописываем блок «🔗 Прямые ссылки» прямым UPDATE
  `instructions_ru`. Итог: 33 карточки-списка пропатчены, `deliveries` не тронуты → без ре-
  доставки. Проверено реальным TG. Ограничение: статьи без ≥3 прямых ссылок (visionvix и т.п.)
  не патчатся. Патч-скрипт разовый (в репо не лежит) — повторить можно, если бэклог снова
  накопит списки.

- **v0.3.4 (2026-06-17) — раздел «📦 По провайдерам» + ослабление правила ключей (D21).**
  `providers.py` (19 канонов key→эмодзи+домены+алиасы) + детерминированный `tag()` (по доменам
  ссылок+тексту, без LLM). Колонка `items.providers` (json), навигация-режим `prov`
  (latest_by_provider/count_by_provider). Группировка «нашёл codex→раздел Codex». Бэкафилл
  тегов без LLM: 89/256 (ChatGPT/Codex 35, Gemini 39, Claude 27, OpenRouter 23…). **Правило
  ключей ослаблено** (выбор юзера «легальное+общинные/промо»): разрешены офиц. free-tier, промо/
  giveaway/триал-ключи, осознанные общинные раздачи своих ключей (метятся менее надёжными);
  по-прежнему reject — дампы ВОРОВАННЫХ ключей/доступ к чужому аккаунту/reverse-proxy через
  чужие ключи. Проверено реальным TG (Codex-раздел «найдено 30») + граница (дамп→reject,
  промо→ok).

- **v0.3.5 (2026-06-18) — кодинг-фокус пушей + дедуп-фикс + прокси⚠️ (D22).** Уведомления =
  только `is_coding` (поле: LLM ИЛИ детерминированно «есть тег LLM-провайдера»; `notify_focus`
  setting, дефолт coding). VPS/картинки → в каталог/разделы БЕЗ пушей. **Дедуп переписан**:
  ключ = норм. ИМЯ ПРОВАЙДЕРА (Oracle/OpenRouter/GitLab), не домен статьи и НЕ модель-теги
  (иначе склеит всех кто даёт Opus); 0 дублей по (провайдер,кат), разные сервисы раздельно;
  бэкафилл ключей сделан. **Прокси** (`access_type` official|proxy_pool|key_dump): proxy_pool
  (Aerolink/китайские прокси) присылаем с ⚠️ (trust↓ + строка в карточке), key_dump (дампы
  чужих ключей) → reject. Провайдеры: алиасы по границе слова (Opus/GPT/bare GPT, без ложных),
  добавлены Kimi(Moonshot)+MiniMax. Проверено реально (gitlab→пуш, vps→только каталог, aerolink→
  proxy⚠️+пуш, keydump→reject, дубли=0). **Открыто:** спец. абуз/халява-TG-каналы с кодинг-
  контентом (GitLab Duo/Kimchi/Duet) — ждём @хэндлы (главный фикс «вообще не попадаются»).

- **Закрытые TG-каналы — НЕ читаем (решение владельца, 2026-06-18).** Закрытый канал
  технически берётся только MTProto-юзерботом (аккаунт-участник, Telethon). Владелец сначала
  выбрал юзербот на основном аккаунте, потом отказался («данные всё равно в вебе»). Telethon
  1.44 поставлен на venv, но юзербот НЕ используется. Вместо этого (v0.3.6) заточили ПУБЛИЧНЫЕ
  источники под кодинг-ИИ: +9 web-запросов (Opus/GPT/Claude/Kimi для кода + прокси, RU/EN),
  +5 сабреддитов (ChatGPTCoding/SillyTavernAI/ClaudeAI/vibecoding), +HN-запросы, +GitHub-сид
  inmve/free-ai-coding. Ловим публичное; эксклюзив закрытых каналов — мимо (честное ограничение).

- **v0.3.7 (2026-06-18) — актуальность.** Боль: прислал закрытый оффер (Gemini Code Assist).
  Причина: undated websearch (`posted_ts=None`) → фильтр свежести брал `fetched_ts`=сегодня →
  старьё всегда «свежее»; источник = tiktok.com/discover (пусто). Фикс: `content.fetch_readable`
  извлекает дату публикации (HTML meta/JSON-LD/`<time>`, reddit-RSS, markdown «Last updated») и
  возвращает `(текст, дата)`; в enrich → `posted_ts` если источник не дал. `deliverable` теперь
  пушит ТОЛЬКО с РЕАЛЬНОЙ датой в пределах MAX_AGE (без fallback на fetched_ts) — недатированное
  остаётся в каталоге, но не в пушах. +реджект явно завершённых офферов в промпте. «Закрыт ровно
  сегодня» статически не ловится → кнопка ❌ Не работает.

Obsidian `Projects/freetierradar` (5 файлов). Деплой: rsync с **абсолютным** путём
(относительный в фоне срывается). e2e: [[tg-web-e2e]].
