В portable-релизе запустите приложение сервера из распакованной папки. Для Windows: 
fdv-bouldering-timer.exe
Полное руководство пользователя
Таймер болдеринга
Последовательная настройка соревнования, запуск по времени, управление синхронными экранами, диагностика и перенос приложения на другой компьютер.
Оглавление
Руководство построено в порядке обычной работы: от запуска и выбора формата до подключения экранов и переноса на новый компьютер.
Быстрый старт
Минимальная последовательность для запуска одного управляющего браузера и нескольких экранов.
На серверном компьютере используйте http://127.0.0.1:8008/.
Включите «Основной браузер» или нажмите Ctrl+M.
Откройте напечатанный сервером сетевой адрес на остальных устройствах.
- Выберите формат и задайте длительности.
- Для немедленного запуска нажмите «Старт» или Z.
- Для старта по часам задайте время и нажмите маленькую кнопку ▶ рядом с заголовком «Время начала старта».
Интерфейс
На компьютере панель управления находится слева, поле таймера — справа. Панель прокручивается отдельно, поэтому крупный таймер остаётся на месте даже при длинном списке браузеров.
Панель управления
- Формат — готовые режимы «Классика», «Фестиваль» и «Финал».
- Параметры — время старта, длительность ротации или раунда и перерыва.
- Переключатели — роль браузера, звук, удалённый звук, удалённый полный экран и мигание. Снятие удалённого полного экрана один раз выводит подключённые экраны; затем их вручную включённый полный экран сохраняется.
- Управление — старт, пауза, остановка и полноэкранный режим.
- Браузеры — подключённые устройства и их диагностика.
Поле таймера
Показывает оставшееся время текущего отрезка, ротацию или перерыв, номер ротации, следующее действие и прогресс.
Параметры активного запуска фиксируются на сервере. Чтобы выбрать другой формат, сначала остановите таймер кнопкой «Стоп».
↑ К оглавлениюФорматы соревнований
Формат определяет единицы параметров, повторение и поведение после окончания времени.
3.1. Классика
Классический формат по французской системе. Ротация и короткий перерыв повторяются без заранее заданного числа ротаций.
- Время ротации задаётся в минутах, перерыв — в секундах.
- После окончания ротации автоматически начинается перерыв, затем следующая ротация.
- Номер ротации увеличивается после каждой пары «ротация + перерыв».
- Если перерыв равен нулю, следующая ротация начинается сразу.
3.2. Фестиваль
Повторяющийся формат с длинным раундом и длительным перерывом. Он работает по той же схеме повторения, что и «Классика», но обе длительности задаются в минутах.
- После раунда начинается перерыв, после перерыва — следующий раунд.
- Чекбокс «Объявления времени» включает или выключает сигналы за 60, 30, 10 и 5 минут до конца раунда.
- Для объявлений используются файлы выбранного профиля, а при их отсутствии — системный голос или сигнал минуты.
- Если перерыв равен нулю, следующий фестивальный раунд начинается сразу.
3.3. Финал
Одноразовый формат: каждый запуск выполняет одну ротацию и останавливается, пока оператор вручную не запустит следующую.
- Время ротации задаётся в минутах; отдельного перерыва таймера в этом формате нет.
- «Старый» формат раунда проводит всех участников сначала по первой трассе, затем по второй и далее.
- «Новый» формат переводит участника на следующую трассу после заданного количества полных ротаций отдыха; значение по умолчанию — 3. После трассы в ротации 1 участник готовится в ротации 4 и выходит на следующую трассу в ротации 5.
- Выбор формата раунда влияет только на продвижение загруженного стартового списка.
- После ротации таймер останавливается на
00:00; одновременно включаются цвета перерыва (по умолчанию красный фон). В обычном основном интерфейсе это состояние дополнительно отмечается как завершённое. Цвета задаются параметрамиbreak_background_colorиbreak_text_color; это не запускает отдельный отсчёт перерыва. - Для следующего финального запуска достаточно снова нажать «Старт» или Z.
- Чтобы завершить финал и выбрать другой формат, нажмите «Стоп», затем «Классика» или «Фестиваль» и подтвердите вопрос «Вы уверены, что хотите завершить "Финал"?». Возвращать номер ротации на 1 не нужно. При отмене сохраняется текущий финал; при подтверждении его счётчик сбрасывается, и следующий финал начинается с первой ротации.

