user-agent ▸
deviceMemory — округлённая оценка браузера (потолок «8+»)
usage — данные этого сайта, а не всего диска
⚠ из песочницы не видно: загрузку cpu · точный объём ram · температуру · процессы · реальный внешний ip · mac-адрес · содержимое диска — это отдаёт сервер-компаньон (панель 13)
микрофон: осциллограмма + fft · динамики: имена выходов подтягиваются сами при загрузке (разрешения уже даны); переключение вывода работает в Chrome/Edge, в Яндекс-браузере setSinkId может игнорироваться — тогда строка «выход» честно это покажет · мышь ловит все кнопки с вспышкой в точке клика · тон/sweep и мышь/клавиатура без попапов
индекс железа (насыщение, 100 недостижимо). пороги v4.3 перекалиброваны: gpu/mem/disk ×1.5, single/multi подняты до реалистичных (иначе любая быстрая машина упиралась в 100% и порог не работал). веса: single 20% · multi 40% · gpu 20% · mem 10% · disk 10%. оценка канала отдельно: latency 40% · jitter 30% · throughput 30%. стрелки ↑↓ — дельта к эталону ⚑
на Windows сборщик работает через PowerShell (UTF-8) — psutil не требуется.
1Локальная установка одной кнопкой▸
Из песочницы браузер никогда не отдаст реальный % cpu, температуры, точный ram, внешний ip и содержимое диска. Поэтому пока NOC открыт «как есть» — висит янтарная плашка под шапкой.
Кнопка ⬇ установить генерирует установщик прямо в браузере: чистый исходник кодируется в base64 и вшивается в python-скрипт. Запуск: python noc-install.py — распакует noc.html, поднимет компаньона на 7600 и статику на 8000, откроет http://127.0.0.1:8000/noc.html. Плашка исчезнет, зажжётся чип ● full access. Стоп — Ctrl+C.
Windows без psutil: компаньон собирает метрики через встроенный PowerShell в UTF-8 (per-core, частоты, топ процессов, память/swap, сетевой и дисковый i/o, модели — русские имена адаптеров читаются корректно) плюс nvidia-smi для температуры GPU. CPU-температура на Windows пробуется через thermal-zone и часто требует прав администратора — если ОС откажет, поле остаётся пустым (это ограничение ОС). На Linux всё берётся из /proc и /sys.
2Индекс железа и оценка канала▸
Сводный индекс 0–100 меряет машину: single 20% · multi 40% · gpu 20% · mem 10% · disk 10%, функцией насыщения 100·v/(v+base). В v4.3 пороги перекалиброваны: gpu/mem/disk подняты ×1.5, а single/multi — до реалистичных значений (при старых порогах любая быстрая машина упиралась в 100%, и индекс завышал средние конфиги). Шкала открыта сверху: 100/100 недостижимо.
Ранг: S ≥90 · A ≥75 · B ≥55 · C ≥35 · D ниже. Типичный современный десктоп (6 ядер + карта среднего сегмента) теперь lands в B, а воркстейшн/сервер с топовой gpu — в A/S. Оценка канала считается отдельно и не входит в индекс железа. Кнопка ⚑ эталон фиксирует базу для стрелок ↑↓.
3Память узла и календарь-тепловик▸
Каждый успешный прогон стресса пишется в localStorage (поминутно за час + дневно за 30 дней). Календарь (клик по дате под часами) раскрашивает дни по индексу — палитра рангов. Клик по «цветному» дню пишет в журнал средний индекс и дельту к сегодня.
4Оповещения по порогам и светодиод АЛЕРТЫ▸
Движок раз в секунду проверяет: батарея <20%, пинг >250мс (только для удалённого источника), fps <20, сеть ушла, простой оператора >30 минут, а при компаньоне — cpu хоста >90% и температуру >85°. При срабатывании — баннер с кнопкой ACK, мигание рамки панели, строка ALERT и короткий бип.
Светодиод АЛЕРТЫ в шапке — индикатор охраны: зелёный = звук включён и всё штатно, красный мигающий = есть активный алерт, серый = звук выключен (🔕).
5Командная палитра и fullscreen▸
Ctrl+K — палитра: test, report, cal, baseline, mute, install, help. Одиночные хоткеи (когда фокус не в поле): T=диагностика, R=отчёт, M=mute. Двойной клик по шапке панели — fullscreen (как в Grafana). Esc — обратно.
6Расширенная диагностика и экспорт▸
В прогоне, но вне индекса: SubtleCrypto SHA-256, net-throughput, latency/jitter, задержка ввода keydown→paint, сравнение localStorage / IndexedDB / OPFS. Кнопка ⤓ открывает выпадающее меню в стиле пульта: шаблон / снимок / журнал .log. ⊕ установить (PWA) — только на https/127.0.0.1.
7Ограничения песочницы▸
На file:// Chrome блокирует getUserMedia и setSinkId — не работают микрофон, камера, имена, выбор выхода и пинг. Поднимите сервер: установщик делает это сам, либо вручную python -m http.server 8000 → http://127.0.0.1:8000.
Полнота по браузерам: Chrome/Edge ≈ 95% · Firefox ≈ 60% · Safari ≈ 50%. Все измерения локальны — наружу ни байта (кроме компаньона на 127.0.0.1 и одного запроса внешнего ip через ipify).