{"name":"NeBlask changelog","source":"https://affpapa.org/neblask/changelog","license":"CC BY 4.0","generated_at":"2026-09-13T18:29:33+00:00","total_releases":57,"total_changes":463,"entries":[{"version":"6.12.3","date":"2026-08-21","title":"Без DataForSEO: шесть бесплатных источников, починенные лицензии, омонимы Wikipedia","summary":"Владелец решил пока не пополнять DataForSEO — раунд «делай всё, что можно без него». Индекс от DFS не зависит (CrUX-срез по 65 странам, крон 15-го числа). Добавлены Wikipedia pageviews, HIBP-утечки, Affiliate Guard Dog (профильный для affpapa сигнал: 17 rogue + 148 warning брендов), реестр авторизованных операторов Бразилии SPA (48 брендов, .bet.br-домены), RDAP (регистратор/истечение/DNSSEC), Common Crawl (размер сайта, «закрыт от ботов»). Вскрыто: 80 из 159 «статей Wikipedia» были омонимами, импорт лицензий MGA не запускался с 07.08, матчер лицензий не знал про юрлицо-оператора.","changes":[{"type":"feature","text":"`neblask:wiki-pageviews` — просмотры статьи за 13 месяцев (daily-эндпоинт Wikimedia, monthly за закрытый месяц отдаёт лишь 1-е число), MoM/YoY/пик; строка в блоке «Популярность и авторитет». `neblask:hibp-breaches` — Have I Been Pwned (1026 утечек, один запрос): 1win 96M записей, Paddy Power 591K, Borgata/MGM 27,9M; янтарная плашка «Утечка данных»; матч по названию только у утечек без своего домена (aura.com/playbook.vc — тёзки)."},{"type":"feature","text":"`neblask:affiliate-guard-dog` — 1800 партнёрских программ из индекса AGD (rogue 85 / predatory 328 / certified 289): сматчено 564 бренда — rogue 17 (Unibet с 2008, Ladbrokes, PokerStars, William Hill, Videoslots…), warning 148 (1xbet, 22bet, Betwinner, Casumo, 888casino, Roobet…) с флагами «Predatory T&Cs»/«Negative Carryover» и датой «Moved to Rogue House». Красная/янтарная плашка «Партнёрская программа…» на паспорте, `signals.affiliate_guard_dog` в API."},{"type":"feature","text":"`neblask:brazil-spa` — 85 юрлиц / 188 марок / 164 домена .bet.br с gov.br: 48 брендов получили лицензию `spa-br` (портария SPA/MF), 10 новых .bet.br-доменов. Предохранитель: юрлицо на >3 брендов (Skill On Net LTDA → 25 немецких вайтлейблов) считается группой и не матчится."},{"type":"feature","text":"`neblask:rdap` — RDAP вместо WHOIS: регистратор, created/expires, EPP-статусы, DNSSEC; закрыто 40 из 453 дыр whois_created; «истекает через N дн.» янтарём на паспорте (William Hill: 12 дней). Лимиты по зонам: SIDN (.nl) и Nominet режут с первого запроса — breaker считается per-TLD. `neblask:cc-index` — Common Crawl CDX: URL/хосты/доля 403 («закрыт от ботов»: bet365 94%), рост между кроулами, первый кроул; блок «Web footprint»."},{"type":"fix","text":"Wikipedia: 80 из 159 статей в `extra.wikipedia` были чужими (Lemon → цитрус, Kraken → чудовище, Vegas → город, Toto → сантехника, Coral → кораллы). `WikipediaPull` теперь требует гемблинг-слова в описании, иначе пробует «Name (bookmaker)/(casino)/(company)» (Coral → «Coral (bookmaker)»), иначе `exists=false, homonym=true`. Омонимы сброшены, полный перепрогон запущен."},{"type":"fix","text":"Лицензии: `neblask:import-mga-licenses` (Puppeteer по JS-реестру MGA) не был ни в расписании, ни в autopilot с 07.08 — теперь в autopilot/14д. `LicenseMatcher` получил шаг «ядро юрлица == юрлицо-оператор бренда»: MGA 27 → 60 матчей (лицензий MGA 19 → 61), общий пулл перезапущен. Скреперы KSA (реестр переехал) и ADM (Liferay) мертвы — по 5 лицензий, хвост."},{"type":"ops","text":"В autopilot: wiki-pageviews 30д, hibp 7д, rdap 30д, cc-index 60д, brazil-spa 7д, affiliate-guard-dog 14д, import-mga-licenses 14д. API-контракт: 82 сигнала. `trans_choice()` в партиалах заменён на `Nav::plural` (давал «2 юрисдикция»). +45 тестов."}]},{"version":"6.12.2","date":"2026-08-21","title":"Перепроверка и обогащение: 8 блоклистов, реестр Curaçao CGA, честный freshness, DFS-guard","summary":"Третий заход за день — по просьбе владельца «перепроверь всё основательно и обогащай». Блоклистов стало 8 юрисдикций (добавлены Греция, Норвегия, Швейцария): 1013 из 1979 брендов в ≥1 реестре. Подключён публичный реестр лицензий Curaçao Gaming Authority (PDF, 661 лицензия + 31 отзыв): лицензий CGA в базе 18 → 144, два отзыва на таймлайне (KTO, GeniePlay). Найдено, что neblask:freshness по построению всегда говорил OK, а у autopilot не было защиты от нулевого баланса DataForSEO — оба закрыты.","changes":[{"type":"feature","text":"Блоклисты +GR (HGC, xlsx через ZipArchive, 14.8k апексов с датой решения), +NO (Lottstift, CSV с версионной ссылкой со страницы), +CH (Gespa + ESBK, PDF через pdftotext, 4k апексов с датами). CH считается загруженным только если пришли обе половины. Итог: GR 657, PL 635, IT 478, CH 400, CZ 135, BE 132, FR 59, NO 48 брендов."},{"type":"feature","text":"`neblask:cga-registry` — реестр Curaçao Gaming Authority: PDF с CDN (самый свежий по дате в имени), pdftotext, парсер переносов юрлиц/статусов и опечаток регулятора. Матчинг по ядру юрлица с `extra.operator`, точному имени/алиасу бренда, pg_trgm ≥ 0.8 (порог 0.6 давал только ложные: Horizonix→horizon). B2B-лицензии в бренды не пишутся. 95 B2C-лицензий → 135 строк брендов (Dama N.V. → Oshi/Joo/24Casino; Scores55 → mBit/7Bit/KatsuBet). 31 запись enforcement-реестра → `neblask_enforcement_actions` (license_revoked). Миграция: unique лицензии стал (regulator, number, brand) — одно юрлицо на много казино."},{"type":"fix","text":"`neblask:freshness` считал свежесть сигнала как `max(updated_at)` строк бренда с ключом — любое обновление бренда чем угодно делало сигнал «свежим», отсюда вечный «0 stale». Теперь `max(checked_at)` самого сигнала; добавлены Blocklists, Operator, Sanctions, CrUX, PageSpeed, Trustpilot deep, Site crawl, Enforcement, Domain backlinks."},{"type":"fix","text":"Autopilot: баланс DataForSEO читается один раз за прогон; при балансе < $0.50 все DFS-задачи (trends, clickstream, domain-rank и organic-traffic из FREE_TASKS, который исторически тратил $1.2/прогон без учёта) пропускаются с пометкой вместо падений «40200 Payment Required». `--dry-run` показывает баланс."},{"type":"fix","text":"TrustScore: отозванные/истёкшие лицензии (revoked, expired, suspended, surrendered, lapsed) больше не дают баллов в regulatory-компоненте — до этого отзыв CGA считался как активная лицензия (+3)."},{"type":"data","text":"8 «main»-доменов из serp_discovery оказались чужими площадками (quora, weebly, bigcartel, tiktok.com, yelp, blogspot, gitbook) → kind=rejected, их crux/blocklist/urlscan сброшены. Оператор: приоритет материнских регуляторов (UKGC/MGA/GI/IM/Alderney/CGA) над локальными рыночными — William Hill → WHG (International) Limited (GB) вместо WHG Ceuta S.A. (ES); паспорт показывает «Страна лицензии» и «Источник: реестр регулятора UKGC / Casino Guru / Wikipedia (LLM)»."},{"type":"ops","text":"SanctionsCheck при исчерпанной квоте OpenSanctions возвращает 0 (интервал 1д, алерт был бы ежедневным шумом); `cga` добавлен в config/neblask.php regulators; OpenAPI-описание signals → 79 типов; +22 теста (BlocklistSourcesTest 11, CgaRegistryTest 11)."}]},{"version":"6.12.1","date":"2026-08-21","title":"Догон по решению владельца: ScrapFly-регуляторы, новые источники популярности, шардинг, бюджетные дыры","summary":"Владелец разрешил тратить ScrapFly и квоты: NJDGE и DGOJ снова отдают enforcement (+110 записей с датами), три новых источника популярности/авторитета (CrUX top-1M уже собран: 637 брендов; Open PageRank и Cloudflare Radar ждут бесплатных ключей), pagespeed/trustpilot-deep/site-crawl поставлены в autopilot, Safe Browsing ходит батчами по 500, у тяжёлых парсеров появился --workers. Попутно найдены две причины «никогда» в статусе autopilot: domain-rank оценивался в $0.40 при дневном бюджете $0.33, а PageSpeed читал ключ через env() и годами работал без ключа.","changes":[{"type":"fix","text":"Enforcement NJDGE: старые страницы DGE удалены (честный 404), данные теперь из WP REST `njoag.gov/wp-json/wp/v2/posts?categories=127,66` через ScrapFly (asp, us; 25 кредитов/прогон). DGOJ: сайт убрал префикс `/es/` — отсюда 404 отовсюду; подключены реестр `datos-estudios/resoluciones-sancionadoras` (год, оператор, ES/YYYY/NNN, тип) и `/novedades` (1 кредит/страница). Испанские ключевые слова и суммы («1.200.000 euros», «1,5 millones de euros»). published_at заполнен у всех новых строк; matched-to-brand: DGOJ 20."},{"type":"feature","text":"`neblask:crux-rank` — Chrome UX Report top-1M (CSV без ключа, ~5 с прогон): 637 брендов с рангом (top-1k: 10, top-5k: 19, top-10k: 28, top-50k: 101). Апекс засчитывается только если бренд им владеет — иначе b9casino получал top-1000 от quora.com. `neblask:openpagerank` (батчи по 100, заголовок API-OPR) и `neblask:cf-radar` (rank/bucket/категории/top-локации, circuit-breaker на 429) готовы и ждут `OPENPAGERANK_API_KEY` / `CLOUDFLARE_RADAR_TOKEN` в .env — до этого пишут маркер skipped_no_api_key и не светятся в API."},{"type":"ui","text":"Паспорт: блок «Популярность и авторитет» (CrUX top-N, OPR, Radar + аудитория) — монохром, моно-цифры; `signals.crux/openpagerank/cf_radar` в API v1 (контракт 79)."},{"type":"fix","text":"Autopilot: domain-rank оценивался в $0.40 за 200 доменов при дневном бюджете $0.33 — `canSpend()` не проходил ни разу, отсюда «Domain Rank: никогда». Ручной прогон по всему каталогу вскрыл вторую ошибку: константа `COST_DOMAIN_RANK=0.002` занижала цену в 12 раз — `backlinks/summary/live` стоит $0.024/домен, 997 доменов съели весь баланс DataForSEO ($23.94 → −$0.02). Данные получены (1088 доменов с backlinks/rank), но trends/clickstream встанут с «Payment Required» до пополнения. Константа исправлена, слот autopilot — 12 самых старых доменов ($0.29) раз в 30 дней, DomainRank идёт stalest-first вместо алфавита. PageSpeed читал `env('GOOGLE_PAGESPEED_KEY')` — на проде после config:cache это null; переведён на `config('services.google.pagespeed_key')`."},{"type":"ops","text":"В autopilot добавлены pagespeed (300/нед), trustpilot-deep (100/нед, ScrapFly), site-crawl (150/нед, ~13 кредитов/бренд), crux-rank/openpagerank/cf-radar (30д). Разовые догоны запущены: pagespeed 500, trustpilot-deep 300 (готово), site-crawl 300."},{"type":"perf","text":"Safe Browsing v4 — батчи до 500 URL за один POST вместо запроса на бренд (одна схема https: API канонизирует URL); сбой запроса больше не пишет not_found на 14 дней; починен preserveKeys-баг, из-за которого бренд, бывший is_safe=true, не мог стать false. Ключ подвязан к Google-ключу PageSpeed — владельцу осталось включить Safe Browsing API в проекте 1080501741246."},{"type":"perf","text":"`--workers=N --worker=K` (шардинг по id, трейт `ShardsByWorker`) у 13 тяжёлых команд: DeepScan, ScreenshotCapture, SecurityCheck, SupportScan, SiteCrawl, GeoScan, GeoScanExtended, BonusesScan, TrustpilotReviews, PageSpeed, DnsInfra, DomainHealth, WhoisAge (последним трём добавлен --limit). DomainHealth при шарде не перезаписывает сводный снапшот."},{"type":"test","text":"+45 тестов: WorkerShardingTest (13), SafeBrowsingBatchTest (9), PopularitySourcesTest (9), EnforcementParsingTest +14 (NJ JSON, реестр DGOJ, испанские суммы)."}]},{"version":"6.12.0","date":"2026-08-21","title":"Блоклисты регуляторов, оператор без LLM, stalest-first по-настоящему","summary":"Новый сигнал паспорта — реестры блокировок пяти регуляторов (IT ADM, FR ANJ, PL Минфин, BE Gaming Commission, CZ Минфин): 814 из 1987 брендов с доменами в ≥1 реестре. Юрлицо-оператор теперь собирается из лицензий и каталогов без LLM: 48 → 690 брендов. Найдено, что фикс same-100-brands от 20.08 был мёртвым кодом — ни один парсер не передавал ключ свежести; подключён во все 22. Закрыты три тихих бага, которые подменяли данные: 429 от OpenSanctions записывался как «clean», urlscan 19 часов крутил 429 вхолостую, autopilot падал целиком из-за одной задачи.","changes":[{"type":"feature","text":"`neblask:blocklist-sync` — реестры доменов, предписанных к блокировке: IT (txt, 10.5k апексов), FR (csv с датой решения), PL (XML API, 26k апексов), BE (HTML), CZ (CSV cp1250 с версионной ссылкой). Матчинг по eTLD+1 (`App\\Support\\Apex`), зеркала по подстроке намеренно не считаются. В autopilot раз в 7 дней, без ключей, прогон ~1 мин. Блок «Блокировки регуляторов» на паспорте, `signals.blocklist` в API v1."},{"type":"ui","text":"Паспорт: красный блок с таблицей «страна · регулятор · домен · с какой даты · записей». У лицензированных в стране операторов (кросс-чек с реестром лицензий: adm/anj/gc-be) — янтарный бейдж «лицензия в стране есть»: в ADM попадает международный .com, локальная .it работает легально. Текст блока прямо говорит, что это не оценка честности выплат."},{"type":"feature","text":"`neblask:operator-extract` переписан: wiki-описание есть лишь у 160 брендов, поэтому добавлена цепочка без HTTP — `neblask_brand_licenses.legal_entity` (реестры регуляторов) → Casino Guru owner/operator → AskGamblers company → CasinoListings → Casino Guru краткий (только с корпоративным суффиксом). Флаг `--no-llm`. Покрытие operator ok: 48 → 690 брендов; страна = юрисдикция лицензии с пометкой `operator_country_basis`."},{"type":"fix","text":"Critical: stalest-first в `loadBrandsForScraping()` (v6.11.0) не работал — все 22 вызова шли без `$freshnessKey` и по-прежнему крутили первые 100 брендов алфавита (serp: обновлённые за 3 дня = ранги 1..100 по имени). Ключ прописан в каждый парсер (SiteCrawl → about_page, DeepScan → languages), закреплено тестом. Медиана возраста ~35 сигналов (22 дня) начнёт падать с ближайших прогонов."},{"type":"fix","text":"`neblask:sanctions-check`: HTTP 429 от OpenSanctions молча превращался в «clean» с checked_at — за один прогон так «очистили» 400 брендов, включая реальные хиты по Parimatch/Pin-Up/Betwinner (санкции СНБО Украины) и литовскому списку нелегалов. Теперь 429 = исключение без записи, стоп после 3 подряд; ложные clean сегодняшнего прогона сброшены. Плюс фильтр схожести имён (`Polar Limited` больше не матчит «ЗАПОЛЯРНАЯ СТРОИТЕЛЬНАЯ КОМПАНИЯ») и очистка спецсимволов запроса (`A/S` давал HTTP 400). В autopilot — 100 брендов ежедневно вместо 50 раз в 30 дней."},{"type":"fix","text":"`neblask:urlscan-fingerprint`: анонимная квота 500 search/день на IP; прогон `--limit=2500` 19 часов ловил 429 (3×60с на бренд) и не записал ничего. Добавлены `API-Key` из `config('services.urlscan.api_key')`, ожидание по `X-Rate-Limit-Reset-After`, остановка после 3 брендов подряд с 429 (`RateLimitedException`). Без ключа рост покрытия ≤150 брендов/день."},{"type":"fix","text":"Autopilot возвращал FAILURE при любой упавшей задаче из 60 — cron-алерт «autopilot failed» приходил каждый день с 15.08. Теперь FAILURE только если не отработала ни одна задача; частные падения остаются в `Log::error` и `--status`. `withoutOverlapping(1200)` вместо дефолтных 24 часов."},{"type":"fix","text":"`neblask:enforcement-sync`: MGA переехал на `/licensee-hub/enforcement-register/` (аккордеон с датой в заголовке) — 0 → 30 записей с датами; UKGC отдаёт даты текстом «20 August 2026» — `published_at` был NULL у 100% строк, теперь заполнен у UKGC/MGA. `extractOperator`: без `/u` em dash резал UTF-8 и терял оператора; `\\bpenalis\\b` не матчил «penalised»; `matchBrand` получил `word_similarity` для юрлиц длиннее бренда («William Hill Organization Ltd» → william-hill)."},{"type":"security","text":"`neblask:whois-age`: `shell_exec(\"whois {$domain}\")` без экранирования — домен приходит из discovery-парсеров. Теперь `escapeshellarg`."},{"type":"perf","text":"Sleep-дефолты выровнены по реальным лимитам API: DnsInfra и SecurityCheck 1→0 (локальный резолвер / каждый бренд — свой хост, −40 мин на прогон), Wikipedia-парсеры 1→0.3, Reddit 2→6 (10 req/min без auth — раньше каждый третий запрос получал 429 и sleep 30), VirusTotal 2→16 (4 req/min), AppStore 1→3. CasinomeisterPull: eager-load доменов вместо N+1."},{"type":"ops","text":"Убиты 16 осиротевших bash-вотчеров с 07–20.08: `until [ $(pgrep -f \"artisan neblask\" | wc -l) -le N ]` никогда не завершается — pgrep матчит собственную командную строку. Миграция `2026_08_21_090000` фиксирует pg_trgm и CHECK `neblask_brands_extra_object_chk`, которые жили только на проде."},{"type":"api","text":"API v1 `brands/{slug}.signals`: добавлены `operator`, `sanctions`, `urlscan_fingerprint`, `blocklist` — контракт расширен с 72 до 76 сигналов (расширение, не breaking change)."},{"type":"test","text":"+98 тестов / 240 ассертов: `BrandMergeExtraTest` (атомарный merge, CHECK), `ScrapesIntoBrandExtraTest` (stalest-first, mergeIntoExtra не затирает данные при сбое), `OperatorExtractTest` (LLM-мок + structured-цепочка), `EnforcementParsingTest` (regex-регрессия delimiter `#`, pg_trgm-матчинг), `UrlscanFingerprintTest` (circuit-breaker на 429, API-Key). Полный сьют: 929 → 1027+ зелёных."},{"type":"research","text":"Исследование 50+ источников: следующая волна — CrUX top-1M (CSV без ключа), Open PageRank и Cloudflare Radar (бесплатные ключи — за владельцем), Kahnawake permit holders, OONI, реестр Curaçao CGA (PDF), блоклисты GR/NO/CH, Brazil SPA. Отклонены с причинами: Google Ads Transparency, PhishTank, Spamhaus, eCOGRA."}]},{"version":"6.11.0","date":"2026-08-20","title":"Compliance на паспорте + fix same-100-brands + перф","summary":"Compliance-блоки (оператор, санкции, whitelabel, enforcement-timeline) появились на паспорте бренда. Найден и исправлен critical-баг покрытия: 30+ парсеров годами обходили одни и те же 100 брендов в алфавите — Winbet/Zenit/Zeus никогда не попадали в extra. Плюс убран лишний refresh() из Brand::mergeExtra (-35k SELECT/сутки).","changes":[{"type":"ui","text":"Паспорт бренда: 4 новых блока — Оператор (юрлицо + страна + штаб-квартира + год + тикер), Санкции (зелёная 'проверено' / красная 'В санкционном списке' с деталями), Whitelabel-платформа (SoftSwiss/Playtech/EveryMatrix + hosting IP/ASN), Timeline enforcement-действий регуляторов. Живой хит: /neblask/brand/nordicbet — BML Group Ltd в литовском списке нелегального игорного бизнеса."},{"type":"fix","text":"Critical: `ScrapesIntoBrandExtra::loadBrandsForScraping` использовал `orderBy('name')->limit(N)` — 30+ парсеров годами обходили одни и те же первые 100 брендов в алфавите. Winbet/Zenit/Zeus никогда не попадали в extra. Заменено на stalest-first (NULL checked_at первыми, потом самые старые), опциональный параметр $freshnessKey — backward-compat."},{"type":"perf","text":"Brand::mergeExtra() больше не вызывает $this->refresh() — 35k лишних SELECT'ов в сутки убрано. Grep подтвердил: ни один парсер не читает $brand->extra сразу после mergeExtra."},{"type":"perf","text":"TrustpilotPull получил --limit=N + stalest-first sort. Autopilot вместо 2373 брендов × 2s (~120 мин прогон) теперь берёт 100 самых устаревших каждый слот (~6 мин, полное покрытие за 24 недели)."},{"type":"fix","text":"Blade cache: crumbs.blade.php скомпилированная версия сыпала 'unexpected token endif' 86 раз с 11:21. view:clear закрыл, /neblask/brand/twin снова 200."},{"type":"fix","text":"Убран /tmp/diag_datesort.php (ручной скрипт, конфликтовал с symfony/var-dumper dump())."}]},{"version":"6.10.0","date":"2026-08-20","title":"Compliance-модуль: операторы, Companies House, санкции, enforcement","summary":"Три новых слоя данных для каждого бренда: юрлицо-оператор (LLM из wiki), корпоративные записи (Companies House UK), санкции (OpenSanctions) + timeline enforcement-действий 8 регуляторов (UKGC/MGA/Spelinspektionen/KSA/iGO/PGCB/NJDGE/DGOJ).","changes":[{"type":"data","text":"OperatorExtract (LLM через CloseRouter): вытаскивает юрлицо-оператора из wiki-описания (Evoke plc, Betsson AB, Kindred Group plc, LeoVegas Gaming Ltd, Ålands Penningautomatförening — уже в базе). Свежесть 90 дней, интервал autopilot 90д."},{"type":"data","text":"CompaniesHouseLookup: директора, PSC (persons with significant control), финансовая отчётность юрлица через api.company-information.service.gov.uk. Ждёт COMPANIES_HOUSE_API_KEY в .env (бесплатный ключ на developer.company-information.service.gov.uk)."},{"type":"data","text":"SanctionsCheck: OFAC/EU/UN/UK sanctions + PEP-статус для оператора и всех директоров через api.opensanctions.org. Ждёт OPENSANCTIONS_API_KEY в .env (OpenSanctions v4 требует ключ на все endpoints — free tier у них есть)."},{"type":"data","text":"EnforcementSync: timeline штрафов, отзывов лицензий, AML-нарушений 8 регуляторов (UKGC/MGA/Spelinspektionen/KSA/iGO/PGCB/NJDGE/DGOJ). Новая таблица neblask_enforcement_actions с fuzzy-match к бренду через pg_trgm. UKGC пилот: £4.75M Evolution Malta, £900k Petfre, £609k QuinnBet AML."},{"type":"fix","text":"EnforcementSync HTML-parser: regex delimiter '#' конфликтовал с '#' внутри character class [^\"#], роняло 4 регулятора из 8. Delimiter заменён на '~', перезапуск догоняет пропущенное."},{"type":"perf","text":"Autopilot 55 → 60 задач (+5 compliance/enforcement). AutopilotRegistryTest 64 passed. Все команды регистрированы, опции валидны."}]},{"version":"6.9.0","date":"2026-08-20","title":"Whitelabel-детекция + аудит: 5 фиксов, +6 сирот в autopilot","summary":"Аудит парсеров 20.08 выявил 8 дыр — все критичные закрыты. Плюс новый источник urlscan.io детектит whitelabel-платформы (SoftSwiss, Playtech, EveryMatrix). Ещё 2 источника в работе.","changes":[{"type":"data","text":"Новый источник urlscan.io: детекция whitelabel-платформ (SoftSwiss/Playtech/EveryMatrix/BetConstruct/Microgaming/Rush Street/Evolution) по filename-паттернам в сканах. Пилот: 3 из 7 брендов детектированы. Работает без API-ключа через публичный /search/ endpoint."},{"type":"fix","text":"DomainHealth snapshot→extra рассинхрон: паспорта показывали данные 24-дневной давности. Патч в saveReport() + batch UPDATE 2040 доменов. Догон запущен."},{"type":"fix","text":"Бренд tennisi (id=82): extra было типа 'number', ломало jsonb_object_keys и freshness-скрипты. UPDATE + CHECK constraint не даст повторить."},{"type":"data","text":"Autopilot +6 сирот: bonuses (14д), sponsorships (30д), reddit-deep (14д), guru-complaints-deep (21д), askgamblers-deep (21д), public-financials (30д). Раньше эти парсеры бежали неизвестно кем — данные могли молча остановиться."},{"type":"perf","text":"Лимиты deep-scan/screenshot/pagespeed подняты с 50-100 до 200. При 2373 брендах цикл 47 дней → 12 дней, покрытие догонится за 2 недели вместо 2 месяцев."},{"type":"perf","text":"AutopilotRegistryTest 63 passed: уже поймал 'public-financials --limit=100' (нет такой опции) до деплоя. Ловит регрессы класса 'переименовал команду, забыл в autopilot' — 4 такие ошибки висели в проде 19.08."}]},{"version":"6.8.0","date":"2026-08-20","title":"Двойное хранилище: sync snapshot→extra для 3 парсеров","summary":"Аудит 20.08 нашёл ту же грабля, что была у trust-score: TrustpilotPull/AppStorePull/PlayStorePull пишут только snapshot, extra устаревает на месяцы. API и паспорт бренда читают extra в первую очередь — молча отдавали старые числа. Плюс +6 парсеров в autopilot и guard-тест против такого регресса.","changes":[{"type":"fix","text":"TrustpilotPull теперь синхронизирует neblask_brands.extra['trustpilot'] после Storage::put — покрытие 645→1294 брендов (+2×), рейтинги свежие сегодня."},{"type":"fix","text":"AppStorePull + PlayStorePull теперь синхронизируют extra['appstore']/['playstore'] после snapshot — паспорт бренда перестанет показывать рейтинги 22-дневной давности."},{"type":"data","text":"Autopilot +6 задач: support-scan (21д), pagespeed (21д), trustpilot-reviews (14д), geo-scan-extended (30д), social-deep (30д), screenshot-capture (30д). Ранее эти парсеры жили без крон-крышки, данные застряли на 30.07 (~22 дня)."},{"type":"perf","text":"AutopilotRegistryTest (53 теста): проверяет, что каждая команда из FREE_TASKS/DISCOVERY_TASKS существует и принимает объявленные опции (--limit, --sleep, --force). Ловит регресс из серии «переименовал команду, забыл в autopilot» — 4 такие ошибки висели в проде 19.08."}]},{"version":"6.7.0","date":"2026-08-18","title":"Крон-крышка для всех парсеров: +22 бесплатных в autopilot","summary":"Аудит парсеров 18.08 показал, что 22 бесплатных парсера жили без расписания и данные по ним застряли на 30.07 (19 дней). Все — под крышкой autopilot с интервалами 7-30 дней.","changes":[{"type":"data","text":"SERP-анализ (1122 бренда), Google Trends (1275), Google News (1421), Casinomeister (1450), Sitejabber, ThePOGG, CasinoListings, Gambling.com (1273), Wizard of Odds (1273), Forum mentions (448), VirusTotal (1171), Safe Browsing (1151), Security extended (1157), DNS-инфра (1412), ScamAdviser (1088), Casino Guru deep, Trustpilot deep, iOS+Android reviews, Affiliate T&C, Homepage deep scan (620), GEO-версии, Organic traffic — все обновляются каждые 7-30 дней."},{"type":"perf","text":"Autopilot теперь покрывает 43 бесплатные задачи (было 21) — раскладывает по дневным слотам, чтобы дневной запуск (05:00 UTC) не забивался неделю."},{"type":"fix","text":"Новые парсеры на проекте отныне обязаны добавляться в FREE_TASKS+FREE_INTERVALS в Autopilot.php — иначе данные умрут молча, замечено через месяц из freshness-алерта."}]},{"version":"6.7.0","date":"2026-08-10","title":"Промо-календарь + НеРейтинг + Реструктуризация навигации","summary":"Три крупных обновления платформы за 07–10 августа.","changes":[{"type":"feature","text":"/promo — календарь рекламных слотов для 4 Telegram-каналов, 2 слота/канал/день, CRUD с паролем"},{"type":"feature","text":"/nerating — антирейтинг операторов: скреперы жалоб, SimHash-дедупликация, AI-обогащение"},{"type":"feature","text":"Реструктуризация навигации: dropdown Ещё, NeBaza, NeNews, чипы + карточки на главной"},{"type":"feature","text":"CSS-аудит: миграция на build.sh, удаление легаси site.css, CssBuildIntegrityTest"},{"type":"feature","text":"Промо-календарь: прошедшие дни скрыты, список бронирований под сеткой"},{"type":"fix","text":"Восстановлен sshd после инцидента с frankenphp restart 07.08"},{"type":"fix","text":"Аудит 10.08: потерянные новости, подделка IP, парсеры — 11 агентов"}]},{"version":"6.6.0","date":"2026-08-06","title":"Навигация и надёжность парсеров","summary":"Меню и URL приведены к одной семье, ложные ночные алармы автопилота отключены, паспорт бренда перестал показывать устаревший trust score.","changes":[{"type":"ui","text":"Новости — первым пунктом меню (важнее продуктовых зонтиков)."},{"type":"ui","text":"URL зарплатных отчётов, сравнений и методологии переехали под /nearbihunter/* — одна семья с самими вакансиями. Старые /reports, /comparisons, /methodology (и слаги) отдают 301."},{"type":"ui","text":"Глоссарий вынесен из меню NeArbiHunter в «Ещё» — это отдельный раздел, не часть вакансий."},{"type":"ui","text":"В меню «Инструменты» стабильные (NeMail, NeAhrefs, NeConf) отделены линией от альф (NeAntik, NeClip)."},{"type":"ui","text":"«Доска объявлений» убрана из меню — её открывает всегда-видимый боковой виджет, дубликат в меню путал."},{"type":"fix","text":"neblask:domain-health больше не даёт ложный «task failed» на 43% ошибок: 401/403/429/451 (Cloudflare-защита от datacenter-IP) не считаются деградацией обхода — домены живы для пользователей, только не пускают наш краулер."},{"type":"data","text":"neblask:trust-score теперь self-heal: после снапшота команда батчем синхронизирует neblask_brands.extra['trust_score']. Раньше extra застревал (749 из 1440), и API /brands/{slug} отдавал устаревшие оценки (twin 42 вместо 34, jetton 34 вместо 28)."},{"type":"perf","text":"Бот @AffPapa_Bot: composer LLM ушёл в очередь intake ещё вчера; сегодня добавлены timeout=85с и failed() — при таймауте пользователю приходит «попробуй ещё раз», не тишина, дублей LLM-запросов нет (85 < retry_after 90)."}]},{"version":"6.5.1","date":"2026-08-05","title":"API Backward Compatibility Restored","summary":"","changes":[{"type":"feature","text":"Восстановлены 45 сигналов /brands/{slug}, выпавших при рефакторинге 04.08 (serp, google_trends, google_news, trustpilot_deep, askgamblers_deep, reddit_deep, scamadviser, virustotal, crt_sh, wayback, telegram и др.) — те же ключи и поля, что в v9"},{"type":"feature","text":"Итого 72 типа сигналов: 70 из v9 + public_financials + sponsorships"},{"type":"feature","text":"Смоук всех 21 эндпоинта: 200 OK; envelope (source/license/docs/generated_at/data) не менялся"},{"type":"feature","text":"Контрактные тесты: 40 passed (315 assertions)"},{"type":"feature","text":"OpenAPI: описание signals обновлено под полный список"}]},{"version":"6.5.0","date":"2026-08-05","title":"Wave 22: Operator Financials, Sponsorships, RU-Bookmakers Autoupdate","summary":"","changes":[{"type":"feature","text":"public_financials: выручка/прибыль/штат/тикер операторов из Wikipedia infobox — 38 брендов (Flutter, Entain, Evoke, Kindred, Betsson, DraftKings и др.)"},{"type":"feature","text":"sponsorships: спонсорские связи из Wikipedia-статей брендов — 89 брендов (клубы, лиги, персоны с контекстом)"},{"type":"feature","text":"neblask:ru-bookmakers: автообновление раздела «Легальные БК России» (vredbuk NUXT_DATA) — еженедельно"},{"type":"feature","text":"Паспорт бренда: 2 новые секции — «Финансы оператора» и «Спонсорство» (итого 28)"},{"type":"feature","text":"API: восстановлены affiliate_rankings и brand_bidding после рефакторинга + добавлены public_financials и sponsorships"},{"type":"feature","text":"Scheduler: +3 команды (ru-bookmakers weekly, public-financials/sponsorships monthly)"}]},{"version":"6.4.0","date":"2026-08-05","title":"Раздел «Легальные букмекеры России»","summary":"","changes":[{"type":"feature","text":"Новая страница /neblask/bookmakers: единственный сегмент рынка РФ с открытой отчётностью"},{"type":"feature","text":"Финансы 16 операторов за 2022-2025: выручка, доля рынка, прибыль, GGR %, динамика"},{"type":"feature","text":"Рыночные показатели: целевые отчисления на спорт и комиссии ЕЦУПИС по годам"},{"type":"feature","text":"Спонсорские портфели 10 БК: 158 контрактов с разбивкой по видам спорта, нейминг-сделки"},{"type":"feature","text":"Амбассадоры 18 БК: 372 персоны с аудиторией по платформам"},{"type":"feature","text":"Партнёрские программы 16 БК: CPA, RevShare, гибрид, admin fee, источники трафика"},{"type":"feature","text":"Сводная матрица позиций в 8 независимых рейтингах (Спортс, РБ, Legalbet, Metaratings и др.)"},{"type":"feature","text":"Пункт «БК России» в навигации NeBlask"}]},{"version":"6.3.0","date":"2026-07-31","title":"Wave 20: Affiliate Rankings, Brand Bidding, Affiliate Network Mapping","summary":"","changes":[{"type":"feature","text":"Affiliate Rankings: composite score from 12 rating sources (AskGamblers, Trustpilot, Casinomeister, ThePogg, etc.), normalized to 0-10 scale — 661 brands enriched"},{"type":"feature","text":"Brand Bidding: SERP analysis identifying affiliates and competitor operators ranking for brand keywords — 1054 brands analyzed"},{"type":"feature","text":"Affiliate Network Mapping: cross-reference of which affiliates promote which brands, top affiliates by coverage (Trustpilot 1004, AskGamblers 672, Casino.Guru 308)"},{"type":"feature","text":"Frontend: 2 new passport sections — horizontal bar chart for aggregator ratings, affiliate SERP presence list"},{"type":"feature","text":"API: affiliate_rankings and brand_bidding signals added (66 total mappings)"},{"type":"feature","text":"Total passport sections: 26 (was 24)"}]},{"version":"6.2.0","date":"2026-07-31","title":"Wave 19: Mass Enrichment Sprint + API v9","summary":"","changes":[{"type":"feature","text":"Mass parallel parsing: 28 parsers running simultaneously on ScrapFly sleep=0-1"},{"type":"feature","text":"Signal coverage: 5 signals at 99%+, 12 at 80%+, 26 at 50-90%"},{"type":"feature","text":"API v9: added geo_extended, wizardofodds, social, crt_sh signals (64 total mappings)"},{"type":"feature","text":"Trust Score recalculated for all 1,276 brands after enrichment"},{"type":"feature","text":"Materialized views refreshed (1,275 brand summaries, 61 country summaries)"},{"type":"feature","text":"Killed expensive parsers (geo-scan, geo-scan-extended, site-crawl) to conserve credits"},{"type":"feature","text":"Cleaned corrupted numeric JSONB keys from 2 brands"},{"type":"feature","text":"Data growth: 43,414 signal records (+6,861 since v6.1.0), 34.0 avg signals/brand"},{"type":"feature","text":"ScrapFly: 881K/1M credits used, 119K remaining"}]},{"version":"4.0.0","date":"2026-07-30","title":"Wave 13: Maximum Enrichment","summary":"13 новых типов сигналов (33→46), 15 парсеров параллельно, ScrapFly 1M план","changes":[{"type":"feature","text":"ScamAdviser trust score 0-100 с highlights (ScrapFly JS+ASP)"},{"type":"feature","text":"Trustpilot Reviews — отзывы + AI-категоризация настроений"},{"type":"feature","text":"Google Safe Browsing — проверка безопасности домена (бесплатный API)"},{"type":"feature","text":"VirusTotal/OTX — репутация, малвэр, pulse count (ScrapFly 1кр)"},{"type":"feature","text":"Security Extended — HSTS preload, CAA, security headers score, cookies"},{"type":"feature","text":"Bonuses — welcome bonus, free spins, wagering, промо-акции"},{"type":"feature","text":"Deep Scan — languages, live_chat, structured_data, content_depth, tech_stack, affiliate_program"},{"type":"feature","text":"PageSpeed — Core Web Vitals (Performance, Accessibility, Best Practices)"},{"type":"data","text":"45 типов сигналов, 20 900+ записей (было 33/14 764)"},{"type":"data","text":"guru_games 234→775 (100%), organic 338→764, dns_infra 422→729"},{"type":"ui","text":"ScamAdviser card, Security dashboard, Bonuses, PageSpeed ring charts, Site Profile"},{"type":"api","text":"API v5 — все 13 новых сигналов в brand response"}]},{"version":"3.9.0","date":"2026-07-29","title":"Wave 12: Verification & Documentation Sync","summary":"Верификация данных после Wave 11, обновление llms.txt (10→23 регулятора), синхронизация документации и memory","changes":[{"type":"data","text":"Бренды 775→776 (+1 после верификации)"},{"type":"data","text":"Подтверждено 23 регулятора в реестре лицензий (было указано 10 в llms.txt)"},{"type":"data","text":"14 764 сигнальных записи по 33 типам — все верифицированы"},{"type":"fix","text":"llms.txt: обновлён список регуляторов 10→23 (UKGC, MGA, GGL, PAGCOR, AGCO, ANJ, SRIJ и др.)"},{"type":"fix","text":"Документация API и changelog синхронизированы с актуальным состоянием БД"},{"type":"content","text":"Карта проекта и memory-файлы обновлены актуальными цифрами"}]},{"version":"3.8.0","date":"2026-07-30","title":"Wave 11: Data Enrichment & New Sources","summary":"4 новых источника данных, 100% RTP coverage, консолидация провайдеров, 15 скраперов в LicensesPull, 27+ фиксов дизайн-системы","changes":[{"type":"data","text":"4 новых источника: DNS Infrastructure (MX/SPF/DMARC), Wayback Machine age, Telegram channels, Responsible Gambling certs"},{"type":"data","text":"737 игр без RTP → 0: все 8482 игры с RTP (100% coverage)"},{"type":"data","text":"4 дубля провайдеров объединены (128→124)"},{"type":"data","text":"52 провайдера получили метаданные (website, founded, HQ)"},{"type":"data","text":"67 игр исправлен kind (slot→live/table)"},{"type":"data","text":"+64 лицензии (356→420), +47 брендов с лицензиями"},{"type":"data","text":"Новый скрапер Gibraltar (gc-gi), 13 лицензий"},{"type":"data","text":"15 скраперов подключены к LicensesPull (было 6)"},{"type":"data","text":"+7 ground truth строк (Колумбия, Бразилия, Нигерия, Кения, ЮАР, Филиппины, Румыния)"},{"type":"data","text":"93 новых немецких бренда обогащены"},{"type":"fix","text":"3 SQL injection исправлены (trending, Momentum, ComplaintsPull)"},{"type":"fix","text":"9 дублей scheduler×autopilot убраны"},{"type":"fix","text":"OOM 128MB в MarketData.php исправлен"},{"type":"fix","text":"Alpine.js поиск на /brands исправлен (input вне x-data)"},{"type":"ui","text":"27+ фиксов дизайн-системы «Лента» (цветовая семантика, JetBrains Mono, hover)"},{"type":"stats","text":"Итого: 775 брендов, 8482 игры (100% RTP), 124 провайдера, 420 лицензий, 33 типа сигналов, 65 artisan-команд"}]},{"version":"3.6.0","date":"2026-07-28","title":"Wave 8: API Expansion + Data Quality Blitz","summary":"6 новых API endpoints, расширенные signals, массовый синк данных, Trust Score v2.0 пересчёт, UI-полировка","changes":[{"type":"api","text":"6 новых endpoints: /trust-scores, /compare, /games/{slug}, /providers/{slug}, /trending, расширенный /brands/{slug}"},{"type":"api","text":"Расширенные signals в brand card: payment_methods, descriptions (en/ru), social, wikipedia, reddit, observatory, tranco, urlhaus, casinoorg, kick, domain_health"},{"type":"api","text":"Домены с полными данными: whois, backlinks, health, dns"},{"type":"data","text":"Meta Ads 114→598 брендов с рекламными данными"},{"type":"data","text":"AppStore/PlayStore→683 брендов, Trustpilot→683 брендов"},{"type":"data","text":"Wikipedia 445→601, Homepage scrape 395→538, Monthly demand 234→654 стран-брендов"},{"type":"data","text":"CrUX performance data 11K→74K записей"},{"type":"data","text":"Wallets добавлены для 6 крипто-брендов (Stake, BC.Game и др.)"},{"type":"data","text":"Twitch/Kick данные синхронизированы"},{"type":"feature","text":"Games: +946 игр (8482 total), +1299 RTP (7745 total), 11/12 пустых провайдеров заполнены"},{"type":"feature","text":"Pragmatic Solutions классифицирован как platform (не game provider)"},{"type":"feature","text":"Trust Score v2.0 пересчёт с полными данными, transparency component работает"},{"type":"ui","text":"Trust Score v2.0 визуализация: 6 компонентов (scale, regulatory, reputation, transparency, infrastructure, digital_presence)"},{"type":"ui","text":"Соцсети X/Instagram/Facebook/LinkedIn в карточке бренда"},{"type":"ui","text":"Кошельки отображаются зелёным моно (JetBrains Mono)"},{"type":"fix","text":"3 API-бага починены (null responses, missing fields, incorrect sorting)"},{"type":"fix","text":"Мусорные not_found записи скрыты из API-ответов"},{"type":"fix","text":"Scheduler дополнен недостающими задачами"},{"type":"fix","text":"Sponsor-flush механизм восстановлен"},{"type":"content","text":"llms.txt обновлён на formula 2.0"},{"type":"api","text":"OpenAPI спецификация расширена на все новые endpoints"}]},{"version":"3.5.1","date":"2026-07-28","title":"Wave 7.1: Transparency + DataForSEO + Mop-up","summary":"Transparency component implemented, DataForSEO enrichment, free scraper retries","changes":[{"type":"feature","text":"Trust Score Transparency component: 8 сигналов, avg 5.61/15 (было ~0)"},{"type":"data","text":"Organic traffic 44.8%→53% via DataForSEO"},{"type":"data","text":"Backlinks 45.5%→49.3% via DataForSEO (ещё растёт)"},{"type":"data","text":"Social 84%→96.8% — social-pull retry для оставшихся"},{"type":"data","text":"Reddit 88%→94.6% — полный рефреш 683 брендов"},{"type":"data","text":"Casino Guru 64.1%→66.9% — retry 300 брендов"},{"type":"data","text":"AI English 37.9%→42.2% (воркеры продолжают)"},{"type":"data","text":"Meta Ads полный прогон запущен (600 брендов)"},{"type":"data","text":"BrandMetaScraper social links: IG 41, FB 28, TW 28, TG 33, YT 16, LI 13"},{"type":"data","text":"Data Freshness: все 24 источника OK"},{"type":"perf","text":"MV refreshed после всех обновлений"}]},{"version":"3.5.0","date":"2026-07-28","title":"Wave 7: Data Completeness + Quality Polish","summary":"Синхронизация snapshot→extra, аудит качества данных, фиксы матчеров, социальные ссылки из HTML","changes":[{"type":"data","text":"Snapshot→extra sync: Trust Score, AppStore, PlayStore, Meta Ads, Kick, Domain Health теперь в API"},{"type":"data","text":"Trust Score 0%→97.1% — пересчёт v2.0 + полная синхронизация в brand extra"},{"type":"data","text":"AppStore/PlayStore 0%→92.5%/92.7% — 17 iOS + 71 Android приложений"},{"type":"fix","text":"CasinoOrg matcher: 26.8%→77.7% — переработан алгоритм сопоставления"},{"type":"data","text":"Wikipedia 46.9%→70.9% — массовый re-run Wikipedia API"},{"type":"feature","text":"BrandMetaScraper: парсинг social-ссылок (FB/IG/TW/YT/TG/LinkedIn) из HTML"},{"type":"data","text":"YouTube data merge: unified extra→youtube + social→youtube (134 бренда)"},{"type":"data","text":"Twitter handles extracted from homepage meta-tags (24 бренда)"},{"type":"data","text":"Domain Health synced to 710 domains в extra"},{"type":"fix","text":"Tennisi: восстановлен повреждённый extra=0, обогащён из snapshots"},{"type":"data","text":"Data quality audit: 0 orphans, 0 dupes, 0 broken FK"},{"type":"data","text":"AskGamblers retry для улучшения покрытия"},{"type":"data","text":"brand-meta --force с социальным парсером (400 доменов)"},{"type":"perf","text":"Materialized views refreshed после всех data syncs"},{"type":"data","text":"AI English enrichment 23.7%→35%+ (2 воркера продолжают)"},{"type":"data","text":"crt.sh 29.1%→31.2% (воркер продолжает)"}]},{"version":"3.4.0","date":"2026-07-28","title":"Wave 6: Full Coverage + Infrastructure + GEO","summary":"Trust Score v2, MV+FTS, GEO-оптимизация, 30+ источников на 90%+ покрытии, полный аудит данных","changes":[{"type":"data","text":"Payment Methods — 684/684 (100%), полное покрытие"},{"type":"data","text":"Organic Traffic — 170→571 (83.5%), DataForSEO $2.94"},{"type":"data","text":"Social Pull — 239+ YouTube-каналов, квота YouTube guard"},{"type":"data","text":"Tranco Rank обновлён — 248→326 (потолок top-1M)"},{"type":"data","text":"AskGamblers обновлён — 177→214"},{"type":"data","text":"AI Enrichment English — 684 брендов, 2 воркера, Claude Sonnet 5"},{"type":"data","text":"Ground Truth — 59→108 строк, 25 рынков, brand revenues"},{"type":"feature","text":"Trust Score v2.0 — новый компонент digital_presence (WHOIS, DNS, Apps, payments)"},{"type":"feature","text":"Калибровка 54/54 стран — 0 uncalibrated, tier 1/2/3 по данным"},{"type":"perf","text":"Materialized Views — brand_summary + country_summary, hourly refresh"},{"type":"perf","text":"Full-Text Search — tsvector + GIN + trigger автообновление"},{"type":"feature","text":"Data Freshness — мониторинг 24 источников, daily Telegram alert"},{"type":"feature","text":"GEO — llms.txt по стандарту, JSON-LD на brand/hub/country/report pages"},{"type":"feature","text":"Citation meta + Dublin Core на всех страницах для AI-цитируемости"},{"type":"feature","text":"Speakable schema на отчётах (Google AI voice)"},{"type":"fix","text":"Аудит данных — 8 дублей провайдеров merged, 1 дубль бренда merged"},{"type":"fix","text":"30 просроченных лицензий status active→expired"},{"type":"fix","text":"Kick.com API переписан под новые эндпоинты"},{"type":"fix","text":"MetaAdLibraryClient env()→config() для кешированного конфига"},{"type":"feature","text":"Autopilot в scheduler — ежедневно 05:00 UTC"}]},{"version":"3.3.0","date":"2026-07-28","title":"Wave 5: Full Coverage + Trust Intelligence","summary":"Trust Score 684 брендов, WHOIS/DNS, Kick.com/Twitch, App Store/Play Store, 30+ источников данных","changes":[{"type":"feature","text":"Trust Score — scoring-модель для 684 брендов (A/B/C/D/F грейды)"},{"type":"ui","text":"Trust Score badge в паспорте бренда — круг с грейдом, tooltip с компонентами"},{"type":"ui","text":"Sparkline тренда спроса интегрирован в паспорт бренда"},{"type":"data","text":"WHOIS age — возраст домена для 684 брендов"},{"type":"data","text":"DNS info — NS/A/CDN записи для 710 доменов (100%)"},{"type":"data","text":"App Store — поиск iOS-приложений для 684 брендов"},{"type":"data","text":"Play Store — поиск Android-приложений для 684 брендов"},{"type":"data","text":"Kick.com — стримы slots/casino (184 стрима, 26K+ зрителей, API переписан)"},{"type":"data","text":"Twitch — стримы slots/casino (64 стрима, 13K+ зрителей)"},{"type":"data","text":"Payment Methods — массовый сбор для 684 брендов (GPT-5.4-mini)"},{"type":"data","text":"Social Pull — 135+ YouTube-каналов, TG-ссылки"},{"type":"data","text":"Brand Meta — homepage meta до 684 (100%)"},{"type":"data","text":"crt.sh — SSL-сертификаты добиты до 684 брендов"},{"type":"data","text":"Meta Ads Library — рекламные креативы брендов"},{"type":"fix","text":"Kick.com API — переписан под новые эндпоинты (старые 404)"},{"type":"fix","text":"MetaAdLibraryClient — env() → config() для совместимости с кешем"},{"type":"feature","text":"Autopilot в cron — ежедневный запуск в 05:00 UTC"},{"type":"ui","text":"Payment Methods секция на странице бренда"},{"type":"ui","text":"Social Links секция (YouTube + Telegram) на странице бренда"},{"type":"ui","text":"Mobile Apps badges (App Store + Play Store) на странице бренда"}]},{"version":"3.2.0","date":"2026-07-28","title":"Wave 4: Infrastructure + Data Pipeline","summary":"GIN-индексы, Redis-кеш x23, тренды, платёжные методы, соцсети, sparkline","changes":[{"type":"perf","text":"GIN-индексы на 4 jsonb-таблицы (neblask_brands, domains, games)"},{"type":"perf","text":"Redis-кеш паспортов — x23 ускорение (1036ms → 45ms)"},{"type":"data","text":"Monthly snapshots — 684 бренда, cron каждые 30 дней"},{"type":"data","text":"AGCC Alderney — 22-й регулятор, 22 лицензии"},{"type":"data","text":"Payment Methods pipeline (GPT-5.4-mini) — методы оплаты брендов"},{"type":"data","text":"Social Pull — YouTube + Telegram каналы брендов"},{"type":"ui","text":"Sparkline-компонент тренда спроса (SVG 120x32)"},{"type":"fix","text":"CORS API — config/cors.php вместо ручных заголовков"},{"type":"fix","text":"TempMail throttle 10/min, Web routes throttle 120/min"},{"type":"feature","text":"QueueHealthCheck — мониторинг очередей каждые 5 мин + Telegram-алерты"},{"type":"feature","text":"Scheduler heartbeat + withoutOverlapping на neblask:index"},{"type":"fix","text":"FreemodelClient fallback на CloseRouter при недоступности freemodel.dev"}]},{"version":"3.1.0","date":"2026-07-27","title":"Wave 3: Полное покрытие — 41 регулятор, 26 источников, AI-описания","summary":"Третья волна расширения: 10 новых регуляторов, бесплатные API безопасности (crt.sh, Mozilla Observatory, URLhaus), интеграция slot.report (5598 слотов), AI-обогащение описаний брендов через Claude Sonnet 5.","changes":[{"type":"data","text":"Новые регуляторы: Coljuegos (CO), HGC (GR), GC-BE (BE), GCC (LT), TMA-EE (EE), SRIJ (PT), DGOJ (ES) + KSA (NL), NJDGE (NJ), PGCB (PA) — итого 41 регулятор"},{"type":"data","text":"crt.sh — Certificate Transparency: верификация SSL-сертификатов доменов казино"},{"type":"data","text":"Mozilla Observatory — автоматический security grade (A+ до F) для каждого домена"},{"type":"data","text":"URLhaus — проверка доменов на малварь и фишинг в реальном времени"},{"type":"data","text":"slot.report — интеграция каталога 5 598 слотов от 83+ провайдеров"},{"type":"feature","text":"AI-обогащение: автоматические SEO-описания брендов через Claude Sonnet 5"},{"type":"feature","text":"Trust Score v2: пересчёт с учётом security grade, SSL и malware-check"},{"type":"api","text":"Открытые фиды лицензий: /neblask/licenses.json и /neblask/licenses.csv (CC BY 4.0)"},{"type":"perf","text":"26 бесплатных источников данных — бюджет DataForSEO оптимизирован до ~$10/мес"}]},{"version":"3.0.0","date":"2026-07-27","title":"Mega Data Expansion: 684 бренда, 2115 игр, Open API, 15 источников","summary":"Крупнейшее обновление NeBlask: утроение базы брендов и игр, 12 регуляторов с публичными реестрами, 65 стран, открытый REST API для AI-агентов, 15 интегрированных источников данных.","changes":[{"type":"data","text":"Бренды 234 → 684 (x2.9): Casino.guru каталог, AffPapa компании, DFS SERP domain discovery"},{"type":"data","text":"Игры 902 → 2 115 (x2.3): SlotCatalog парсинг, 83 провайдера (+29 новых: PG Soft, JILI, CQ9, Spadegaming и др.)"},{"type":"data","text":"Регуляторы 6 → 12: MGA (Playwright DOM-харвест), KGC, GSC Isle of Man, PAGCOR (PDF), GGL, ONJN — 243 лицензии привязаны"},{"type":"data","text":"Страны 53 → 65: +12 гео (RU, AE, HU, RS, IL, SA, EG, MA, ID, MY, SG, TW), 270K ключевых слов (+11 языков)"},{"type":"data","text":"Ground Truth: 59 записей GGR регуляторов, корреляция SoD vs GGR Pearson r=0.84"},{"type":"data","text":"Новые сигналы: Trustpilot (652), Reddit (603), Wikipedia (320), Tranco (248), YouTube (127), whois (389 доменов), DNS (320), CrUX, Twitch, крипто-кошельки"},{"type":"feature","text":"Open REST API v1: 13 эндпоинтов без авторизации, OpenAPI 3.1 spec, CORS, rate-limit 120 req/min, пагинация, фильтры"},{"type":"feature","text":"Эндпоинт /trending: top-20 растущих брендов с change_pct за месяц"},{"type":"feature","text":"Trust Score v2: пересчёт по 684 брендам с учётом всех новых сигналов (avg 17.8, top NetBet 68)"},{"type":"ui","text":"Quick Stats Bar: счётчики брендов/игр/стран/регуляторов на главной NeBlask"},{"type":"ui","text":"Trending Movers Widget: top-5 растущих брендов с процентом роста"},{"type":"ui","text":"Live Search: клиентский поиск брендов на Alpine.js"},{"type":"api","text":"llms.txt обновлён для 13 AI-ботов, robots.txt Allow /api/neblask/, Schema.org WebAPI JSON-LD"},{"type":"perf","text":"Cron-ревизия: 46 задач, бюджет DataForSEO ~$9.9/мес (было бы $250/мес без оптимизации)"},{"type":"fix","text":"Trustpilot: данные писались в snapshot, не в extra — починено + бэкфил 250 брендов"},{"type":"fix","text":"HeadlessFetcher: env(SCRAPFLY_KEY) не работал с config:cache — переведено на config()"}]},{"version":"2.8.0","date":"2026-07-26","title":"API-каталог каналов + медиаплан-калькулятор","summary":"Каталог TG-каналов переведён на API tg.observer с автосинхронизацией каждые 15 минут. Медиаплан-калькулятор с выбором каналов, расчётом бюджета и экспортом CSV.","changes":[{"type":"feature","text":"Медиаплан-калькулятор: чекбоксы, sticky bar с суммой охвата/цены/CPM, экспорт CSV"},{"type":"data","text":"Каталог каналов через API tg.observer (380 каналов, автосинхронизация 15 мин)"},{"type":"fix","text":"NeAgent: счётчики анимации (x-intersect → x-init, Alpine без Intersect)"},{"type":"fix","text":"Методология: текст на полную ширину контейнера (было 720px)"},{"type":"fix","text":"Changelog: нормализация данных (строки → объекты, дефолты для title)"},{"type":"ui","text":"Страновые пилюли: горизонтальный скролл вместо переноса строк"},{"type":"ui","text":"Таблица каналов: исправлен мобильный вид (правильные nth-child после чекбоксов)"},{"type":"perf","text":"API-клиент tg.observer: ETag/304, rate limit 4 req/s, Retry-After"}]},{"version":"2.7.0","date":"2026-07-25","title":"SEO Intelligence + Game Catalog Refresh","summary":"Пульс-дашборд рынка iGaming + обновление каталога игр","changes":[{"type":"feature","text":"Brand Radar — дашборд пульса рынка"},{"type":"data","text":"Game Catalog: +388 новых игр от 22 провайдеров"},{"type":"fix","text":"CasinoGuruScraper: новая URL-структура casino.guru"},{"type":"fix","text":"HeadlessFetcher: fix userAgent bug"}]},{"version":"2.6.0","date":"2026-07-25","title":"SEO Intelligence: тренды, возможности, Game Radar","summary":"Три новых аналитических раздела NeBlask: кросс-страновые тренды роста, SEO-возможности и лента релизов слотов.","changes":[{"type":"feature","text":"/neblask/trends — кросс-GEO тренды роста: TOP-50 брендов по динамике за 2-6 мес"},{"type":"feature","text":"/neblask/opportunities — SEO-возможности: бренды без Trustpilot/AppStore/PlayStore"},{"type":"feature","text":"/neblask/radar — Game Radar: лента 505 слотов с RTP, волатильностью, фильтр по провайдерам"},{"type":"ui","text":"TOP-5 Growing Markets виджет на странице бренда — рынки с макс. ростом MoM"},{"type":"fix","text":"Исправлен матчинг Trustpilot/AppStore/PlayStore (JSON по slug, не по имени)"},{"type":"ui","text":"Навигация: Тренды, Возможности, Radar добавлены во все 20 NeBlask-страниц"}]},{"version":"2.5.0","date":"2026-07-25","title":"Mega Data Expansion","summary":"50 стран, 105K ключей, 234 бренда, 23 отчёта, YouTube + Trustpilot + AppStore обогащение","changes":[{"type":"data","text":"15→50 стран с clickstream данными"},{"type":"data","text":"27K→105K ключевых слов (25 языков)"},{"type":"data","text":"Все 234 бренда с clickstream"},{"type":"data","text":"YouTube каналы: 21 бренд найден"},{"type":"data","text":"Trustpilot: 108 брендов"},{"type":"data","text":"PlayStore 22 + AppStore 52 бренда"},{"type":"data","text":"Trust Score v1.2 пересчитан (avg 27.7)"},{"type":"content","text":"15 новых страновых отчётов"},{"type":"ui","text":"COUNTRY_ORDER 15→52 стран в UI"},{"type":"data","text":"KeywordBuilder: de_at/de_ch/lv/et модификаторы"},{"type":"data","text":"Meta Ads Library: 86 брендов"}]},{"version":"2.4.0","date":"2026-07-25","title":"50 рынков · 275K сигналов · 199 лицензий","summary":"Массовое расширение данных: clickstream 50 стран, 234/234 брендов, 199 лицензий, 105K ключей","changes":[{"type":"data","text":"Clickstream по 50 странам (было 15): SE, NL, RO, AU, FR, TR, BE, PT, FI, GR, CZ, AT, CH, IE, BG, HR, UA, JP, KR, TH, VN, NG, KE, ZA, GH, LT, LV, EE, MT, CL, NZ, PE, UY, PA, CR"},{"type":"data","text":"105K ключевых слов (было 27K): 25 языков, 4 новых (немецкий, латышский, эстонский)"},{"type":"data","text":"199 лицензий (было 53): полный прогон 7 регуляторов (UKGC, MGA, DGA, SGA, KSA, ADM, ANJ)"},{"type":"data","text":"234/234 брендов с clickstream-данными (было 86/234)"},{"type":"fix","text":"Починка double-encoded aliases у 86 брендов"},{"type":"perf","text":"Trust Score v2: средний балл 27 (было 13.5)"}]},{"version":"2.3.1","date":"2026-07-25","title":"Пагинация каталога игр + мобильная полировка","summary":"Каталог игр: 50 на страницу вместо 505, серверная фильтрация по типу, мобильная оптимизация.","changes":[{"type":"perf","text":"Пагинация каталога игр: 50 на страницу (было 505), DOM 696 вместо 4813 элементов"},{"type":"feature","text":"Серверная фильтрация по типу (Все/Слоты/Live) через ?kind="},{"type":"ui","text":"Active-состояние карточек (scale 0.97), hover только для pointer: fine"},{"type":"ui","text":"Мобильная проверка: все страницы без горизонтального переполнения"}]},{"version":"2.3.0","date":"2026-07-25","title":"Расширение каталога: 234 бренда, 53 страны, 505 игр","summary":"+86 операторов, +26 стран, +30 провайдеров, +300 игр, 13 новых языков.","changes":[{"type":"data","text":"Каталог брендов: 148 → 234 (Турция, Балканы, ЛатАм, Африка, крипто, Азия)"},{"type":"data","text":"Страны: 27 → 53 (Финляндия, Норвегия, Чехия, Греция, Грузия, Украина, Япония и др.)"},{"type":"data","text":"Провайдеры игр: 24 → 54 (Betsoft, Spribe, BGaming, Evoplay, Habanero, IGT и др.)"},{"type":"data","text":"Каталог игр: 205 → 505 (crash-игры, live-казино, 300+ слотов)"},{"type":"feature","text":"KeywordBuilder: 13 новых языков (fi, no, cs, el, bg, hr, lt, tr, ja, ko, th, vi, uk)"},{"type":"ui","text":"Сравнительная таблица: обновлены числа (230+ брендов, 53 страны)"}]},{"version":"2.2.0","date":"2026-07-25","title":"YouTube Data API: каналы брендов","summary":"Автоматический поиск и мониторинг YouTube-каналов брендов казино.","changes":[{"type":"data","text":"YouTube Data API v3: автоматический поиск каналов брендов (68 найдено)"},{"type":"ui","text":"YouTube виджет на странице бренда: подписчики, просмотры, видео"},{"type":"data","text":"brands.json seed: добавлено поле youtube (channel, subscribers, views, videos)"},{"type":"feature","text":"Cron: еженедельное обновление YouTube stats"},{"type":"data","text":"Лидеры: Sportingbet 2.6M, Bet9ja 1.5M, Superbet 836K подписчиков"}]},{"version":"2.1.3","date":"2026-07-25","title":"Рейтинги AskGamblers + Casino.org","summary":"Парсинг рейтингов с обзорных сайтов + виджет на странице бренда.","changes":[{"type":"data","text":"AskGamblers CasinoRank: 47 брендов (ScrapFly + smart slug matching)"},{"type":"data","text":"Casino.org Expert Rating: 6 брендов (US-market, HeadlessFetcher)"},{"type":"ui","text":"Виджет «Рейтинги обзорных сайтов» с progress bar на странице бренда"},{"type":"api","text":"brands.json seed: добавлено поле reviews (askgamblers, casinoorg)"},{"type":"fix","text":"False positive матчинг убран (goldbet≠Golden Nugget, starcasino≠PlayStar)"}]},{"version":"2.1.2","date":"2026-07-25","title":"Инфраструктурный виджет + 3 новых парсера лицензий","summary":"Возраст домена, CDN, хостинг, ранг, бэклинки на странице бренда + GGL/ONJN/CGA парсеры.","changes":[{"type":"feature","text":"Виджет «Инфраструктура»: возраст домена, CDN/хостинг, ранг и бэклинки"},{"type":"api","text":"brands.json seed: добавлено поле infrastructure"},{"type":"feature","text":"neblask:askgamblers — рейтинги AskGamblers (API + ScrapFly fallback)"},{"type":"feature","text":"neblask:casinoorg — рейтинги Casino.org через ScrapFly"},{"type":"data","text":"GGL (Германия), ONJN (Румыния), CGA (Кюрасао) — 3 новых парсера лицензий"},{"type":"fix","text":"Выбор основного домена: предпочитается .com, затем по наивысшему рангу"}]},{"version":"2.1.1","date":"2026-07-24","title":"Whois, DNS-разведка, Domain Rank","summary":"Возраст доменов, определение CDN/хостинга, ранг и бэклинки через DataForSEO.","changes":[{"type":"feature","text":"neblask:whois-age — возраст доменов через системный whois (121 домен)"},{"type":"feature","text":"neblask:dns-info — DNS-разведка: NS/A/CNAME + определение CDN и хостинга"},{"type":"data","text":"neblask:domain-rank — ранг, бэклинки через DataForSEO Backlinks Summary"},{"type":"feature","text":"Cron: 3 новые задачи (whois monthly, DNS monthly, domain-rank weekly)"},{"type":"fix","text":"Meta Ads лимит 86→148 в cron schedule"},{"type":"fix","text":"WhoisAge: исправлен отрицательный возраст (Carbon 3 signed diffInDays)"}]},{"version":"2.1.0","date":"2026-07-25","title":"NeAntik, Blask-спонсор, сортировка брендов, Alpine.js, 3 новых отчёта","summary":"","changes":[{"type":"feature","text":"/neantik: раздел антидетект-браузера NeVision — сравнение с 5 платформами, A→B→A fingerprint check, changelog 4 версий"},{"type":"feature","text":"Система спонсоров: Blask = gold sponsor с промокодом NEBLASK1, авто-протухание, клик-трекинг (beacon + Redis), Schema.org SpecialAnnouncement"},{"type":"feature","text":"/neblask/sponsor-stats: дашборд спонсоров с basic auth и CSV-экспортом"},{"type":"feature","text":"/necard: лендинг платёжных карт для аффилиатов — квалификация $300k+, сравнение 4 таблицами"},{"type":"feature","text":"/neagent: агентские рекламные аккаунты FB/Google/TikTok — сравнение 5 провайдеров, форма заявок"},{"type":"ui","text":"Сортировка брендов по столбцам (SoI / BAP / TG / лицензии) — Alpine.js sortable"},{"type":"fix","text":"Alpine.js self-hosted: Alpine не был подключён, таблицы не работали"},{"type":"fix","text":"Changelog data fix: 29 строковых записей → типизированные объекты {type, text}, удалён дубль v1.9.0"},{"type":"content","text":"3 новых отчёта: Mexico, Argentina, India (country reports)"},{"type":"api","text":"OG-изображения: динамические og:image для брендов и стран"},{"type":"data","text":"JSON-LD fix: @context → Blade-safe через @php блоки (Laravel 13 совместимость)"},{"type":"ui","text":"Навигация: все 6 Ne-продуктов в основном меню (убраны «скоро» бейджи у NeCard/NeAgent), очищены 4 конфликтующих CSS-override, dropdown «Ещё» для вторичных ссылок"},{"type":"data","text":"Trustpilot: автоматический скрапер рейтингов 86 брендов через ScrapFly + виджет с распределением звёзд на странице бренда"},{"type":"data","text":"Domain Health: автоматическая проверка SSL-сертификатов + HTTP-статуса 121 домена с виджетом на странице бренда"},{"type":"infra","text":"ScrapFly API key вынесен из env() в config/services.php (production-safe с кэшем конфига)"},{"type":"infra","text":"Cron: neblask:trustpilot (пт 05:00) + neblask:domain-health (пн 06:00)"},{"type":"feature","text":"Trust Score: композитный рейтинг доверия 0-100 (лицензии, Trustpilot, SSL, кошельки, масштаб) с виджетом на странице бренда"},{"type":"fix","text":"Storage path fix: убрана дубликация private/ в путях DomainHealth, TrustpilotPull и контроллере"},{"type":"feature","text":"App Store: рейтинги iOS-приложений через iTunes Search API (бесплатно, без ключа) с виджетом на странице бренда"},{"type":"feature","text":"Trust Score на витрине брендов: колонка с сортировкой + Trust Score в brands.json фид"},{"type":"improvement","text":"Trust Score v1.1: App Store рейтинг iOS-приложения как буст репутации (+3 за ≥4.5, +2 за ≥4.0, +1 за ≥3.0)"},{"type":"feature","text":"brands.json: добавлены поля app_store (rating, rating_count, app_name) и trust_score"},{"type":"feature","text":"Google Play: рейтинги Android-приложений через ScrapFly + виджет на странице бренда"},{"type":"improvement","text":"Trust Score v1.2: Play Store рейтинг как дополнительный буст репутации (+2 за ≥4.5, +1 за ≥4.0)"},{"type":"feature","text":"Колонка GP (Google Play) в таблице /brands — сортируемый рейтинг Android-приложений"},{"type":"improvement","text":"brands.json фид v6: добавлены play_store, trustpilot и domain_health данные"},{"type":"feature","text":"Сравнительная таблица «Почему NeBlask» — NeBlask vs Blask vs H2 GC vs SimilarWeb на странице страны"},{"type":"fix","text":"Movers: имена брендов теперь полностью видны на мобильных и узких экранах"},{"type":"feature","text":"Методология: описание NeBlask Index и концепции OTSoS (Overall Transparency Share of Search)"},{"type":"feature","text":"Сравнительная таблица «Почему NeBlask» — полный редизайн: карточная обёртка, группы по категориям, зелёные чекмарки, бейдж «Бесплатно», sticky-колонка на мобиле, hover-состояния"},{"type":"feature","text":"Каталог брендов расширен: 86 → 148 операторов (+62 новых бренда)"},{"type":"feature","text":"Каталог провайдеров: 8 → 24 студии (+16 новых)"},{"type":"feature","text":"Каталог игр: 26 → 205 слотов и live-игр (+179 новых)"},{"type":"feature","text":"География: 15 → 27 стран (+12 новых рынков: SE, NL, RO, AU, FR, BE, PT, NG, KE, ZA, CL, NZ)"},{"type":"fix","text":"Таблица «Почему NeBlask»: фикс CSS specificity для заголовков групп"}]},{"version":"2.0.0","date":"2026-07-24","title":"SEO: sitemap, JSON-LD Dataset, llms.txt; Meta Ads all 86 brands","summary":"","changes":[{"type":"api","text":"sitemap.xml: 155 NeBlask URL (бренды, страны, игры, провайдеры, отчёты, фиды)"},{"type":"api","text":"llms.txt: секция NeBlask для AI-краулеров"},{"type":"api","text":"JSON-LD Dataset schema (schema.org/Dataset) на каждой странице бренда"},{"type":"data","text":"Meta Ads: полный прогон всех 86 брендов через ScrapFly — 55 с собственной рекламой"},{"type":"data","text":"MetaAdsSync: инкрементальная запись снэпшота (crash-safe)"},{"type":"fix","text":"MetaAdLibraryClient: fix has_own_ads в early return"},{"type":"feature","text":"Карточка «Лидеры Meta Ads» на хабе NeBlask: топ-5 брендов + OWN-бейдж"},{"type":"ui","text":"Колонка Meta Ads на витрине /neblask/brands с числом активных объявлений"},{"type":"api","text":"JSON-LD DataCatalog schema на главной NeBlask для Google Dataset Search"},{"type":"feature","text":"Meta Ads в сравнении брендов (/neblask/compare): строка с числом объявлений + OWN"},{"type":"api","text":"meta_ads в JSON-фиде brands.json: total, has_own_page, platforms"}]},{"version":"1.9.0","date":"2026-07-24","title":"Cron-расписание + humanized platforms","summary":"","changes":[{"type":"data","text":"Cron: US licenses sync каждую среду 08:30 MSK"},{"type":"data","text":"Cron: Meta Ads sync каждый четверг 09:00 MSK (ScrapFly)"},{"type":"ui","text":"UI: AUDIENCE_NETWORK → Audience Network и другие платформы в Meta Ads блоке"},{"type":"data","text":"Полный прогон Meta Ads по всем 86 брендам каталога"}]},{"version":"1.8.0","date":"2026-07-24","title":"Meta Ad Library live data + Google Ads Transparency","summary":"","changes":[{"type":"feature","text":"MetaAdLibraryClient переписан на ScrapFly (без Facebook App Review)"},{"type":"data","text":"Команда neblask:meta-ads:sync — сбор активных реклам по всем брендам"},{"type":"ui","text":"UI: счётчик упоминаний, собственные FB-страницы, платформы на бренде"},{"type":"feature","text":"Exact-phrase поиск — has_own_ads отделяет прямую рекламу от упоминаний"},{"type":"data","text":"Протестировано: DraftKings 790, FanDuel 1000, BetMGM 1600, bet365 3900"}]},{"version":"1.7.0","date":"2026-07-24","title":"US Licensing + Meta Ad Library client","summary":"","changes":[{"type":"ui","text":"Панель US Licensing на страницах брендов — показывает лицензии NJ DGE и PA PGCB для 8+ US-брендов"},{"type":"fix","text":"PgcbScraper: фикс извлечения бренда из multi-prefix доменов (casino.pa.bet365.com → Bet365)"},{"type":"api","text":"Facebook App Secret → .env (Meta Ad Library API ожидает App Review)"},{"type":"feature","text":"FACEBOOK_APP_SECRET в config/services.php"},{"type":"feature","text":"NJ DGE: verified — PDF доступен, authorized sites migrated to njoag.gov"}]},{"version":"1.6.0","date":"2026-07-24","title":"US лицензионные реестры + Meta Ad Library","summary":"Скраперы NJ DGE (9 permit holders) и PA PGCB (23 iGaming + 11 sports операторов). Meta Ad Library API клиент.","changes":[{"type":"feature","text":"NJ DGE scraper: 9 iGaming permit holders из публичного PDF"},{"type":"feature","text":"PA PGCB scraper: 23 iGaming + 11 sports wagering операторов"},{"type":"feature","text":"Meta Ad Library API клиент (ждёт FACEBOOK_APP_SECRET)"},{"type":"api","text":"Artisan: neblask:us-licenses:sync --state=nj|pa|all"},{"type":"perf","text":"poppler-utils (pdftotext) установлен на сервере"}]},{"version":"1.5.0","date":"2026-07-24","title":"Twitch Slots + BTC links + deploy-audit","summary":"Twitch-панель на брендах, BTC explorer links, deploy-audit.sh, slug в mentions","changes":[{"type":"feature","text":"Twitch Slots панель на странице бренда (стримы, зрители, brand mentions)"},{"type":"feature","text":"deploy-audit.sh — проверка здоровья сервера в 1 команду"},{"type":"fix","text":"BTC explorer links → blockstream.info (было etherscan.io для всех)"},{"type":"fix","text":"BTC chain badge — оранжевый цвет #F7931A"},{"type":"data","text":"slug в Twitch brand_mentions для надёжного матчинга по бренду"}]},{"version":"1.4.0","date":"2026-07-24","title":"Live-цены CoinGecko + BTC через Blockstream","summary":"Балансы крипто-казино теперь считаются по актуальному курсу (CoinGecko, кэш 10 мин). BTC-кошельки через Blockstream Esplora без API-ключа.","changes":[{"type":"data","text":"CoinGecko Simple Price API — актуальные курсы ETH/BNB/BTC (без ключа, кэш 10 мин)"},{"type":"data","text":"Blockstream Esplora — BTC-балансы без API-ключа"},{"type":"data","text":"Stake BTC hot-wallet: 11 036 BTC = $718M (bc1qm34lsc...j77s3h)"},{"type":"fix","text":"Балансы пересчитаны: ETH был $3800 (hardcode), реальный курс $1884"}]},{"version":"1.3.0","date":"2026-07-24","title":"Twitch Streams + 16 кошельков 6 казино","summary":"Twitch API для Slots-стримов. On-Chain расширен: 16 адресов 6 казино, $64M+ tracked.","changes":[{"type":"data","text":"Twitch Helix API — снимок живых Slots-стримов каждые 2 часа"},{"type":"feature","text":"Поиск упоминаний брендов в заголовках стримов"},{"type":"data","text":"On-Chain: 16 ETH/BSC кошельков (Stake, BC.Game, Roobet, Rollbit, Duelbits, Shuffle)"},{"type":"fix","text":"BSC USDT: 18 decimals вместо 6 — правильные балансы"},{"type":"feature","text":"Product changelog: /neblask/changelog + JSON-фид"}]},{"version":"1.2.0","date":"2026-07-24","title":"On-Chain: реальные балансы крипто-казино из блокчейна","summary":"Впервые в NeBlask — данные прямо с блокчейна. Публичные hot-wallet балансы крипто-казино в реальном времени. Blask таких данных не показывает.","changes":[{"type":"data","text":"Etherscan V2 API интегрирован (единый endpoint для ETH/BSC/Polygon)"},{"type":"feature","text":"Новый блок On-Chain на странице бренда: адрес, chain-тег, баланс USD, ссылка на explorer"},{"type":"data","text":"Первый live-показатель: Stake.com hot-wallet = $16 000 435 (3607 ETH + 2.29M USDT)"},{"type":"perf","text":"Автообновление каждые 6 часов, 5 req/s throttle"},{"type":"fix","text":"Совместимость @php short-syntax с PHP 8.5 и Livewire compiler"}]},{"version":"1.1.0","date":"2026-07-24","title":"Догоняем Blask по формулам, обгоняем по фичам","summary":"Полный набор Blask-эквивалентных метрик (BAP, SoI, Market Explanation) плюс наши уникальные преимущества: Ad Intelligence и Integrated Demand с TG-сигналами.","changes":[{"type":"feature","text":"BAP (Brand Accumulated Power): формула 0.60·SoS + 0.25·growth + 0.15·retention"},{"type":"data","text":"SoI (Share of Interest) для 26 seed игр × 15 стран через DataForSEO Clickstream, $2.52 total"},{"type":"feature","text":"Market Explanation MVP: авто-блок «что случилось» из новых лицензий + moверов"},{"type":"feature","text":"Ad Intelligence-панель: кросс-ссылки на Meta Ad Library / Google Ads Transparency / Similarweb"},{"type":"feature","text":"Predictive 30-day forecast (linear OLS на last-6-mo) с delta% MoM"},{"type":"feature","text":"Integrated Demand: интеграция с NeTGStat (382 TG-канала) — уникальный сигнал"}]},{"version":"1.0.5","date":"2026-07-24","title":"Конфиг-driven отчёты + Heatmap + Regulator recent-delta","summary":"Отраслевые отчёты стали шаблонизированными — новый рынок = запись в config. Плюс тепловая карта рынков и changelog регуляторов.","changes":[{"type":"content","text":"Отчёты Italy, UK, Germany, Sweden (в дополнение к Бразилии)"},{"type":"feature","text":"Heatmap стран × брендов на /neblask/heatmap"},{"type":"feature","text":"Regulator changelog: прирост лицензий за 7/30 дней"}]},{"version":"1.0.0","date":"2026-07-24","title":"v1.0 методологии — стабилизация","summary":"Первый стабильный релиз методологии по SemVer. Historical snapshots для настоящего time-series, сравнение брендов, встраиваемый виджет.","changes":[{"type":"feature","text":"Compare-page: 2-3 бренда рядом на одном графике /neblask/compare"},{"type":"data","text":"Historical snapshots — gzipped NDJSON каждый понедельник"},{"type":"feature","text":"Country movers-блок на странице страны (top-3 растущих/падающих)"},{"type":"feature","text":"Widget-embed для внешних сайтов: iframe с индексом страны"},{"type":"content","text":"Sweden report — второй контент-магнит"},{"type":"content","text":"Version tag методологии v1.0.0 + changelog"}]},{"version":"0.9.0","date":"2026-07-24","title":"Хаб брендов, movers на главной, публичные фиды","summary":"Расширяем витрины: топ-brands, movers-блок «кто вырос/упал», открытые фиды под CC BY 4.0. Первый отраслевой отчёт по Бразилии.","changes":[{"type":"feature","text":"Overlay-сравнение брендов на графике страны"},{"type":"feature","text":"Movers/Trending блок на /neblask"},{"type":"api","text":"Публичные seed-эндпоинты: brands.json, regulators.json"},{"type":"feature","text":"Витрина провайдеров игр"},{"type":"content","text":"Первый отраслевой отчёт: /neblask/reports/brazil-2026-07"}]},{"version":"0.8.0","date":"2026-07-24","title":"ScrapFly как fallback, +5 стран, Stakelogic fix","summary":"Антибот-защита через ScrapFly как второй уровень fallback. Расширили покрытие до 15 стран.","changes":[{"type":"fix","text":"Stakelogic не путается со Stake в LicenseMatcher (word-boundary + blocklist)"},{"type":"data","text":"+5 новых стран: MX, DE, CO, PH, AR"},{"type":"data","text":"ScrapFly как второй fallback в HeadlessFetcher (CF-bypass)"}]},{"version":"0.7.0","date":"2026-07-23","title":"Живые лицензии — 6 регуляторов онлайн","summary":"Настоящие данные из реестров: UKGC, MGA, DGA, ADM, AGCO, ANJ, SGA. Матчинг брендов с реальными лицензиями.","changes":[{"type":"data","text":"UKGC — CSV-дампы регулятора через headless-браузер"},{"type":"data","text":"MGA (Angular SPA) — вытащен через DOM после render"},{"type":"data","text":"SGA — живьём через JSON API + улучшен матчер"},{"type":"data","text":"+4 регулятора: DGA, ADM, AGCO, ANJ через forceHeadless"},{"type":"data","text":"Каталог провайдеров игр из SlotCatalog + Casino Guru"}]},{"version":"0.6.0","date":"2026-07-23","title":"Фундамент лицензий и каталог игр","summary":"Первый большой этап данных: schema для лицензий, скраперы регуляторов, каталог iGaming-игр.","changes":[{"type":"data","text":"Схема brand_licenses + модель BrandLicense"},{"type":"data","text":"Базовый класс LicenseScraper + Artisan-команда neblask:licenses"},{"type":"feature","text":"Виджет «Лицензии» на странице бренда"},{"type":"api","text":"Открытый фид licenses.json + CSV"},{"type":"data","text":"Каталог iGaming-игр: провайдеры, игры, key-запросы"},{"type":"feature","text":"Страницы /neblask/games (топ) и /neblask/game/{slug}"}]},{"version":"0.5.0","date":"2026-07-23","title":"Blask-подобный интерфейс","summary":"Полная переверстка UI под Blask-стиль: хаб стран, страница страны с графиком и брендами, витрины методологии.","changes":[{"type":"ui","text":"Хаб стран, страница страны, витрина всех брендов"},{"type":"ui","text":"Интерактивные графики — hover/touch тултип со значениями"},{"type":"ui","text":"Единый nb-shell для страницы бренда и методологии"},{"type":"content","text":"Блок спонсоров + манифест открытости"},{"type":"content","text":"Витрина /neblask/markets — карточки стран с регулятором и типом рынка"},{"type":"content","text":"Карта 41 регулятора + hero-блок NeBlask на главной"}]},{"version":"0.1.0","date":"2026-07-22","title":"Первый пуск NeBlask","summary":"Проект стартует: аналитика спроса на iGaming, открытая и бесплатная. Blask.com — B2B за €300+/мес, мы — CC BY 4.0.","changes":[{"type":"feature","text":"Первый прототип индекса спроса"},{"type":"data","text":"DataForSEO Clickstream API — источник поисковых сигналов"},{"type":"content","text":"Опубликована методология с SemVer-версионированием"}]}]}