| Свойство | Классика | Фестиваль | Финал |
|---|---|---|---|
| Ротация / раунд | Минуты | Минуты | Минуты |
| Перерыв | Секунды | Минуты | Нет |
| Повторение | Бесконечные ротации | Бесконечные ротации | Один запуск |
| После окончания | Следующая ротация | Следующая ротация | 00:00, затем «Старт» для нового запуска |
Обратный отсчёт и запуск по времени
Поля часов и минут не изменяют действие обычной кнопки «Старт». Чтобы использовать указанное время, нажмите отдельную маленькую кнопку ▶ справа от надписи «Время начала старта». Горячей клавиши у неё нет.
Классика и Фестиваль
- Время в будущем: показывается обратный отсчёт, в назначенный момент первая ротация стартует автоматически.
- Время сегодня уже прошло: таймер восстанавливает текущую ротацию или перерыв так, будто соревнование началось в указанное время.
- При восстановлении учитываются все прошедшие ротации; на экране сразу появляется актуальный номер ротации и остаток текущего отрезка.
Финал
- Время в будущем: идёт предварительный обратный отсчёт.
- На нуле финал не начинается автоматически: таймер ждёт нажатия «Старт» или Z.
- Время сегодня уже прошло: обратный отсчёт назначается на это время следующего дня; восстановление середины финала не выполняется.
Отмена назначенного старта
Во время обратного отсчёта маленькая кнопка ▶ превращается в ■. Нажмите её, чтобы отменить ожидание, сохранив формат, параметры и указанное время. «Стоп» или P полностью отменяет назначенный старт и возвращает таймер в исходное состояние.
Кнопки и горячие клавиши
| Кнопка | Действие | Клавиатура |
|---|---|---|
| Старт | Немедленно запускает выбранный формат или продолжает после паузы. Указанное в полях время игнорируется. В финале также запускает соревнование после предварительного отсчёта или после предыдущего завершения на 00:00. |
Z |
| Пауза | Останавливает текущую ротацию или перерыв и сохраняет положение на сервере. Во время предварительного обратного отсчёта кнопка заблокирована. | Ctrl+Q |
| Стоп | Отменяет активный запуск, паузу, назначенный старт или завершённое состояние финала и возвращает начало первого отрезка с текущими параметрами. | P |
| Экран | Включает или выключает полный экран в текущем основном браузере. | Ctrl+F |
| Основной браузер | Назначает текущий браузер управляющим или снимает с него эту роль. | Ctrl+M |
| Запуск по времени ▶ | Использует часы и минуты по правилам главы 4. | Нет горячей клавиши |
Горячие клавиши работают при английской и русской раскладке. Пробел не является горячей клавишей и не запускает и не останавливает таймер. Других клавиш, влияющих на старт или паузу, нет.
Полоса прогресса
Когда соревнование поставлено на паузу после начала, основной браузер может переместить положение внутри текущей ротации или перерыва, нажав нужное место на полосе прогресса. Во время работы и в браузерах-экранах перемотка отключена.
↑ К оглавлениюСтартовые списки
Таймер может одновременно показывать до четырёх списков участников. В интерфейсе и диагностике они обозначаются как LIST 1–4; внутренний формат файлов при этом не изменился.
6.1. Загрузка и отображение
- Включите раздел «Стартовые списки» и нажмите «Добавить список».
- Загрузите файл XLSX, CSV, TSV, TXT или MXL. Таблица появится справа от таймера.
- Для каждого подключённого экрана нажмите нужные плашки LIST. Серый цвет означает, что область или список недоступны, тёмно-зелёный — список доступен, но скрыт, голубой — показан.
- Если на экране выбраны ровно два списка, отдельная голубая кнопка переключает одну и две колонки. Оранжевый контур означает раскладку, отличающуюся от стандартной.
Ширина колонки определяется таблицей, а строка управления при необходимости сжимается за счёт кнопки «Загрузить список…». Заголовок таблицы может сокращаться многоточием; значения в строках участников не сокращаются и при необходимости создают горизонтальную прокрутку.
6.2. Ход соревнования
Число трасс можно менять и при работающем таймере. Введённое число сохраняется по Enter, Tab или при выходе из поля; стрелки поля применяют изменение сразу. Промежуточные цифры не отправляются: при вводе 12 число 1 не уменьшит список. Пока сервер сохраняет изменение, показано «Сохраняется…». При ошибке введённое значение остаётся с пояснением; нажмите Enter для повторной попытки. Синхронизация не сбрасывает ввод и не меняет остальные списки.

