尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证正在加载完整 README。 以下为已保存的摘录。
Маркетинговый сайт Mute — бесплатного голосового чата для игр, который работает в России без VPN. Next.js 16 (App Router), React 19, Tailwind 4, контент в markdown. Переменные окружения — .env.example (NEXT_PUBLIC_SITE_URL, токены подтверждения вебмастеров).查看完整 README ↗
Маркетинговый сайт Mute — бесплатного голосового чата для игр, который работает в России без VPN. Next.js 16 (App Router), React 19, Tailwind 4, контент в markdown.
npm ci
npm run dev # http://localhost:3000
npm run build && npm start
npm run lint
Переменные окружения — .env.example (NEXT_PUBLIC_SITE_URL, токены
подтверждения вебмастеров).
| Путь | Что там |
|---|---|
app/ | маршруты: главная, /discord-alternative, /voice-chat, /voice-chat/* (посадочные под сценарии), /download, /install/*, /games/*, /blog/*, /releases/*, /privacy, /terms; robots.txt, sitemap.xml, llms.txt, llms-full.txt, blog/feed.xml (RSS) генерируются кодом |
content/ | markdown: blog/, games/ (гайды по войсу в играх), landings/ (посадочные /voice-chat/<slug>), install/, releases/. Frontmatter: title, seoTitle (короткий заголовок для <title> и og:title, ≤ 58 символов; H1 остаётся title), description, date, updated, image, ogImage, topic (у гайдов: broken, novoice или setup, группа на /games), related (ссылки вида blog/<slug>, games/<slug>, releases/<slug>, install/<slug>, landings/<slug>) |
components/ | UI; markdownComponents.tsx — общий рендер статей, RelatedLinks.tsx — перелинковка блога и гайдов, MetrikaGoals.tsx — цели аналитики |
lib/ | данные и SEO: site.ts (URL и даты обновления страниц), schema.ts (JSON-LD), markdown.ts (FAQ из текста → FAQPage), imageSize.ts, ogImage.tsx (генерация OG-картинок), metrika.ts |
docs/ | seo-audit-2026-09.md (аудит SEO и LLM-видимости, план на осень 2026), seo-deploy-checklist.md (деплой, проверки, цели Метрики), seo-offsite-playbook.md (внешние площадки и LLM-видимость), seo-ugc-platforms.md (тихие dofollow-площадки), listing-copy.md (тексты для каталогов), design-system.md, release-notes-guide.md |
scripts/ | check-content.mjs (даты, длина сниппетов, запрещённые формулировки; запускается перед npm run build), indexnow-ping.mjs (после деплоя), subset-fonts.sh |
deploy/ | nginx-конфиг и порядок деплоя |
content/blog/<slug>.md или content/games/<slug>.md с frontmatter
(см. соседние файлы). Для гайда положить иллюстрацию в public/games/ и
указать image + ogImage (1200×630). У постов блога OG-картинка
генерируется автоматически.**Вопрос?** Ответ попадёт в
FAQPage-разметку сам.related, чтобы перелинковка была осмысленной. У гайда задать
topic (broken, если статья про сломанный войс; novoice, если голоса в игре
нет вовсе; иначе setup). Черновик, который ждёт проверки фактов, кладите в
content/drafts/<раздел>/<slug>.md: сайт его не видит, check:content проверяет.title длиннее 58 символов, задать seoTitle: он уходит в <title>
и og:title, а длинный заголовок остаётся в H1 и карточках.npm run build, задеплоить, npm run indexnow.Статус-посты («Discord не работает сегодня», «Когда вернут чат в Роблоксе»)
живут без даты в title и seoTitle: дата видна в строке «Статус на …»
под заголовком и в первом абзаце, их обновляет npm run status. date
остаётся датой первой публикации. Так H1, карточки и OG-картинка не меняются
каждую неделю, а у Метрики и поисковиков не получается новая страница.
У длинных статей компактный баннер вставляется перед третьим H2. Если по
счёту он попадает не туда (например, перед чеклистом, ради которого пришли),
задайте во frontmatter ctaBefore: "<начало текста H2>", проверка следит,
чтобы такой H2 существовал.
У страниц, которые живут по событиям (статусы Discord и Roblox, гайд по
Steam, звонки в Telegram и WhatsApp), есть пара полей statusDate и
statusLine: они рендерятся строкой «Статус на <дата>: …» под заголовком.
Обновление одной командой: npm run status -- content/blog/<файл>.md "<строка>"
ставит statusDate и updated на сегодня по Москве, меняет statusLine,
правит дату в первом абзаце и в шапке таблицы, запускает check:content;
дальше git commit, git push, scripts/deploy.sh. В строке статуса
пишем, что и когда проверено (время по МСК, что именно не работает, откуда
цифры), без обещаний «обновим в четверг»: свежесть показывает дата.
Проверка не пускает дату из будущего и одно поле без другого.
Скрипты: scripts/deploy.sh выкладывает лендинг на сервер (pull, build,
перезапуск только mute-landing, IndexNow, контрольные curl);
npm run metrika -- <папка с выгрузками Метрики> печатает сводку по дню
(источники, кластеры запросов, страницы), а если указать папку с подпапками
по дням (рядом могут лежать папки целей «регистрации», «открыл скачать»),
то таблицу день к дню: визиты по источникам, просмотры лендинга и
приложения, кластеры и почасовые регистрации против визитов из поиска.
Посадочные под сценарии лежат в content/landings/<slug>.md и открываются
как /voice-chat/<slug>: один сценарий на страницу, свой набор разделов и
свои вопросы в блоке «## Коротко о частых вопросах» (он рендерится
аккордеоном без FAQPage-разметки). Поле breadcrumb задаёт короткую подпись
в хлебных крошках.
Правила текста: честно про ограничения продукта (нет мобильных приложений,
гостевого входа и push-to-talk), без названий конкурентов, без советов, как
вернуть доступ к заблокированным сервисам. «Без VPN» — единственная допустимая
связка с этим словом, и только про Mute; регулятор упоминается только на
юридических страницах. Проверка npm run check:content запускается перед
сборкой и останавливает её при нарушении, а заодно ловит даты из будущего и
description длиннее 160 символов. См. docs/seo-offsite-playbook.md →
«Правила безопасности».
Перед публикацией прогоняйте текст через skill humanizer
(~/.claude/skills/humanizer, https://github.com/blader/humanizer). Что он
ловит в нашем русском тексте чаще всего: сценические заходы («Ниже разбираем»,
«Коротко:», «Скажем сразу»), повторяющиеся «честные» концовки после каждого
раздела, конструкцию «не X, а Y» без реального противопоставления, тире как
универсальную связку (норма для наших текстов — не больше 0,5–0,7 на 100 слов,
только грамматические), жирные ярлыки в списках. Формат вопросов в FAQ
(**Вопрос?** Ответ) не трогать: из него собирается FAQPage-разметка.