Independent build folders for the self-hosted web apps vecnode's TUI Open menu
(and vn app open|stop|list) launches in Docker. Each app is one folder here plus one
plan_for arm in cli/crates/vn/src/commands/apps.rs
— that's the single, cross-platform engine that builds/pulls the image, starts the
container, waits for it to become ready, and opens the browser. There are no per-OS
launch scripts for these apps.
| Folder | App | Port(s) | What it does |
|---|---|---|---|
| media-processor/ | doc-processor | 8085 (UI) / 8086 (API) | Markdown → PDF via pandoc + tectonic |
| library-portal/ | library-portal | 8090 | Viewer/manager for the repo's library/ folder — edit, tag, list/grid/tree views, drag-and-drop |
| media-downloader/ | media-downloader | 8095 | yt-dlp + ffmpeg web UI — paste a URL, save MP3/WAV/MP4 to the host Desktop |
Each folder has its own README.md with manual docker build/run commands, but the
normal way to run any of these is through vn:
vn app open <name> # e.g. vn app open library-portal
vn app stop <name>
vn app listdocs/ (mdBook) and SilverBullet/Stirling-PDF (pulled vendor images) are also part of
the same vn app registry but don't have a folder here — the first has its own
docs/Dockerfile, and the latter two are pulled, not built.
All of these are loopback-only (127.0.0.1:<port>, never reachable off-host), and
the locally-built ones (everything in this table) run non-root with --cap-drop ALL,
--security-opt no-new-privileges, and a pids limit. media-downloader additionally
routes yt-dlp through an in-container egress-guard proxy, since it fetches arbitrary
untrusted URLs. Full details, per-app threat model, and the reasoning behind each choice
are in SECURITY.md.
These same apps (list/open/stop) are also exposed as MCP tools — vecnode is an MCP host,
so an external MCP client (Claude Desktop/Code) or vecnode's own Ollama chat can call
list_apps/open_app/stop_app directly. See
AGENTS.md for how that's wired up and how to add a tool for a
new app.
- Add the Dockerfile (and any UI assets) in a new folder here.
- Add one
plan_forarm in commands/apps.rs — image, container name, build context, lifecycle, ports, mounts, readiness port. The engine enforces the hardening flags automatically; don't bypass it. - Add a
CommandItemto both Open submenus in tui/app.rs. - Write this folder's own
README.mdfollowing the pattern in the existing ones.