- Текущий участник, подготовка, отдых и результаты трасс подсвечиваются автоматически по ротации и выбранному формату.
- По умолчанию жёлтый треугольник означает подготовку, зелёный круг — лазание, сине-фиолетовый ромб — пройденную трассу, серые полоски — паузу. Красный крест означает полную остановку трассы, а не завершённую попытку. Цвета этих значков задаются отдельно в
params.txt. - Кнопка возле номера трассы открывает управление инцидентами: трассу можно приостановить и возобновить с выбранной, в том числе будущей, ротации.
- Флажок после номера ротации имеет подсказку «Остановить всю волну с этой ротации». Для будущей ротации он включается автоматически и удерживает участников связанной волны также на предыдущих трассах. Флажок можно снять вручную; для текущей или прошедшей ротации он по умолчанию выключен, поэтому уже вышедший участник может закончить попытку.
- Запланированные границы инцидента сразу показываются в описании и маркерами в таблице. За одну ротацию до возобновления значки этой паузы исчезают: участники, выходящие в следующей ротации, видят жёлтые треугольники подготовки.
- Если задана ротация возобновления, значки паузы охватывают лазание в период остановки, а подготовку — только к трассам 2 и далее, когда участник уже начал соревнование. Подготовка к первой трассе не получает значок паузы. Например, при паузе трассы 2 с ротации 17 и возобновлении с 18, с удержанием всей волны, заранее отмечены №15–16 на трассе 2 и №17 на трассе 1. У последующих участников значков нет, но расписание остаётся сдвинутым. Если возобновление не задано или пауза заканчивается полной остановкой трассы, прежние значки сохраняются.
- В описании паузы «по ротацию» означает последнюю приостановленную ротацию, а в поле возобновления указывается первая рабочая. Если трасса 1 приостановлена с 17 и возобновляется с 19, описание показывает «с ротации 17 по ротацию 18»: значки паузы стоят у №17 и №18, но не у №19, который только готовился бы к первой трассе.
- Паузы с удержанием всей волны рассчитываются по порядку ротаций, независимо от порядка добавления. Изменение более ранней паузы автоматически пересчитывает участников последующих пауз, включая уже сохранённые списки. Например, если после паузы трассы 2 на ротацию 17 добавить паузу трассы 3 на ротации 14–15, в ротации 15 снимаются только значки третьей паузы: №13–14 на трассе 2 и №15 на трассе 1 остаются отмечены второй паузой. №13 готовится в ротации 17 и выходит на трассу 2 только в 18.
- Полная остановка трассы с той же или более ранней ротации делает запланированную паузу неактивной. Например, пауза трассы 2 на ротацию 17 не задерживает первую трассу, если трасса 2 полностью остановлена с 16 или с 17. В меню появляется пояснение, почему пауза не действует. Её запись сохраняется, но значков и сдвига от неё нет. Отмена полной остановки снова позволяет учитывать сохранённую паузу. Если пауза началась до полной остановки, её накопленный сдвиг сохраняется.
- Участника или трассу можно исключить и позже восстановить. Подтверждения явно указывают, какой список изменяется.
- На экранах таблицы доступны только для просмотра, прокручиваются автоматически и продолжают локально обновляться при краткой потере связи.




Такая остановка не перезаписывает заданное окончание паузы. Если пауза была с ротации 17 по 17, после удаления остановки с 16 или с 17 она снова возобновляется с 18. Это работает и после перезагрузки страницы. Пауза, изначально заданная без окончания, остаётся без окончания.


Два списка можно разместить в параллельных колонках или один под другим; раскладка переопределяется отдельно для каждого экрана.
↑ К оглавлениюПодключение и управление экранами
7.1. Подключение
- Подключите серверный компьютер и все экраны к одной локальной сети.
- Запустите таймер. В окне запуска найдите адрес Wi-Fi или Ethernet, например
http://192.168.1.68:8008/. - Откройте этот адрес на телефоне, планшете, телевизоре или другом компьютере.
- В управляющем браузере включите «Основной браузер». Все остальные подключения автоматически перейдут в режим экрана.
- Если подключён старый телевизор или браузер с проблемами современного JavaScript, переключите его в Legacy-режим из списка браузеров.
- На мобильных устройствах один раз коснитесь страницы, чтобы браузер разрешил звук и попытку перехода в полный экран.
Основной IP: даже если управляющий браузер открыт через 127.0.0.1, приложение старается показать пригодный для других устройств сетевой IP. Только IP основного браузера кликабелен и копирует готовую ссылку.
7.2. Что можно делать из основного браузера
Если на экране виден хотя бы один стартовый список, под таймером отображается номер текущей ротации. Плашка остаётся видимой в полном экране и Legacy, но не позволяет менять ротацию; стрелок изменения номера на экране просмотра нет, в том числе в Firefox. Во время перерыва её контур жёлтый, во время ротации — зелёный; перед запланированным стартом показывается «Ожидание старта». На экране без списков плашка скрыта.

- Одновременно запускать, ставить на паузу и сбрасывать таймер на всех экранах.
- Менять формат, параметры и язык интерфейса для подключённых браузеров.
- Включать «Звук в других браузерах» для всех второстепенных экранов.
- Включать «Полный экран в других браузерах». Если браузер блокирует удалённый переход, на экране потребуется тап.
- Просматривать состояние каждого браузера, тестировать его звук и настраивать индивидуальную временную поправку.
- Переключать отдельный экран в Legacy-режим кнопкой LEGACY в строке браузера.
- Закреплять место браузера булавкой и менять порядок стрелками. Основной браузер всегда остаётся первым.
- Если подключено не менее трёх браузеров, включать их номера кнопкой в правом верхнем углу карточки основного браузера. Номер появляется на карточке и в правом верхнем углу поля таймера соответствующего экрана.
Основной браузер расположен первым и выделен более ярким контуром. Сочетание Ctrl+M позволяет быстро переназначить роль при аварийной ситуации.
7.3. Legacy-режим для старых экранов
Legacy-экран предназначен для старых браузеров в телевизорах, планшетах и медиаплеерах, где обычная страница может работать нестабильно. Он открывается как /legacy.html без видимых служебных параметров в адресной строке.
- Без выбранных списков на экране остаётся только крупное табло времени. Плашками LIST 1–4 в основном браузере можно вывести на Legacy-экран полные таблицы выбранных списков без элементов управления.
- Страница использует упрощённый JavaScript и обычные XHR-запросы к
/api/state, поэтому не зависит от SSE, Fetch API, Web Audio, Wake Lock и других современных возможностей. - Звук в Legacy-режиме не воспроизводится. Если нужны звуковые сигналы, оставьте звук на основном браузере или на обычном современном экране.
- Время считается локально по состоянию сервера и периодически уточняется по лучшим сетевым измерениям. Из-за упрощённой синхронизации точность может быть немного ниже, чем на обычном экране.
- Списки загружаются только при изменении их ревизии. При временной потере сети Legacy-экран продолжает локально обновлять маркеры, подсветку и автопрокрутку по автономному таймеру, а после восстановления связи принимает авторитетное состояние сервера.
- Если включена плашка TIME, под основным таймером показываются компактные часы сервера. Подсказка TAB в Legacy не сообщает Wake Lock, потому что старый браузер не позволяет надёжно определить его состояние.
- Размер цифр подбирается под экран, включая длинные значения фестиваля вроде
120:00. После поворота устройства Legacy-экран несколько раз пересчитывает размер и центрирование. - В портретном режиме колонки номера и трасс компактные, а ФИО показывается целиком без наложения значков. Если длинные имена или дополнительные колонки не помещаются, список можно прокрутить по горизонтали.
- Повторное нажатие LEGACY из основного браузера возвращает экран на обычную страницу
/.

