Wanix
- title
- Wanix
- type
- toolbox
- summary
- Пространства имён в стиле Plan 9 в браузере: изолированный запуск программ Wasm и x86 без сервера
- tags
- golang, webassembly, sandboxing, plan9, browser, watchlist
- language
- Golang (kernel), JavaScript (elements)
- license
- MIT
- created
- 2026-07-29
- updated
- 2026-07-29
- lang
- ru
- translation_of
- wanix
- source_updated
- 2026-07-29
- translated
- 2026-09-01
- translator
- lllm/antigravity/gemini-3.7-flash-medium
Wanix создаёт Unix-подобное окружение прямо внутри веб-страницы. Он заимствует две идеи, сделавшие интересной Plan 9 - всё есть файл, и каждый процесс получает собственное пространство имён, - и реализует их поверх API браузера. В итоге страница может запускать бинарники Wasm, а через x86-эмулятор и настоящий Linux, вообще без участия сервера. Релиз 0.4 упаковывает всё это в custom HTML elements, благодаря чему демо на wanix.dev поднимает рабочий shell всего из трёх тегов:
<wanix-term>
<wanix-bind dst="rc.wasm" type="file"
src="https://wanix.dev/extras/0.4.0-rc2/rc.wasm">
</wanix-bind>
<wanix-task cmd="rc.wasm" term start></wanix-task>
</wanix-term>
Здесь rc - это командная оболочка Plan 9, скомпилированная в Wasm, загруженная в пространство имён по пути rc.wasm и запущенная как задача с подключённым терминалом.
The namespace model
Всё, к чему программа может обратиться, представляет собой путь, а ядро предоставляет собственные средства через пути устройств с префиксом #: #task для управления процессами, #term для терминалов, #vm для виртуальных машин, #ramfs для файловых систем в памяти (клонируются при каждом bind'е), #pipe, #signal и #web для интеграции с браузером - включая #web/opfs для Origin Private File System, обеспечивающей персистентность. Задача по умолчанию наследует пространство имён родителя, но ей можно задать и другое - на этом и строится вся изоляция: программа видит ровно те файлы, которые для неё подключили через bind, и ничего больше. Это более строгая и простая граница, чем связывание возможностей (capabilities), которое wasmer и другие серверные runtime'ы делают через preopen'ы WASI, поскольку композиция происходит через тот же примитив, который программа использует для чтения файлов.
<wanix-bind> - примитив, с помощью которого строятся эти пространства имён, и он умеет больше, чем просто связывать имена. type="file" загружает URL или встраивает содержимое напрямую, type="archive" распаковывает .tar/.tgz в дерево каталогов, а наложение нескольких архивов или bind'ов каталогов на один и тот же dst даёт рекурсивное объединение - поведение union-mount из Plan 9, а не оверлейную файловую систему. type="import" подключает удалённое пространство имён по протоколу 9P через WebSocket или встроенный iframe. Страница может экспортировать своё пространство имён с id и списком allow-origins, позволяя двум страницам с разных origin'ов разделять файловую систему по протоколу 1992 года.
Running things
Задачи передаются подключаемым драйверам, которые выбираются атрибутом type: js для чистого JavaScript, gojs для Wasm, собранного с GOOS=js GOARCH=wasm, wasi для модулей wasip1, и auto для автоопределения. Разделение gojs и wasi на отдельные драйверы - правильное решение: у этих двух таргетов принципиально разные контракты с хостом. Ошибка с выбором таргета - ровно тот сбой, который описан в adding-go-to-a-browser-code-runner, где GOOS=js намертво зависал внутри голого изолята V8, потому что ничто не обрабатывало очередь микрозадач.
<wanix-vm> - запасной выход для кода, который никогда не планировался под Wasm. Он запускает внутри пространства имён v86 - x86-эмулятор на JavaScript: достаточно подключить ассеты эмулятора и образ системы Linux, и он сам определит ядро и загрузится в shell. Атрибуты позволяют задать объём RAM (mem), выделить терминал для консоли (term, которому для консолей ВМ нужен режим raw) и настроить export, повторно публикующий внутреннее пространство имён гостевой системы по пути #vm/1/guest, если образ это поддерживает. В итоге одна и та же страница может содержать Wasm-shell и эмулированный Linux, работая с обоими как с файлами.
Самый тяжеловесный элемент - <wanix-workbench>, встроенный workbench VS Code на базе пространства имён Wanix. Его можно использовать как редактор, файловый менеджер, полноценную IDE или каркас приложения. Для работы его терминала требуется дополнительный бандл assets и задача с атрибутом role="shell".
Подключение к странице делается одним тегом script:
<script type="module"
src="https://cdn.jsdelivr.net/npm/wanix@0.4.0-rc2/dist/wanix.min.js"></script>
Caveats
Версия на главной странице - 0.4.0-rc2, то есть релиз-кандидат, а не стабильный релиз, и в документации указано, что собственные расширения workbench и их редактирование на лету - задача на будущее. Проект разрабатывается tractordev с октября 2023 года; на конец июля 2026 года у него 797 звёзд и 38 форков, а последний push был 2026-07-19. Развитие скорее размеренное, чем быстрое, и по сути это проект одной команды.
Деталь об источнике: примеры для отдельных элементов на wanix.dev отрисовываются собственным JavaScript страницы, поэтому в сохранённой копии сайта блоки кода оказались пустыми. Имена устройств и список драйверов задач здесь взяты из README репозитория.
Тег watchlist - версия pre-1.0 и один разработчик, см. watchlist. Причина следить за проектом: пространства имён для каждого процесса подходят для изоляции ненадёжного кода в браузере лучше, чем ad-hoc-обвязка возможностей, которую использует большинство Wasm-хостов, и это единственная реализация подобной идеи для веба.
MIT, ~797★ на 2026-07-29. Доклад об архитектуре (19 минут): youtube.com/watch?v=kGBeT8lwbo0.