Пиратский сборник трекеров, раздач, зеркал и инструментов обхода блокировок. 1383 ресурса в 9 разделах.
У каждого ресурса есть честная метка доступности: открывается, работает с оговорками, заблокирован или требует зеркала. Каталог не делает вид, что заблокированный сервис откроется.
Одностраничник на чистом HTML/CSS/JS: без сборки, без фреймворков, без внешних зависимостей в рантайме. Работает офлайн, ставится как PWA, читается без JavaScript.
| Возможность | Детали |
|---|---|
| Поиск | быстрая палитра по Ctrl/⌘+K — как в документации: подсказки, ↑↓ и Enter; полноценная страница поиска #/search |
| Навигация | постоянный сайдбар с 9 разделами и счётчиками, верхняя панель с разделами, подборками, метками и избранным |
| Разделы | страница раздела — «докс»-списком: подзаголовки-группы, название-ссылка, описание, статус доступности и метки |
| Фильтры | 29 меток и 5 платформ со счётчиками; состояние фильтров пишется в URL — ссылкой можно поделиться |
| Статусы доступности | четыре состояния: открывается / с оговорками / заблокирован / нужно зеркало; у части ресурсов есть заметка с подробностями |
| Карточка ресурса | открывается по клику на название: скриншот сайта, описание, статус доступности, метки и ссылки — всё в одном окне |
| Подборки | десять готовых наборов: трекеры и индексы, открывается напрямую, обход блокировок, смотреть онлайн, книги, игры, музыка, инструменты, файлообменники, нужен зеркало |
| Страницы | весь каталог, разделы, подборки, облако меток, поиск, избранное, о проекте, правила — плюс статичная версия без JS |
| Избранное | localStorage, счётчик в шапке, скачивание списком, копирование, очистка |
| Недавние | последние 12 открытых ресурсов, очищаются одной кнопкой |
| Сортировка | по категории, по названию, по разделу — запоминается |
| Каталог | выдаётся порциями по 48 карточек: страница не тяжелее сразу |
| Экспорт | весь каталог или избранное — в Markdown-файл |
| Установка | кнопка установки PWA появляется, когда браузер готов предложить приложение |
| Клавиатура | Ctrl/⌘+K или / — палитра поиска, ? — подсказка, R — случайный ресурс, Esc — закрыть |
| Темы | светлая и тёмная, по умолчанию — как в системе, выбор запоминается |
| Офлайн | service worker: навигация network-first, статика cache-first, скриншоты сайтов — отдельный кэш |
| Без JavaScript | noscript.html — полный каталог обычной страницей со статусами доступности, генерируется скриптом |
Вёрстка в духе документационных сайтов: липкая верхняя панель, сайдбар с разделами, плитка карточек на главной, списки-«доксы» с подзаголовками-группами на страницах разделов, модальная палитра поиска.
Палитра монохромная: графитовая шкала, единственный акцент — чернила, цифры моноширинные. Никакого синего, градиентов, свечений и цветных плиток.
Метод вёрстки — unslop by Damir Sokolovsky (@heydamir), CC BY 4.0.
Тёмная тема — холодная сине-серая: мягче чёрного, приглушённый акцент, чтобы длинные списки не резали глаза.
Все цвета, отступы, радиусы и размеры шрифтов живут исключительно в css/tokens.css. Вне токенов нет ни одного литерала цвета.
.
├── index.html # разметка: hero, поиск, факты, разделы, страницы, диалоги
├── noscript.html # статический каталог (генерируется)
├── css/
│ ├── tokens.css # палитра, типографика, шаг, радиусы, движение
│ ├── base.css # reset, фокус, overflow-x: clip, reduced motion
│ └── style.css # страница: сетки, компоненты, адаптив
├── js/
│ ├── app.js # точка входа: события, экраны, инициализация
│ ├── store.js # состояние, localStorage, подписки
│ ├── router.js # хэш-роутинг и deep-links
│ ├── search.js # корпус, нормализация, синонимы, ранжирование
│ ├── catalog.js # фильтрация, сортировка, подсчёты
│ ├── collections.js # подборки: правила отбора ресурсов
│ ├── render.js # чистые функции разметки
│ ├── icons.js # линейные глифы
│ ├── labels.js # подписи, статусы доступности, синонимы, подсказки клавиш
│ ├── groups.js # группы подразделов для докс-страниц
│ └── data.js # каталог: 9 категорий, 1377 ресурсов
├── previews/ # скриншоты сайтов (640×400, ~16 КБ) + manifest.json + stubs.json
├── scripts/
│ ├── serve.mjs # локальный статический сервер
│ ├── generate-fallback.mjs # пересобирает noscript.html из каталога
│ ├── fmhy-fetch.mjs # собирает ссылки FMHY в scripts/fmhy-links.json
│ ├── reddit-fetch.mjs # собирает ссылки мегатредов Reddit в scripts/reddit-links.json
│ ├── build-piracy-catalog.mjs # собирает каталог из источников (FMHY, мегатреды Reddit)
│ ├── build-groups.mjs # пересобирает группы подразделов в js/groups.js
│ ├── sync-numbers.mjs # синхронизирует числа (счётчики, OG, README) с каталогом
│ ├── fetch-previews-piracy.mjs # снимает скриншоты пиратских доменов в previews/
│ ├── cleanup-previews.mjs # убирает превью доменов, которых больше нет в каталоге
│ ├── merge-stubs.mjs # объединяет список заглушек из git и текущего прогона
│ ├── drop-stub-previews.mjs # сбрасывает заглушки, чтобы переснять их заново
│ ├── make-og.mjs # рисует OG-обложку icons/og-image.png
│ ├── publish-repo.mjs # описание, темы и Pages на GitHub
│ └── shots.mjs # снимает скриншоты для визуальной проверки
├── tests/
│ └── smoke.mjs # 70 проверок в headless Chromium
├── sw.js # офлайн-кэш
├── manifest.json # PWA-манифест
└── icons/ # SVG-иконки и OG-обложка
npm start # http://localhost:8080Сайту нужен http://, а не file://: модули ES и service worker не работают с локального файла. Подойдёт и любой другой статический сервер — например, python -m http.server.
npm testСкрипт сам поднимает статический сервер, открывает сайт в Chromium и проверяет поведение: счётчики, поиск с синонимами, маршруты, deep-links, избранное между перезагрузками, карточку ресурса, постепенную выдачу каталога, сортировку, фильтры по меткам и платформам, горячие клавиши, недавние, статусы доступности, подборки, облако меток, страницы «О проекте» и «Правила», карточку ресурса со скриншотом и закрытием по кнопке, фону и Esc, мобильную навигацию, сохранение темы и сортировки, статическую версию без JS, доступность манифеста и иконок, отсутствие битых ссылок, чистую консоль и отсутствие горизонтального скролла на мобильном.
Нужен playwright: npm i -D playwright && npx playwright install chromium.
Ожидания тестов берутся из самого js/data.js, поэтому после пересборки каталога числа в тестах не расходятся с данными: сколько ресурсов, сколько разделов, сколько меток — всё считается динамически.
Данные лежат в js/data.js — это единственный источник правды:
export const CATEGORIES = [{ id, title, desc, icon }, ...];
export const RESOURCES = [{ cat, name, desc, url, tags: [...], os: [...], ru, note }, ...];Каталог собирается из внешних источников — FMHY и мегатредов Reddit, — поэтому пересобирается целиком:
npm run fetch:links # обновить scripts/fmhy-links.json и scripts/reddit-links.json
npm run build:catalog # каталог → группы → числа → noscript.html → OG-обложкаРучная правка js/data.js сразу затирается следующей сборкой: чтобы добавить ресурс надолго, допишите его в CORE в scripts/build-piracy-catalog.mjs — эти ресурсы не теряются при сборе.
Добавить ресурс — дописать объект в RESOURCES: счётчики, фильтры, поиск и номера обновятся сами.
Поля ru и note отвечают за доступность ресурса:
ru |
Значение |
|---|---|
ok |
открывается напрямую, без дополнительных инструментов |
limited |
работает не всегда, нужна оплата из-за рубежа или обходные ссылки |
blocked |
домен недоступен напрямую |
mirror |
нужен зеркальный домен |
Подписи меток и платформ (os: w, m, l, a, i, any) — в TAG_LABELS и OS_LABELS в js/labels.js. Синонимы для поиска — в SYNONYMS там же.
После правки каталога пересоберите статическую версию:
npm run build # пересобирает noscript.htmlПревью для карточки ресурса снимаются автоматически:
node scripts/fetch-previews-piracy.mjsСкрипт обходит уникальные домены каталога (сначала самые используемые), снимает экран 1280×800 и складывает JPEG 640×400 (~16 КБ) в previews/. Имя файла совпадает с тем, что ищет карточка ресурса: домен без www, не-буквы заменены на -.
Если сайт отдаёт ошибку (HTTP 4xx/5xx, 404-страница, антибот-заглушка) или не открывается вовсе, вместо кадра сохраняется аккуратная заглушка «превью недоступно» с именем домена — чтобы в карточке не было чужих страниц ошибок. Список таких доменов лежит в previews/stubs.json, их можно переснять повторно:
node scripts/fetch-previews-piracy.mjs # обычный проход
$env:STUBS='1'; $env:FORCE='1'; node scripts/fetch-previews-piracy.mjs # только по заглушкамЧтобы убрать скриншоты доменов, которых больше нет в каталоге:
node scripts/cleanup-previews.mjsФайлы кэшируются сервис-воркером отдельно от основной статики и грузятся только при открытии карточки.
Пакет готов к публикации: это статические файлы, достаточно залить корень на любой хостинг (GitHub Pages, Netlify, Cloudflare Pages, nginx).
Перед публикацией:
npm run build # noscript.html в актуальном состоянии
npm run build:og # OG-обложка (нужен playwright)
npm test # 67 проверок в реальном ChromiumСервис-воркер кэширует статику по списку из sw.js — после релиза подними версию кэша (CACHE = 'megathread-v8'), чтобы клиенты получили свежие файлы.
Только легальный и бесплатный контент. Каталог открыт для всех — его можно дополнять: ссылка на «Предложить ресурс» ведёт в issues репозитория. Ответственность за то, что вы скачиваете и как используете, лежит на вас: распространение пиратского контента может преследоваться по закону.