Legacy-режим лучше использовать только для устройств, на которых обычный экран не работает или работает слишком тяжело. На современных телефонах, планшетах и компьютерах обычный экран точнее синхронизирует время и поддерживает звук.
7.4. Диагностика подключений
Карточка браузера содержит порядковый номер, название и версию, операционную систему, IP, роль, транспорт и индикаторы. Наведение на плашку показывает подробности. Серый означает недоступность, тёмно-зелёный — доступную, но неактивную функцию, светло-зелёный — активное или нормальное состояние, жёлтый — предупреждение, красный — ошибку.
Актуальный порядок индикаторов: LEGACY, AUDIO, TIME, NET, SYNC, SSE, TAB; ниже расположены LIST 1–4.
| Индикатор | Назначение |
|---|---|
| LEGACY | Переключает экран между обычной и облегчённой страницей. Тёмно-зелёный — переход доступен, светло-зелёный — Legacy включён. Оранжевый контур показывает ручной выбор Legacy на браузере, способном работать в обычном режиме. |
| AUDIO | Серый — звук недоступен, тёмно-зелёный — доступен, но выключен, красный — разрешён настройкой, но не разблокирован касанием. При работе также контролируется реальное продвижение аудиочасов: до 100 мс — зелёный, 100–250 мс — жёлтый, выше — красный. |
| TIME | Показывает или скрывает под таймером компактные часы сервера. Тёмно-зелёный — скрыты, светло-зелёный — показаны. |
| NET | Состояние связи и задержка запроса. До 100 мс — зелёный, 100–200 мс — жёлтый, выше 200 мс или отсутствие связи — красный. |
| SYNC | Оценка синхронизации часов и задержки отрисовки. Задержка до 100 мс — зелёная, 100–250 мс — жёлтая, выше 250 мс — красная. Ошибка синхронизации учитывает и ещё не применённую поправку. В обычном браузере ожидание проверки после расхождения часов всегда отмечается красным и поясняется в подсказке. Подсказка основного браузера также сообщает обнаруженные аномалии часов сервера. |
| SSE | Постоянное соединение для мгновенной доставки команд: зелёный — подключено, красный — ожидалось, но потеряно, серый — технология недоступна или автономный режим. |
| TAB | Зелёный — вкладка видима, красный — скрыта. В обычном браузере подсказка также сообщает состояние Wake Lock. |
| LIST 1–4 | Серый — область или список не добавлены, тёмно-зелёный — список доступен, но скрыт, голубой — показан на этом экране. |
Настройка AUDIO
- Нажмите индикатор AUDIO нужного браузера.
- Установите поправку от −500 до +500 мс: отрицательная запускает звук раньше, положительная — позже.
- Проверьте сигналы кнопками «Старт», «Финиш», «1 мин» и «5 сек».
- Во время работающего таймера кнопки проверки звука недоступны. Они остаются доступными во время обратного отсчёта до старта и на паузе.
- Для проверки всех устройств из строки основного браузера включите «Проверить везде, где разрешён звук».
- Повторно нажмите AUDIO, чтобы сохранить поправку.
7.5. Работа при временной потере сети
Сервер хранит общую точку старта, но каждый браузер самостоятельно рассчитывает текущее время. Поэтому потеря Wi-Fi сама по себе не должна останавливать цифры.
- Команды обычно приходят через SSE; резервная синхронизация выполняется примерно раз в две секунды.
- Неуспешный сетевой запрос ограничен тайм-аутом и не блокирует локальный ход таймера.
- Обычный возврат сети сохраняет калибровку часов и корректное звуковое расписание. Само событие подключения к сети не считается пробуждением.
- Если сервер недоступен около 4,5 секунды, панель показывает предупреждение, а NET, SYNC и SSE становятся красными.
- Можно выбрать Автономный режим и продолжить управлять таймером только в этом браузере. Другие браузеры при этом не синхронизируются.
- В списке браузеров автономный режим показывает только текущий браузер. Нажмите AUDIO, чтобы настроить поправку от −500 до +500 мс и проверить сигналы START, END, MINUTE и WARNING.
- Прошедшее время старта в «Классике» и «Фестивале» восстанавливает таймер так, как если бы он был запущен сегодня в указанное время. В «Финале» прошедшее время означает обратный отсчёт до завтра.
- Если страница была открыта через сервер и затем переведена в автономный режим, восстановление контакта автоматически возвращает актуальное серверное состояние. Прямая однофайловая автономная версия сервера не использует.
При первом подключении обычный экран показывает «Синхронизация времени» и --:--, пока не измерит время сервера. В этот момент звуковые события не планируются и не отмечаются проигранными. После синхронизации экран сразу показывает актуальный отсчёт. Одного сообщения о состоянии от сервера для проверки времени недостаточно. Автономная HTML-версия и APK серверной проверки не требуют.

