README last reviewed: 2026-08-24
A browser-based gateway to interactive analysis environments for the OmniBioAI platform. The launcher operates in two independent modes: opening a specific registry object in your preferred IDE, and starting/stopping long-running IDE services backed by Docker containers.
This repository is intentionally separate from omnibioai-sdk, the pure Python API client. The launcher is the browser entry point; the SDK is for programmatic use inside notebooks and scripts.
| Mode | What it does |
|---|---|
| Object Launch | Browse the registry, select an object, open it in JupyterLab, VS Code, or RStudio with context pre-loaded |
| IDE Services | Start / stop containerised JupyterLab, RStudio, and VS Code Server from the Launcher UI |
The two modes are independent — IDE Services can be used without an object context, and Object Launch works with any running JupyterLab instance.
| Environment | Description | Default port |
|---|---|---|
| JupyterLab | Full bioinformatics kernel (scanpy, DESeq2, scVelo, cellxgene …) | 8888 |
| RStudio | R with Bioconductor — Seurat, DESeq2, scran, monocle3, tidyverse | 8787 |
| VS Code Server | Python + R + Nextflow + WDL extensions, all packages from above | 8083 |
The Launcher is managed automatically by OmniBioAI Studio. No manual startup required — it starts with the full stack:
cd ~/Desktop/machine/omnibioai-studio
docker compose up -d launcherAccess at: http://localhost/_svc/sdk (via nginx, JWT required)
Direct access (localhost only): http://localhost:5190
The Launcher backend API runs on port 3001 internally. IDE container lifecycle (start/stop/status) is handled via the Docker socket — no additional configuration needed.
The supported full-stack deployment is managed by OmniBioAI Studio. Studio owns the IDE containers and supplies the Docker socket access required by the Launcher lifecycle API.
cd ~/Desktop/machine/omnibioai-studio
docker compose up -d launcher| Service | URL | Default credential |
|---|---|---|
| JupyterLab | http://localhost:8888 | token: $JUPYTER_TOKEN (set in .env) |
| RStudio | http://localhost:8787 | password: $RSTUDIO_PASSWORD (set in .env) |
| VS Code Server | http://localhost:8083 | password: $VSCODE_PASSWORD (set in .env) |
The Launcher container exposes its browser UI on port 5190 and its internal
Express lifecycle API on port 3001. The API is reached through nginx at
/api/launcher/*; port 3001 is not the public UI port.
Change JUPYTER_TOKEN, RSTUDIO_PASSWORD, VSCODE_PASSWORD, and data/work
directory variables in the Studio environment before deployment. Do not use
the development defaults in a shared or production environment.
The Launcher UI is a React single-page app served on port 5190.
With a running backend:
npm install
REACT_APP_OMNIBIOAI_BASE_URL=http://127.0.0.1:8000 \
REACT_APP_OMNIBIOAI_TOKEN=dev \
npm start # dev server at http://localhost:3000Create a local .env.local instead if you do not want to put credentials in
the shell command. This repository does not currently include a committed
.env.example file.
Via Docker:
docker build -t omnibioai-launcher .
docker run \
-p 5190:5190 \
-v /var/run/docker.sock:/var/run/docker.sock \
omnibioai-launcherThe Docker socket mount is required only for IDE Services start/stop/status operations. It grants the container substantial control over the host Docker daemon; omit the lifecycle API or use the Studio-managed deployment when that trust boundary is not acceptable.
Direct link from any page:
<a href="http://127.0.0.1:5190/?object_id=56d3fc3a-709b-4ed0-bf17-8cb73c6746b0">Analyze</a>If no object_id is given, the app opens a searchable registry list. Selecting an object
shows a detail view (metadata, lineage, job log) and a button to open it in an environment.
Base image: jupyter/datascience-notebook:latest
Python — scanpy, anndata, scVelo, squidpy, pyDEA, gseapy, biopython, pysam, cellxgene, leidenalg, harmonypy, decoupler, pydeseq2, omnipath
R / Bioconductor (via conda) — DESeq2, edgeR, limma, Seurat
Base image: rocker/rstudio:4.3.2
Bioconductor — DESeq2, edgeR, limma, Seurat, clusterProfiler, EnhancedVolcano, ComplexHeatmap, SingleCellExperiment, scran, scater, monocle3
CRAN — tidyverse, ggplot2, pheatmap, RColorBrewer, patchwork, cowplot
Base image: codercom/code-server:latest
Extensions — ms-python.python, REditorSupport.r, nextflow-io.nf-lang, broadinstitute.wdl
Python packages — scanpy, anndata, scVelo, pydeseq2, gseapy, biopython, pysam
OmniBioAI Studio
|
Launcher UI (React, port 5190)
|
┌───┴──────────────────────────┐
│ Object Launch │ IDE Services
│ (registry object context) │ (container lifecycle)
└───┬──────────────────────────┘
| |
Open object in: browser / desktop host
- JupyterLab (URL + token) GET /api/launcher/status/{tool}
- VS Code (env var copy) POST /api/launcher/start/{tool}
- RStudio (.R download) POST /api/launcher/stop/{tool}
The IdeCard component in the Launcher UI polls GET /api/launcher/status/{tool} every
5 seconds. Clicking Launch calls POST /api/launcher/start/{tool}, polls until the
container reports running, then opens the service URL in a new tab. A Stop button
appears while the container is running. The Express server talks directly to the
Docker socket; it does not proxy object-registry requests.
In production the Launcher is accessed via nginx:
http://localhost/_svc/sdk → launcher:5190 (JWT required)
The /api/launcher/* endpoints are proxied to the Express backend
on port 3001 inside the container.
| Method | Endpoint | Purpose |
|---|---|---|
GET |
/api/dev/objects/ |
Paginated object list (search, type filters) |
GET |
/api/dev/objects/{id}/ |
Single object detail |
GET |
/api/dev/objects/?parent_id={id} |
Children / siblings for lineage view |
Object details can also generate and download an R starter script in the browser. The current frontend does not call a separate RStudio launch API.
| Method | Endpoint | Purpose |
|---|---|---|
GET |
/api/launcher/status/{tool} |
Container status (running / starting / stopped) |
POST |
/api/launcher/start/{tool} |
Start the IDE container |
POST |
/api/launcher/stop/{tool} |
Stop the IDE container |
{tool} is one of jupyter, rstudio, vscode.
All requests carry Authorization: Bearer <token>.
The Studio deployment may use pre-built images published to the GitHub Container Registry:
ghcr.io/omnibioai/omnibioai-jupyter:1.0
ghcr.io/omnibioai/omnibioai-rstudio:1.0
ghcr.io/omnibioai/omnibioai-vscode:1.0
To rebuild and push:
export CR_PAT=$(gh auth token)
echo $CR_PAT | docker login ghcr.io -u man4ish --password-stdin
for tool in jupyter rstudio vscode; do
docker build \
-t ghcr.io/omnibioai/omnibioai-${tool}:1.0 \
-f docker/${tool}/Dockerfile docker/${tool}/
docker push ghcr.io/omnibioai/omnibioai-${tool}:1.0
done| Variable | Default | Purpose |
|---|---|---|
REACT_APP_OMNIBIOAI_BASE_URL |
http://127.0.0.1:8000 |
OmniBioAI backend API base URL |
REACT_APP_OMNIBIOAI_TOKEN |
dev |
Bearer token compiled into API requests |
REACT_APP_JUPYTER_BASE |
http://127.0.0.1:8888 |
JupyterLab host for object-launch URL |
REACT_APP_JUPYTER_TOKEN |
devtoken |
JupyterLab auth token (?token=) |
REACT_APP_USE_MOCK |
false |
Use hardcoded mock data without a backend |
These values are embedded by Create React App during npm run build; setting
them in a runtime container environment after the build does not change the
already-generated JavaScript. In particular, any
REACT_APP_OMNIBIOAI_TOKEN is recoverable by anyone who can download the
bundle. Never compile a privileged or production secret into the frontend.
| Variable | Default | Purpose |
|---|---|---|
JUPYTER_TOKEN |
omnibioai |
JupyterLab authentication token |
RSTUDIO_PASSWORD |
omnibioai |
RStudio login password |
VSCODE_PASSWORD |
omnibioai |
VS Code Server login password |
OMNIBIOAI_DATA_DIR |
./data |
Host path mounted as /data in all containers |
OMNIBIOAI_WORK_DIR |
./work |
Host path mounted as /work in all containers |
Security note:
JUPYTER_TOKEN,RSTUDIO_PASSWORD, andVSCODE_PASSWORDdefault toomnibioai. Change these inomnibioai-studio/.envbefore production use.
npm install
npm start # dev server on http://localhost:3000The proxy field in package.json forwards /api/* calls to
http://127.0.0.1:8000, but the application normally uses the absolute
REACT_APP_OMNIBIOAI_BASE_URL value. Configure that value for the API Gateway
or backend you actually intend to use.
Run the test command with:
npm testProduction build:
npm run build
# serve the build/ output with any static file server
npx serve -s build -l 5190Launcher Docker image (nginx, port 5190):
docker build -t omnibioai-launcher .
# Override backend at build time
docker build \
--build-arg REACT_APP_OMNIBIOAI_BASE_URL=https://api.omnibioai.com \
--build-arg REACT_APP_OMNIBIOAI_TOKEN=mytoken \
-t omnibioai-launcher .
docker run -p 5190:5190 omnibioai-launcherSet REACT_APP_USE_MOCK=true (or pass ?object_id=test in the URL) to run entirely on
hardcoded data without a backend. Useful for UI development and screenshots.
omnibioai-launcher/
├── docker/
│ ├── jupyter/
│ │ └── Dockerfile — JupyterLab + bioinformatics packages
│ ├── rstudio/
│ │ └── Dockerfile — RStudio + Bioconductor stack
│ └── vscode/
│ └── Dockerfile — VS Code Server + Python/R/workflow extensions
├── src/
│ ├── App.jsx — View logic: list, detail, launcher
│ ├── App.css — Dark-theme styles
│ ├── index.js — React root mount
│ └── components/
│ ├── EnvCard.jsx — Clickable environment tile (object launch)
│ ├── IdeCard.jsx — IDE service card with status polling
│ ├── ObjectCard.jsx — Object metadata display
│ ├── InstallModal.jsx — Fallback modal when desktop app not found
│ └── Toast.jsx — Ephemeral status notification
├── public/
│ └── index.html
├── server.js — Express backend (port 3001): /api/launcher/*
│ (Docker socket container lifecycle)
├── package.json
├── nginx.conf
└── Dockerfile — Launcher UI (React → nginx)
| Service | Role |
|---|---|
omnibioai-studio |
Manages Launcher container lifecycle |
omnibioai |
Workbench backend — object registry API |
omnibioai-api-gateway |
JWT enforcement on /_svc/sdk |
omnibioai-control-center |
Health monitoring (launcher:5190) |
omnibioai-sdk |
Python SDK client — programmatic alternative to Launcher UI |
Apache License 2.0