igvprox is a small Go service for viewing genomics data on a remote HPC cluster through a local web browser.
You run igvprox on the cluster against one or more files or directories. It binds an HTTP server to a UNIX socket, and you expose that server locally with SSH port forwarding. The browser then loads a minimal igv.js page from the proxy and streams the selected tracks through range requests.
This is designed for the common case where the data should stay on-cluster and the user already has SSH access.
- Serves a minimal
igv.jspage for an ephemeral viewing session - Discovers genomics files from CLI-provided paths
- Supports optional recursive directory scanning
- Sorts tracks by full file path
- Serves only the discovered files and their indexes
- Listens on a UNIX socket instead of a public TCP port on the cluster
Phase 1 support is aimed at these common file types:
BAMwith.baiCRAMwith.craiVCF.gzwith.tbior.csiBED.gzwith.tbior.csiBedGraphas.bedgraph.gzor.bg.gzwith.tbior.csiBigWig/.bwBigBed/.bb- plain
BED - plain
SAM
Notes:
- Indexed formats require an index by default.
BigWigandBigBedare treated as self-indexed.- Plain
BEDand plainSAMare recognized, but they do not have the same indexing behavior as compressed or binary formats and may not perform well.
igvprox uses a single top-level Makefile.
make buildThe binary is written to:
bin/igvprox
Run tests with:
make testServe everything directly under output/:
./bin/igvprox output/Serve recursively under output/:
./bin/igvprox -R output/Serve a specific set of files:
./bin/igvprox sample1.bam sample2.bam cohort.vcf.gzOverride the reference genome for one session:
./bin/igvprox -g hg19 -R output/Override the socket path:
./bin/igvprox -s /tmp/igvprox.sock -R output/Allow indexed formats without a discovered index:
./bin/igvprox --allow-missing-index output/On the HPC cluster:
./bin/igvprox -R output/By default the server listens on:
$XDG_RUNTIME_DIR/igvprox.sockwhenXDG_RUNTIME_DIRexists- otherwise
/tmp/igvprox-$UID.sock
From your local machine, forward a local port to the remote UNIX socket:
ssh -L 5000:/tmp/igvprox-$(id -u).sock user@clusterThen open:
http://localhost:5000
If the socket path is different, forward that path instead.
igvprox [flags] <path> [<path> ...]
Flags:
-R,--recursive: recursively scan directory arguments-g,--genome <id>: override the reference genome-s,--socket <path>: set the UNIX socket path--config <path>: load a config file from an explicit path--allow-missing-index: do not reject missing sidecar indexes-v,--verbose: enable verbose logging--open-browser-url <url>: override the printed browser URL hint
Defaults:
- genome:
hg38 - browser URL hint:
http://localhost:5000 - recursion: off
- sorting: ascending full path
Config lookup order:
--config <path>~/.config/igvprox/config.toml~/.igvproxrc
Supported config keys:
genome = "hg38"
browser_url = "http://localhost:5000"
socket_path = ""
allow_missing_index = falseIf socket_path is empty, the runtime default socket path is used.
The server exposes a minimal internal API:
GET /: embeddedigv.jspageGET /api/session: JSON session manifestGET /files/<id>/data: data file endpointGET /files/<id>/index: index file endpoint
The proxy serves only the files discovered from the command line inputs. It does not expose arbitrary file-system access.
The repository includes a GitHub Actions workflow that builds the binary for:
linux/amd64linux/arm64
The workflow runs on:
- pushes to
main - pull requests
The current implementation is intentionally small:
- single-user
- ephemeral session
- one process started manually over SSH
- minimal browser UI
Desktop IGV session export and richer session management can be added later on top of the same discovery and file-serving model.