# Eureka launch values (Admin Apps)

**Repo and bucket both carry these values.** Git is the source of
truth (`apps/<name>/<version>/container-program.json`, this file).
The catalog copies them so a deployer who only has the bucket can:

```
curl -fsSL https://containers.projecteureka.ai/launch.json
curl -fsSL https://containers.projecteureka.ai/jupyter-datascience/2026.08/container-program.json
```

`container-program.json` is what you paste into Admin Apps. `launch.json`
is the same fields for every published app. SIFs stay beside them;
do not mix the HTTPS catalog URL into `filePath`.

Eureka does not take an `apptainer` command line. The host wrapper
(`image/apps/container/start.sh`) always owns binds, `--nv`, and
`DISPLAY`. The operator only fills **Admin Apps** (`ContainerProgram`):

| Admin Apps field | JSON key | What it is |
| --- | --- | --- |
| Container Image / FilePath | `filePath` | POSIX path on vault after [DEPLOY.md](DEPLOY.md) copy |
| App Connect Path | `connectUrl` | OOD `/node/` vs `/rnode/` (see [CONTRACT.md](CONTRACT.md)) |
| Container Arguments | `container_args` | Command **inside** the SIF after `apptainer exec` |

Per-app source of those three values: `apps/<name>/<version>/container-program.json`
(also published next to the SIF). Copy that JSON, do not invent a fourth
AFW property.

`filePath` in git is the **vault convention** `/vault/containers/<name>/<version>/image.sif`.
It is not the HTTPS catalog URL. Catalog URLs live in `recipe.yaml`.

`$PORT`, `$CONFIG_FILE`, `$USER`, `$PASSWORD`, `$HOME`, `$JOBID` are
expanded by the wrapper. Type them with `$` (or `%PORT%` if `$` gets
eaten). Do not hard-code ports.

---

## Register now (HTTP)

These work with today’s `container/start.sh`. Connect is the Admin Apps
path.

| Display name | `filePath` | `connectUrl` | `container_args` |
| --- | --- | --- | --- |
| Jupyter Data Science | `/vault/containers/jupyter-datascience/2026.08/image.sif` | `/login` | `jupyter lab --core-mode --config=$CONFIG_FILE` |
| JupyterLab | `/vault/containers/jupyter/2026.08/image.sif` | `/login` | `jupyter lab --core-mode --config=$CONFIG_FILE` |
| Jupyter PyTorch | `/vault/containers/jupyter-pytorch/2026.08/image.sif` | `/login` | `jupyter lab --core-mode --config=$CONFIG_FILE` |
| Jupyter TensorFlow | `/vault/containers/jupyter-tensorflow/2026.08/image.sif` | `/login` | `jupyter lab --core-mode --config=$CONFIG_FILE` |
| VS Code | `/vault/containers/codeserver/4.96.4/image.sif` | `rnode:/login` | `code-server --bind-addr 0.0.0.0:$PORT --auth password --disable-telemetry` |
| RStudio Server | `/vault/containers/rstudio/2026.08/image.sif` | `rnode:/auth-sign-in` | `/usr/lib/rstudio-server/bin/rserver --www-port=$PORT --www-address=0.0.0.0 --server-user=$USER --auth-none=0 --auth-encrypt-password=0 --auth-pam-helper-path=/usr/lib/rstudio-server/bin/pam-helper --server-data-dir=$HOME/rstudio-$JOBID/data` |
| Terminal | `/vault/containers/terminal/2026.08/image.sif` | `rnode:/` | `ttyd --port $PORT --writable --credential $USER:$PASSWORD bash` |
| Ollama | `/vault/containers/ollama/2026.08/image.sif` | `rnode:/` | `/opt/start-ollama.sh` |
| Open WebUI | `/vault/containers/open-webui/2026.08/image.sif` | `rnode:/` | `/opt/start-open-webui.sh` |
| Pluto.jl | `/vault/containers/pluto/2026.08/image.sif` | `rnode:/` | `/opt/start-pluto.sh` |
| Shiny | `/vault/containers/shiny/2026.08/image.sif` | `rnode:/` | `/opt/start-shiny.sh` |

Jupyter `connectUrl` `/login` → form posts to `/node/<host>/<port>/login`.
`rnode:…` strips the OOD prefix; the process listens at `/`.

`--nv` is not an Admin Apps argument. The wrapper adds it when
`/dev/nvidiactl` exists (PyTorch, TensorFlow, Ollama).

---

## Register later (GUI)

Same JSON shape. Do **not** put these in Admin Apps until the compute
wrapper starts host X (VNC today, Selkies later) and then `exec`s the
SIF. `connectUrl` is empty: Connect is the host display, not an app URL.

| Display name | `filePath` | `connectUrl` | `container_args` |
| --- | --- | --- | --- |
| Spyder | `/vault/containers/spyder/2026.08/image.sif` | *(empty)* | `spyder` |
| ParaView | `/vault/containers/paraview/2026.08/image.sif` | *(empty)* | `paraview` |
| QGIS | `/vault/containers/qgis/2026.08/image.sif` | *(empty)* | `qgis` |
| Octave | `/vault/containers/octave/2026.08/image.sif` | *(empty)* | `octave --gui` |

The SIF command is just the GUI binary. `DISPLAY` and `/tmp/.X11-unix`
come from the host, same as `--nv`.

---

## What not to document as a launch command

- Full `apptainer exec --bind …` lines — wrapper, not Admin Apps
- HTTPS catalog URLs in `filePath`
- Selkies vs VNC flags on the SIF
- A second RStudio or a `ubuntu.sif` terminal
