Open Source
machines-demo
·GPL-3.0Интерактивный эмулятор машин Тьюринга и Поста в браузере: пользовательский код собирает машину через опубликованные npm-библиотеки и запускается в Web Worker’е (terminate-on-timeout, ’unsafe-eval’ только в воркере — воркер и есть граница безопасности). Главный поток держит Svelte 5 UI и зеркальную TuringMachine, которая повторяет команды воркера шаг за шагом, обновляя анимированную ленту; между потоками — только plain data через postMessage. Vite, CodeMirror 6 с Lezer-проверкой синтаксиса до запуска, Playwright e2e
flowtty
·MITБиблиотека React-для-терминала: host config react-reconciler раскладывает <Box>/<Text> через Yoga flexbox, рисует их в cell Buffer и пишет буфер в бэкенд. Три бэкенда: реальный TTY с frame-diff на уровне ячеек, inline-режим с перерисовываемой live-областью и append-only <Static> лог-строками сверху, in-memory тестовый бэкенд. npm-workspaces-монорепозиторий; framework-free пакет core не зависит ни от React, ни от Node — от него зависят react-адаптер и бэкенды, не наоборот. Vitest
15-puzzle
·демо·GPL-3.0Игра «пятнашки» как цепочка уровней, доступ к которым гарантируется подписями Ed25519. SPA на ванильном JS + Vite в паре с Node-сервисом без рантайм-зависимостей: доски детерминированно генерируются (mulberry32 + Фишер—Йейтс + проверка решаемости по чётности), сервер переигрывает присланные ходы перед подписью. URL уровней — нечитаемые 16-символьные hex-хеши, каждый подписанный блоб указывает только на следующий уровень, так что цепочка обеспечивается и на уровне URL
minesweeper
·демо·GPL-3.0Очередной сапёр. Игровое ядро на ванильном TypeScript без зависимостей от DOM или canvas, отдельный canvas-рендерер с предзаготовленными оффскрин-спрайтами и pick-канвасом для определения попаданий по цвету — без геометрии. С учётом devicePixelRatio. Покрыт тестами на Jest
life-game
·демо·MITИгра «Жизнь» Конвея на весь экран, одна клетка на CSS-пиксель — порт Delphi-игрушки 2012 года на TypeScript + Vite. Клик порождает волны, которые отражаются от краёв поля (метод мнимых источников) и подпитывают симуляцию; точка блуждает по бесконечному сплайну Катмулла—Рома (скользящее окно из четырёх контрольных точек) и порождает волны время от времени, а также при резкой смене направления траектории. Пресеты правил (Conway, HighLife, Maze) плюс чекбоксы Born/Survive; при изменении размера окна картина сохраняется; случайное заполнение поля эволюционирует некоторое время до первого рендера
@turing-machine-js/machine
·GPL-3.0npm-монорепозиторий: ядро @turing-machine-js/machine (State, Tape, TapeBlock, TuringMachine) с round-trip-сериализацией графа состояний через Mermaid, плюс две библиотеки двоичной арифметики с одинаковым набором операций, но разными алфавитами — 5-символьный маркер-вариант (несколько чисел на одной ленте) и 3-символьный bare-вариант (одно число) — чтобы наглядно показать trade-off между размером алфавита и количеством состояний. Coveralls, GitHub Actions CI
@post-machine-js/machine
·GPL-3.0Конструктор машин Поста, компилирующий набор инструкций в State-граф @turing-machine-js/machine под капотом — обе библиотеки делят одну инстанцию ядра через peer-dependency. Поддерживает подпрограммы (call), inline-группы инструкций (1: [mark, right, mark]) и ветвление через check. Опубликовано в npm
@mellonis/typograf-artlebedev
·MITTypeScript-обёртка над SOAP-сервисом «Типограф» Артемия Лебедева — кавычки-ёлочки, тире и неразрывные пробелы вокруг коротких слов, без локального движка правил. Результат — discriminated union: либо обработанный текст, либо одна из четырёх типизированных ошибок (network_error, timeout, aborted, service_error). Таймауты через AbortSignal.any (Node 22.5+), внешний AbortSignal для отмены. Без рантайм-зависимостей
@form-validator-js/core
·демо·MITДекларативный валидатор HTML-форм на ванильном TypeScript — правила пишутся в data-атрибутах на полях, форма автоматически получает novalidate, рендеринг ошибок остаётся за приложением. Поддерживает кросс-полевую реактивность (ввод в password ре-валидирует confirm через observable-проводку equalsTo), три режима тайминга (blur-then-input по умолчанию) и поля, привязанные снаружи через атрибут form. При невалидной отправке делает stopImmediatePropagation, чтобы остальные submit-обработчики не видели неуспешную попытку