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 | 8080 |
The fastest way to get all three environments running locally:
# Clone and start
git clone https://github.com/man4ish/omnibioai-launcher.git
cd omnibioai-launcher
docker-compose up -d| Service | URL | Default credential |
|---|---|---|
| JupyterLab | http://localhost:8888 | token: omnibioai |
| RStudio | http://localhost:8787 | password: omnibioai |
| VS Code Server | http://localhost:8080 | password: omnibioai |
Stop all services:
docker-compose downOverride credentials or data paths with environment variables:
JUPYTER_TOKEN=mysecret OMNIBIOAI_DATA_DIR=/data/myproject docker-compose up -dThe Launcher UI is a React single-page app served on port 5190.
With a running backend:
cp .env.example .env # fill in REACT_APP_OMNIBIOAI_BASE_URL and token
npm install
npm start # dev server at http://localhost:3000Via Docker:
docker build -t omnibioai-launcher .
docker run -p 5190:5190 omnibioai-launcherDirect 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: docker-compose up/down
- 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.
| 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 |
POST |
/api/dev/launch/rstudio/ |
Signal backend to open RStudio after R script download |
| 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>.
Pre-built images are published to the GitHub Container Registry:
ghcr.io/man4ish/omnibioai-jupyter:1.0
ghcr.io/man4ish/omnibioai-rstudio:1.0
ghcr.io/man4ish/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/man4ish/omnibioai-${tool}:1.0 \
-f docker/${tool}/Dockerfile docker/${tool}/
docker push ghcr.io/man4ish/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 for all API requests |
REACT_APP_JUPYTER_BASE |
http://127.0.0.1:8890 |
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 |
| 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 |
cp .env.example .env # edit variables for your local setup
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,
so the OmniBioAI backend must be running locally during development.
Production 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
├── docker-compose.yml — IDE services orchestration
├── .env.example
├── package.json
├── nginx.conf
└── Dockerfile — Launcher UI (React → nginx)
Apache License 2.0