Перевод календарных часов сервера не сдвигает уже запущенный спортивный таймер и его звуковое расписание. Отдельные часы TIME показывают календарное время сервера. Старт по заданному времени сохраняет привязку к часам; восстановление после перезапуска по-прежнему использует сохранённое состояние и календарные отметки.
Если сон, перевод системного времени браузера или другая причина привели к расхождению его часов, появится «Требуется проверка времени», а SYNC станет красным. Таймер продолжит расчёт по последней монотонной модели, но её точность уже не подтверждена; сигналы приостановлены до нового измерения по серверу. Системное время не используется для прямого скачка таймера. Проверка может вызвать необходимую коррекцию после ответа сервера.
Если сервера нет, в автономном режиме нажмите Стоп, затем Старт для нового отсчёта. Это задаёт новое локальное начало, а не восстанавливает достоверное время предыдущей ротации. На Legacy действует отдельная упрощённая синхронизация; он не воспроизводит звук.
Перед соревнованием проверьте реальные устройства: краткий и длительный обрыв сети, скрытие и открытие вкладки, сон и пробуждение, перезапуск сервера, сигналы на границе ротации и окончание Финала. Успешные программные тесты не гарантируют одинаковое поведение сна и аудио на всех ОС и браузерах.
Звук и мигание
- Звук в основном браузере управляет только звуком этого управляющего браузера.
- Звук в других браузерах разрешает сигналы на подключённых экранах.
- Дополнительный браузер на том же компьютере, что и основной, автоматически не дублирует звук.
- Мигание включает визуальную вспышку вместе с предупреждающими сигналами сразу во всех подключённых современных браузерах; в автономном режиме настройка действует только в текущем браузере.
- Выключение звука отменяет уже запланированные аудиосигналы.
no_sound_warm=trueвparams.txtотключает тихие технические тоны предварительного прогрева во всех современных браузерах. Беззвучная попытка заранее возобновить аудиоконтекст сохраняется; сигналы старта, перехода, минуты и последних пяти секунд не изменяются.
Используются сигнал начала ротации или перерыва, минутное предупреждение и последние пять секунд. В «Фестивале» чекбокс «Объявления времени» управляет дополнительными сигналами за 60, 30, 10 и 5 минут.
Звуковые профили
Комплект выбирается в панели управления или параметром sound_profile в params.txt. Каждый подкаталог внутри beeps является отдельным профилем. Для добавления собственного комплекта достаточно создать подкаталог и положить в него файлы со стандартными именами:
| Файл | Назначение |
|---|---|
START.wav или START.mp3 | Начало первой ротации и переход с перерыва на новую ротацию. |
END.wav или END.mp3 | Окончание ротации и начало перерыва. Файл необязателен: при его отсутствии используется START. |
MINUTE.wav или MINUTE.mp3 | Сигнал за одну минуту. |
WARNING.wav или WARNING.mp3 | Каждый сигнал последних пяти секунд. |
FESTIVAL_60.wav или FESTIVAL_60.mp3 | Объявление за 60 минут в Фестивале. |
FESTIVAL_30.wav или FESTIVAL_30.mp3 | Объявление за 30 минут в Фестивале. |
FESTIVAL_10.wav или FESTIVAL_10.mp3 | Объявление за 10 минут в Фестивале. |
FESTIVAL_5.wav или FESTIVAL_5.mp3 | Объявление за 5 минут в Фестивале. |
Регистр букв не важен. Если в профиле есть одноимённые WAV и MP3, используется WAV. При отсутствии START, MINUTE или WARNING для соответствующего события включается синтетический сигнал.
lib/offline-audio.js содержит автономную копию всех звуковых профилей и основных параметров. Файл автоматически пересоздаётся при каждом запуске сервера. Поэтому после замены файлов в beeps достаточно один раз запустить таймер, а затем index.html можно открывать напрямую без сервера с полноценными звуками.
В релизах также есть один самодостаточный файл fdv-bouldering-timer-standalone.html. Он подходит для любой ОС и запускается без Node.js, но работает как одиночный автономный таймер без синхронизации с другими браузерами. Android APK FDV Bouldering Timer содержит этот же таймер внутри приложения: в нём нет сервера, сетевых экранов и синхронизации. В автономной плашке на телефоне появляется кнопка добавления на рабочий стол: Android может показать системную установку, а iOS показывает инструкцию через меню «Поделиться».
Фестивальные файлы необязательны. При включённых объявлениях используется файл профиля; если его нет — системный голос; если подходящий голос недоступен — сигнал MINUTE. Выключение чекбокса отменяет все четыре объявления независимо от содержимого профиля.
Нулевой перерыв: в «Классике» и «Фестивале» END не звучит, потому что сразу начинается следующая ротация и используется START. В «Финале» при завершении всегда звучит END или заменяющий его START.
Мобильные браузеры запрещают автоматический звук до первого пользовательского действия. Коснитесь страницы и убедитесь, что AUDIO стал зелёным.
↑ К оглавлениюПеренос и запуск на новом компьютере
Приложение переносимое: копируйте папку целиком, затем подготовьте Node.js, сеть и при необходимости новый сертификат.
В APK область таймера учитывает системную панель «Назад / Домой», жестовую навигацию и вырезы экрана. Кнопки остаются вне занятой системной области; при скрытой панели фиксированного нижнего отступа нет.
Готовые установщики и portable-архивы опубликованы в GitHub Releases: MSI для Windows, PKG для macOS, DEB для Debian/Ubuntu Linux и автономный APK для Android. Для одиночного автономного запуска на любой ОС можно взять один файл fdv-bouldering-timer-standalone.html или открыть автономную версию на GitHub Pages. Она работает на всех ОС, включая iPhone и Android; на этих устройствах её можно сохранить на рабочий стол как веб-приложение.
Komi Store: таймер также можно найти и установить через Komi Store на Windows, macOS, Linux и Android. Магазин выбирает установочный файл из GitHub Releases для текущей ОС. На Android это именно автономный APK, а не сетевой сервер.
8.1. Что переносить
Удобнее всего скачать готовый актуальный установщик: он уже содержит всё необходимое для конкретной ОС. Если это невозможно, скачайте portable-архив или скопируйте каталог уже развёрнутого таймера с другого компьютера. Перед копированием остановите таймер. В новой папке должны сохраниться как минимум:
index.htmllegacy.htmllib/offline-audio.jsдля звуков при прямом автономном открытииserve-bouldering-timer.jsparams.txt- папка
beepsсо звуковыми профилями help.htmlhelp-assets- скрипты запуска своей ОС
- portable Node.js, если используется путь из
params.txt - или один файл
fdv-bouldering-timer-standalone.html, если нужен только автономный таймер без сервера
Сертификаты можно перенести, но после смены компьютера или сетевого IP надёжнее создать их заново. Сохранённое состояние portable-версии находится в каталоге runtime-state рядом с таймером. Установленная версия хранит его отдельно: Windows — %LOCALAPPDATA%\FDV Bouldering Timer\runtime-state, macOS — ~/Library/Application Support/FDV Bouldering Timer/runtime-state, Linux — ~/.local/state/fdv-bouldering-timer/runtime-state (или в каталоге XDG_STATE_HOME). При переносе установленного таймера этот каталог копируется отдельно, если нужно сохранить состояние.
Если запись рядом с программой запрещена, сервер автоматически выбирает пользовательский каталог — это также поддерживает старые установки в Program Files. Выбранный путь показывается в журнале лаунчера. Старое сохранение переносится при первом запуске, если в новом каталоге ещё нет сохранения; восстановление возможно для сохранений не старше 12 часов.
8.2. Node.js
Используйте актуальную LTS-версию Node.js. Все варианты загрузки доступны на официальной странице Node.js. Есть два варианта:
- Системная установка: установите Node.js с nodejs.org и проверьте командой
node -v. - Portable runtime: на странице загрузки Node.js portable-версия называется Standalone Binary. Скачайте подходящий архив для своей ОС и архитектуры, распакуйте его и укажите путь к исполняемому файлу в
params.txt. По умолчанию используютсяruntime\win\node.exeдля Windows,runtime/mac/bin/nodeдля macOS иruntime/linux/bin/nodeдля Linux.
Параметры portable_node_win, portable_node_mac и portable_node_linux могут содержать относительный путь от папки таймера или абсолютный путь. Скрипт запуска сначала проверяет настроенный portable Node.js, а если файл не найден, пробует системную команду node. Краткие инструкции также находятся в каталогах runtime/win, runtime/mac и runtime/linux.
8.3. Первый запуск на Windows
- При необходимости проверьте порты и начальные значения в
params.txt. - Дважды щёлкните

