Skip to content

How to launch multiple entries together

Use a lightweight launcher entry, then let the manifest declare any heavier companions that should start after it is ready. The launcher can be a small splash window or a headless supervisor.

1. Pick a fast launcher entry

Your [run] entry should be the smallest launcher surface that can become ready immediately.

toml
[run]
entry = "apps/launcher/main.aivi"

That launcher can be a simple splash window or a headless Task entry. Keep expensive sources and large module graphs in the entries that come later.

2. Add [[run.launch]] parts

Each [[run.launch]] block describes one extra aivi run child process to start after the launcher is ready.

toml
[run]
entry = "apps/launcher/main.aivi"

[[run.launch]]
label = "Main window"
entry = "apps/ui/main.aivi"

[[run.launch]]
label = "Daemon"
entry = "apps/daemon/main.aivi"

[[run.launch]]
label = "Tray"
entry = "apps/tray/main.aivi"
  • label is shown in the terminal progress tracker.
  • entry is resolved relative to the aivi.toml that supplied [run].
  • view is optional when the child needs a non-default markup value.

3. Run from the workspace root

sh
aivi run

After the launcher is ready, AIVI starts each declared companion as its own child aivi run process. If the launcher has windows, those can present first; if it is headless, the terminal progress tracker becomes the only startup surface.

4. Read the launch tracker

The run tracker keeps a dedicated launch lane for manifest launch parts. Each part moves through:

  • queued
  • starting
  • started
  • failed

This lets one terminal session explain what the launcher is doing without falling back to shell wrappers.

5. Know when it applies

[[run.launch]] belongs to the default [run] workflow. If you invoke one entry directly:

sh
aivi run --path apps/ui/main.aivi
aivi run --app tray

those commands run only the requested entry. They do not inherit the default multi-entry launch fan-out.

(c) 2026 by Andreas Herd