Аналог Discord без VPN. Звонки 1:1, комнаты до 8 человек и чаты с друзьями. Бесплатно.
Translation pending
SocialTypeScript · JavaScriptGitHub @booroo-muteOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Loading the full README. The saved excerpt is shown below.
Маркетинговый сайт Mute — бесплатного голосового чата для игр, который работает в России без VPN. Next.js 16 (App Router), React 19, Tailwind 4, контент в markdown. Переменные окружения — .env.example (NEXT_PUBLIC_SITE_URL, токены подтверждения вебмастеров).Read the full 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-разметка.