Toolbox открыт: 25 утилит, ничего не загружается
Большинство онлайн-утилит просят отдать файл на чужой сервер. Toolbox не получает ни одного: каждая конвертация, каждый хеш, диф и градиент считаются на вашей машине, а вся поверхность инструментов не делает ни одного сетевого запроса.
Toolbox открыт — двадцать пять утилит, бесплатно, без аккаунта, без установки. Первым делом стоит сказать то, что определило в нём каждую строку: поверхность инструментов делает ноль сетевых запросов. Не «мы удаляем ваши файлы через час», не «обрабатывается безопасно» — удалять нечего, потому что байты никуда не уезжают. Прежде чем написать это на хабе, мы прогрепали всю поверхность, чтобы убедиться.
- 25
- инструментов в четырёх категориях
- 8
- выделенных Web Workers
- 0
- сетевых запросов в поверхности инструментов
- 6
- языков на старте
Двадцать пять инструментов, четыре категории
- Файлы — сжатие и распаковка gzip, архиватор и распаковщик ZIP, конвертер изображений и файловый хешер на четыре дайджеста.
- Текст — форматтер JSON, Base64, URL-кодировщик, настоящий диф Майерса с пословной подсветкой и выводом unified-патча, конвертер регистров, знающий про аббревиатуры, счётчик слов с корректной сегментацией, генератор lorem ipsum по сиду и конвертер CSV↔JSON по RFC 4180.
- Код — тестер регулярных выражений с защитой от разгона, декодер JWT с локальной проверкой HS256, конвертер таймстампов, генератор UUID/v7/nanoid, парсер cron, который отвечает человеческими словами, хеширование SHA и HMAC, генератор паролей и строгий XSS-безопасный предпросмотр markdown.
- Дизайн — конвертер цветов между HEX/RGB/HSL/OKLCH с контрастом по WCAG, конструкторы градиентов и теней, генератор QR и извлекатель палитры, который читает изображение, никуда его не отправляя.
Поиск по ним всем складывает диакритику, так что bäse находит Base64, и повешен на клавиши, которые руки уже знают: / ставит фокус в поле в любом месте хаба, ⌘K работает откуда угодно на странице, Enter открывает верхний результат. У трёх инструментов есть быстрое действие: оно генерирует и копирует значение — пароль, UUID, абзац рыбы — прямо с карточки на хабе, не открывая сам инструмент.
Чего стоило остаться локальным
Клиентские инструменты без загрузки легко пообещать и дорого удержать. Восемь из двадцати пяти делают работу в выделенном Web Worker, чтобы архив на 900 МБ не касался потока, который рисует ваш курсор. Сжатие, распаковка и хеширование идут потоком, а не через буфер: писатель ZIP сбрасывает части Blob каждые 16 МиБ, поэтому куча остаётся плоской при любом размере входа, а после 4 ГиБ он перестаёт умничать, сохраняет CRC и кладёт исходный файл без единой копии. Файловый хешер считает все четыре дайджеста за один проход до 256 МиБ, а выше переключается на самописный инкрементальный SHA-256.
Кое-что здесь сделано просто из ремесленного упрямства. Генератор QR — наш собственный кодировщик: ISO/IEC 18004 model 2, код Рида—Соломона над GF(256), все восемь масок с оценкой, — потому что каждая библиотека, на которую мы смотрели, просила у страницы больше, чем QR-код того стоит. Извлекатель палитры работает медианным сечением с одним намеренным отступлением от учебника: он режет по самому широкому промежутку между занятыми корзинами, а не по медианному индексу, и в этом вся разница между тем, чтобы прочитать логотип как белый и чёрный, и тем, чтобы прочитать его как белый и чуть менее белый.
Сам хаб — двадцать пять маленьких CSS-3D-диорам, без WebGL, по сцене на категорию, засеянных слагом самого инструмента, так что нет двух одинаково поставленных карточек, а тайминги их анимаций разъезжаются на ±15%, чтобы сетка никогда не дышала в такт. Если у вас включено уменьшение движения, каждая сцена замирает в своей собранной позе покоя — и это выглядит решением, а не сломанной анимацией.
Tremor вышел вчера и делает ровно обратное — тянет сейсмичность всей планеты по проводу (как он устроен). Toolbox — тихая половина того же инстинкта: сделать вещь как следует, а потом отдать.