My Secret Santa
비공개 그룹과 익명 메시지로 시크릿 산타 선물 교환을 관리합니다
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기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-разметка.