fdv-bouldering-timer.exe. В portable-релизе он находится рядом с файлами таймера. - Приложение сервера покажет локальные и сетевые адреса, запустит сервер и откроет браузер. Закрытие окна сворачивает приложение в область уведомлений; команда Stop and exit останавливает сервер.
- Если
fdv-bouldering-timer.exeотсутствует или не запускается, используйте резервныйstart-timer-win.bat. - Если Windows Firewall запросит доступ для Node.js, разрешите его для частных сетей.
Порты: штатный запуск перед стартом останавливает процессы, слушающие HTTP- и HTTPS-порты из params.txt. Не назначайте эти порты другому важному приложению.
8.4. Первый запуск на macOS
- При необходимости проверьте
params.txt. - В portable-релизе запустите
FDV Bouldering Timer.appили файлfdv-bouldering-timerрядом с ним. Откроется окно приложения сервера. - Приложение покажет локальный и сетевые адреса, запустит сервер и откроет браузер.
- Закрытие окна останавливает сервер. Используйте Restart server после изменения портов или настроек Node.js.
- Если приложение недоступно, используйте резервный
start-timer-mac.command; Terminal нужно держать открытым, остановка — Ctrl+C.
Если macOS сообщает, что разработчик не подтверждён, сначала щёлкните приложение или скрипт правой кнопкой и выберите «Открыть». Если запуск всё равно заблокирован, откройте Системные настройки → Конфиденциальность и безопасность и в разделе безопасности нажмите «Всё равно открыть» / «Разрешить» для FDV Bouldering Timer.
Если после распаковки блокируется приложение или оно открывается, но не может запустить встроенный Node.js, щёлкните правой кнопкой по prepare-timer-mac.command, выберите «Открыть» и подтвердите запуск. Если macOS всё равно блокирует скрипт, откройте Системные настройки → Конфиденциальность и безопасность и нажмите «Всё равно открыть». Скрипт снимает quarantine-атрибут со всего распакованного релиза и восстанавливает права запуска. После сообщения Done запустите FDV Bouldering Timer.app обычным способом.
Если исполняемый атрибут скрипта не сохранился при загрузке или распаковке, откройте Terminal в папке релиза и один раз выполните chmod +x prepare-timer-mac.command, затем снова запустите скрипт. Ручной эквивалент его основной операции:
xattr -dr com.apple.quarantine .
xattr -dr com.apple.quarantine "FDV Bouldering Timer.app"
xattr -dr com.apple.quarantine "/полный/путь/к/fdv-bouldering-timer-macos-arm64"
Первый вариант выполняется из папки распакованного релиза. Второй снимает quarantine только с приложения. Третий удобен, если папка лежит в Downloads или на внешнем диске. Если появляется «Permission denied», выполните в Terminal из папки проекта:
chmod +x prepare-timer-mac.command fdv-bouldering-timer start-timer-mac.command create-https-certificate-mac.command
Для portable Node.js выбирайте сборку своей архитектуры: arm64 для Apple Silicon или x64 для Intel.
8.5. Первый запуск на Linux
- Распакуйте архив и откройте Terminal в папке таймера.
- При необходимости выполните
chmod +x fdv-bouldering-timer install-linux-launcher.sh start-timer-linux.sh create-https-certificate-linux.sh. - Запустите
./fdv-bouldering-timer. Откроется окно приложения сервера с адресами и журналом. - Чтобы приложение появилось в меню Ubuntu/GNOME с иконкой, один раз выполните
./install-linux-launcher.sh, затем запускайте FDV Bouldering Timer из меню приложений и при необходимости закрепите его в Dock. - Закрытие окна приложения останавливает сервер. Если GUI-запуск недоступен, используйте резервный
./start-timer-linux.shи держите Terminal открытым; остановка — Ctrl+C.
В Linux обычный исполняемый файл в файловом менеджере может отображаться стандартной шестерёнкой. Иконку для меню приложений и Dock задаёт установленный .desktop-ярлык, который создаёт install-linux-launcher.sh.
Portable-релизы Linux выпускаются отдельно для x64 и arm64. Официальные сборки Node.js рассчитаны на glibc-дистрибутивы, включая Ubuntu, Debian и Fedora. Для Alpine Linux/musl требуется совместимая сборка Node.js.
8.6. HTTP и HTTPS
HTTP работает сразу и подходит для обычной работы в локальной сети. HTTPS создаёт для браузера защищённый контекст; это особенно полезно для телефонов и планшетов. Сертификат остаётся локальным и самоподписанным.
| Возможность браузера | HTTP | HTTPS |
|---|---|---|
| Таймер, синхронизация, SSE, списки, звук и обычный экранный режим | Работают | Работают |
| Wake Lock: не давать экрану гаснуть | Обычно недоступен | Доступен в поддерживающем браузере после действия пользователя; состояние видно в подсказке TAB |
| Сервис-воркер и повторное открытие кэшированной страницы без интернета | Недоступны вне localhost | Доступны; браузер может кэшировать страницу |
| Современный API буфера обмена для копирования адресов | Может быть ограничен; есть резервное копирование | Доступен в поддерживающем браузере |
HTTPS не отменяет правила браузера: для звука и попытки полного экрана по-прежнему нужно касание экрана. Wake Lock не гарантирует отсутствие энергосбережения: его могут снять браузер, ОС или режим экономии батареи.
| ОС | Создание сертификата | Результат |
|---|---|---|
| Windows | create-https-certificate.bat | PEM через OpenSSL либо timer-cert.pfx встроенными средствами Windows |
| macOS | create-https-certificate-mac.command | timer-key.pem и timer-cert.pem |
| Linux | create-https-certificate-linux.sh | timer-key.pem и timer-cert.pem |
- Создавайте сертификат при подключённой рабочей сети: скрипт включает найденные IP-адреса в сертификат.
- После создания обязательно перезапустите сервер.
- Первое открытие HTTPS может показать предупреждение. Откройте дополнительные параметры и разрешите переход к локальному сайту.
- После смены компьютера или локального IP пересоздайте сертификат.
Ошибка Unsupported PKCS12 PFX data: файл timer-cert.pfx повреждён, имеет другой формат или пароль. Удалите только этот PFX, снова запустите штатный скрипт создания сертификата и перезапустите таймер. Не переименовывайте произвольный сертификат в .pfx.
8.7. Проверка после переноса
- Локальная страница открывается по
127.0.0.1. - Телефон открывает адрес Wi-Fi или Ethernet с указанным портом.
- Один браузер назначен основным, остальные видны как экраны.
- Работают «Старт», «Пауза», «Стоп» и соответствующие горячие клавиши.
- LEGACY, AUDIO, TIME, NET, SYNC, SSE и TAB показывают ожидаемое состояние.
- Звуковые сигналы слышны только на нужных устройствах.
Файл params.txt
Файл задаёт начальные значения при старте сервера. После изменения остановите и снова запустите приложение.
| Параметр | Назначение | Пример |
|---|---|---|
http_port | Порт HTTP | 8008 |
https_port | Порт HTTPS | 8443 |
portable_node_win | Путь к portable Node.js для Windows | runtime\win\node.exe |
portable_node_mac | Путь к portable Node.js для macOS | runtime/mac/bin/node |
portable_node_linux | Путь к portable Node.js для Linux | runtime/linux/bin/node |
language | Начальный язык интерфейса и отдельно открытого руководства | ru / en |
classic_rotation_minutes | Ротация «Классики», минуты | 5 |
classic_break_seconds | Перерыв «Классики», секунды | 15 |
festival_round_minutes | Фестивальный раунд, минуты | 120 |
festival_break_minutes | Фестивальный перерыв, минуты | 30 |
final_rotation_minutes | Ротация финала, минуты | 4 |
final_round_format | Начальный формат продвижения списка в финале | old / new |
final_rest_rotations | Число ротаций отдыха в новом формате финала | 3 |
primary_browser | Автоматически назначить первый браузер основным | false |
sound | Начальное состояние звука | true |
sound_in_other_browsers | Начальное состояние звука экранов | false |
festival_announcements | Начальное состояние фестивальных объявлений времени | true |
flashing | Начальное состояние мигания | true |
no_sound_warm | Отключить тихие технические тоны прогрева; пустое значение сохраняет прогрев со звуком | пусто / true |
sound_profile | Название подкаталога звукового профиля внутри beeps | FSR_2026 |
timer_font_file | Файл основного шрифта таймера внутри каталога fonts | Roboto-Variable.ttf |
timer_font | Резервный список системных шрифтов | Arial, sans-serif |
countdown_text_color | Цвет цифр во время обратного отсчёта перед стартом | #f4f7fb |
countdown_background_color | Цвет фона во время обратного отсчёта перед стартом | #0e1116 |
rotation_text_color | Цвет цифр во время ротации | #f4f7fb |
rotation_last_five_text_color | Цвет цифр в последние 5 секунд ротации | #f4f7fb |
rotation_background_color | Цвет фона во время ротации | #0e1116 |
rotation_last_five_background_color | Цвет фона в последние 5 секунд ротации | #0e1116 |
break_text_color | Цвет цифр во время перерыва | #f4f7fb |
break_background_color | Цвет фона во время перерыва | #f05a59 |
list_ready_color | Треугольник подготовки | #ffc857 |
list_active_color | Круг лазания | #26d07c |
list_done_color | Ромб пройденной трассы | #48488C |
list_paused_color | Полоски паузы | #8d97a5 |
list_stopped_color | Крест полной остановки | #f05a59 |
Основной шрифт загружается всеми экранами с локального сервера, поэтому устанавливать его на устройства не требуется. Поместите WOFF2, WOFF, TTF или OTF в каталог fonts и укажите только имя файла без пути. В комплект входят Roboto, Open Sans, Barlow Condensed, Courier Prime и Syne Mono; все они имеют обычный пустой ноль. У Roboto, Open Sans и Barlow Condensed круглые точки двоеточия. Полный список имён находится в fonts/README.txt. Если файл отсутствует или не поддерживается браузером, используется список timer_font. Размер цифр всегда рассчитывается автоматически.
Значения, изменённые в интерфейсе, действуют в текущем запуске сервера, но не переписывают params.txt.
Для цветов значков используйте HEX #RRGGBB или #RGB. Пустое, отсутствующее или неверное значение заменяется стандартным. Цвета одинаковы в Modern и Legacy; формы, фоны строк, кнопки и диагностика не изменяются. После правки перезапустите сервер. В автономный HTML и Android APK параметры встраиваются при сборке: изменение params.txt рядом с готовым файлом на них не влияет.
Устранение проблем
127.0.0.1 работает, а сетевой IP — нет
В списке показывается неправильный сетевой адрес
На телефоне нет звука или полного экрана
Экран погас или вкладка уснула
После переключения телефона на сотовую сеть команды не приходят
Вы случайно закрыли вкладку с основным браузером
Порт уже занят
http_port и https_port в params.txt либо остановите другое приложение на этих портах. Штатные скрипты пытаются освободить настроенные порты перед запуском.HTTPS показывает предупреждение
Ошибка Unsupported PKCS12 PFX data
timer-cert.pfx, создайте сертификат штатным Windows-скриптом и перезапустите приложение. Сервер ожидает PFX, созданный этим скриптом, с паролем bouldering-timer.
