Что это. Установщик Tauri NSIS, без подписи (решение владельца — docs/70-market/PROCUREMENT_TO_SHIP.md),
который ставит GUI (VFlin Antik.exe) и рядом с ним три sidecar-программы: демон vflind.exe, CLI vflin.exe,
MCP-сервер vflin-mcp.exe. Ядра в установщике нет: оболочка скачивает его при первом запуске из источника
пакетов, записанного в install-манифест сборки (A87: core.ensure). Все числа ниже измерены на этой машине
2026-09-05; доказательство (§5) выполнено на чистом VFLIN_HOME.
1. Собрать с нуля
# prerequisites: Rust (MSVC toolchain), Node 24 + pnpm, the NSIS bundler Tauri fetches on first use
cd ui && pnpm install
# the source the installed product will fetch the core from; a CDN placeholder when unset
export VFLIN_PACKAGE_SOURCE="https://cdn.example/core" # or file:///D:/vflin-core-pkg for a local proof
pnpm tauri build
tauri build запускает beforeBuildCommand — pnpm build && node scripts/build-sidecars.mjs, — который собирает
веб-бандл, затем собирает три sidecar-программы в release из корневого workspace (с учётом CARGO_TARGET_DIR,
если он задан, иначе в корневой target/), копирует их в ui/src-tauri/binaries/<name>-<host triple>.exe (так Tauri
называет файлы для bundle.externalBin) и пишет ui/src-tauri/resources/install.json ({"packageSource": …}).
Обе папки внесены в gitignore: бинарники — это артефакты, а манифест может нести путь конкретной машины. Затем
собирается крейт приложения (свой отдельный workspace в ui/src-tauri, свой target/), и NSIS упаковывает
ui/src-tauri/target/release/bundle/nsis/VFlin Antik_0.1.0_x64-setup.exe.
Размеры (2026-09-05, эта машина): sidecar-программы vflind.exe 14.2 MB · vflin.exe 2.9 MB · vflin-mcp.exe 2.4 MB (19.5 MB); установщик VFlin Antik_0.1.0_x64-setup.exe 7.4 MB (установщик от 2026-07-26, только с GUI, весил 2.8 MB); tauri build rc=0 за 321 s вместе с веб-бандлом, шагом sidecar-программ и крейтом приложения в release. Ядра внутри нет: первый запуск скачивает пакет 127.7 MB (A87) из источника, записанного в манифест.
2. Что куда ставится
| путь | |
|---|---|
приложение и sidecar-программы (установка для текущего пользователя, NSIS currentUser) |
%LOCALAPPDATA%\VFlin Antik\ — VFlin Antik.exe, vflind.exe, vflin.exe, vflin-mcp.exe, resources\install.json |
| папка данных — хранилище демона, файл обнаружения, журналы, установленное ядро | ~/.vflin (%USERPROFILE%\.vflin) или $VFLIN_HOME, если он задан |
| файл обнаружения, который читает каждый клиент | ~/.vflin/local-api.json — {port, token, pid, apiVersion}, доступен только пользователю |
| журнал демона · stdout/stderr sidecar-программы | ~/.vflin/daemon.log · ~/.vflin/logs/vflind.out.log |
| ядро после установки | ~/.vflin/core/<vflin-core-…>/chrome.exe + core-manifest.json; на него указывает ~/.vflin/core/current.json |
Почему ~/.vflin, а не %LOCALAPPDATA%\VFlin. Бриф оставил корень за тем, что демон уже пишет.
Демон, оболочка, CLI (vflin-client) и MCP-сервер — все определяют $VFLIN_HOME, а без него ~/.vflin;
%LOCALAPPDATA%\VFlin не читает никто, а живое хранилище оператора — 121 профиль — лежит в ~/.vflin.
Сменить значение по умолчанию значило бы мигрировать это хранилище, а это решение, а не умолчание установщика.
Один корень, четыре читателя, без изменений. (docs/30-core/CORE_PACKAGE.md в первом черновике указывал
%LOCALAPPDATA%; исправлено.)
3. Что делает первый запуск
- Оболочка запускает демон (
daemon_ensure, команда Tauri на Rust): она спрашивает у демона из файла обнаруженияsystem/health— устаревший файл, чей автор уже завершился, ничего не отвечает и не считается, — а если никто не ответил, запускаетvflind.exeиз папки рядом с приложением, отсоединённым (своя группа процессов, без окна консоли,VFLIN_HOMEпередаётся дальше, stdout/stderr — в~/.vflin/logs/vflind.out.log), и до 20 s ждёт health, прежде чем интерфейс прочитает файл обнаружения. Две оболочки, одновременно пришедшие к одному выводу, запускают не больше одного демона: демон отказывается стартовать на хранилище, которое уже обслуживает другой демон (он спрашивает у того health с токеном из файла, пишет в журнал “another vflind already serves this store” и завершается с кодом 0). Эта проверка стоит перед стартовыми проходами сверки намеренно: эти проходы переводят каждый профиль изRUNNINGвDIRTYв предположении, что ни один демон не работает, так что второй экземпляр объявил бы открытые браузеры первого остановленными. - Оболочка устанавливает ядро (
core_bootstrap): читаетresources/install.json, вызываетcore.ensure {source}, опрашиваетcore.statusкаждые 500 ms и на каждое изменение отправляет Tauri-событиеcore-progressс задачей (stage,bytesDone,bytesTotal,state); возвращает итоговую задачу. На машине, где ядро уже есть, это пустая операция за миллисекунды (noop:true). После успешной установки демон сохраняет сработавший источник какpackageSourceв~/.vflin/core.json— поэтому следующемуvflin core ensureаргумент не нужен, а установщик никогда не пишет файлы демона. Экран первого запуска, который показывает это событие, — работа дизайна (G40/дальше); метод и событие — здесь. - Закрытие окна не останавливает демон. В нём живут браузеры оператора, а упорядоченный выход демона
закрывает и запечатывает каждый из них (
A86). Остановка — явная:daemon_stop_allв оболочке →system.shutdownв Local API (vflin system shutdownв CLI,vflin_system_shutdownдля агента) — путь прощания, где ответ называет, сколько ядер он закрывает. У отсоединённого демона нет консоли, куда можно послать Ctrl-C, поэтому это метод API, а не сигнал. - После перезагрузки демон не запущен (автозапуск не регистрируется — см. §6); следующий запуск приложения снова запускает его, за секунды, и ядро уже на месте. Перезагрузка после установки не нужна.
4. Что пользователь видит при установке (без подписи)
Windows SmartScreen: «Система Windows защитила ваш компьютер» (“Windows protected your PC” в английской Windows)
без имени издателя. Нажмите Подробнее → Выполнить в любом случае (More info → Run anyway).
Это известная цена выпуска без сертификата подписи кода (PROCUREMENT_TO_SHIP.md §3: сертификат тоже не убирает
предупреждение сразу; убирает его репутация). Некоторые антивирусы помечают неподписанные установщики при первой
встрече; sha256 установщика опубликован рядом с ним, чтобы скачанный файл можно было проверить вручную.
5. Доказательство — чистое хранилище, установщик, первый запуск
Измерено 2026-09-05 скриптом a88_proof.py: установщик запущен в тихом режиме (/S), УСТАНОВЛЕННОЕ приложение запущено с VFLIN_HOME, указывающим на мою пустую папку (~/.vflin владельца не тронут), источник в install-манифесте — пакет A87 (file:///D:/vflin-a87-pkg-xz).
| шаг | результат |
|---|---|
| установщик /S | rc=0, 4.0 s, VFlin Antik.exe 11.0 MB, vflind.exe 14.2 MB, vflin.exe 2.9 MB, vflin-mcp.exe 2.4 MB |
| приложение запущено → демон поднялся сам | да, 3.8 s, pid демона 60892 |
| демон — это УСТАНОВЛЕННАЯ sidecar-программа | %USERPROFILE%\AppData\Local\VFlin Antik\vflind.exe |
| core.ensure запущен приложением по install.json | installed=True, activeSource=package, задача завершена за 10.1 s |
| sha256 установленного chrome.dll == A87 | d2996cbb…2346, совпадает |
| packageSource сохранён демоном | file:///D:/vflin-a87-pkg-xz |
| первый профиль запущен (с окном) из УСТАНОВЛЕННОГО ядра | start 200 за 6.7 s; исполняемый файл в ~/core/vflin-core-… |
vflin system shutdown |
принято; демон завершился за 24.8 s; shutdown: closed 1 of 1 core(s) gracefully, 1 sealed to LOCAL_CACHED, in 24.0s; chrome left 0 |
Перезагрузка не понадобилась ни разу; приложение само запустило демон, демон сам установил ядро, и первый профиль запустился из установленного ядра с тем же хэшем chrome.dll, который A87 измерил в трёх местах.
6. Чего это не делает (намеренно или пока)
- Нет автозапуска. Демон стартует, когда стартует приложение. Запуск при входе в систему (Task Scheduler / ключ Run) позволил бы браузерам пережить и закрытие приложения, И повторный вход пользователя — но это запись автозапуска, которую установщик вносит в сеанс пользователя, и это отдельное решение (строка 2 ALPHA_PLAN его перечисляет; здесь оно не принято).
- Нет подписи, нет обновлений. ALPHA_PLAN, строка 10, и закупки.
local-unlock.jsonне входит в сборку — это локальный фактор разработчика, он остаётся файлом, который создаёт оператор;check-no-secretsпроверяет дерево.- CLI и MCP-сервер установлены, но не добавлены в
PATH: полный путь —%LOCALAPPDATA%\VFlin Antik\vflin.exe;mcpServers.commandMCP-клиента указывает на…\vflin-mcp.exe(MCP_SKILL_PACK.md). Добавить папку вPATHпользователя — одна строка NSIS-хука, здесь не написанная.