    # env/requirements.txt
    # scientific computing stack
    # We pin numpy because transformers lib cannot yet use 2.0
    # numpy>=1.26.0
    # numpy>=2.2.6
    # numpy<2.3

    pandas>=2.1.1
    pyarrow>=15.0.0

    #polars
    openpyxl>=3.1.2
    # xlrd with pandas
    xlrd>= 2.0.1
    # pyreader use with RDS
    pyreadr>=0.4.9
    # pure-python .Rdata reader (pyreadr fails on some serialized R objects,
    # e.g. the Nadal-Ribelles 2025 fcs/ptbs lists); needs no R install
    rdata>=1.1.0
    scipy>=1.11.4
    networkx>=3.2.1
    #dask
    umap-learn>=0.5.3
    # ? not sure which versoin
    hypernetx>=2.3.10
    # chemistry: InChIKey from SMILES in torchcell/datamodels/compound_identity.py
    # (was installed by hand on GilaHyper only; CI failed 15 tests without it)
    rdkit>=2026.3.6
    
    # configuration
    hydra-core>=1.3.2
    deepdiff>=7.0.1

    # torch stack
    # best to install manual (see env/requirements_dependent.txt for torch-scatter)
    torch>=2.11.0
    torch_geometric>=2.8.0
    torchmetrics>=1.2.1
    lightning>=2.4.0
    # torch-scatter installed post-torch from the PyG wheel index; see requirements_dependent.txt

    # visualization stack and logging
    wandb>=0.22.0
    wandb_osh>=1.2.2
    matplotlib>=3.9  # boxplot(tick_labels=); the labels keyword was removed in 3.11
    # adjustTest used with with matplotlib
    adjustText>=0.8
    #pydot Don't think I am using this... outdate
    pydot>=1.4.2
    # pygraphviz don't think I am using this
    # graphviz don't think I am using this.
    # graphviz
    plotly>=5.18.0
    seaborn>=0.12.2
    matplotlib-venn>=1.1.2 # limited usage for experiments/

    # ML stack
    scikit-learn>=1.2.2
    scikit-image>=0.22  # torchcell/sga watershed colony segmentation
    geomloss>=0.2.6

    # Transformer / Huggingface Stack
    transformers>=4.55.4
    ## used with protT5 model
    sentencepiece>=0.1.99

    # Bio stack
    biopython>=1.81
    goatools>=1.3.1
    intermine>=1.13.0
    gffutils>=0.12
    GEOparse>=2.0.4

    # stubs and types
    pandas-stubs>=2.0.3.230814
    types-tqdm>=4.65.0.2
    types-requests>= 2.31.0.2

    # data stack
    sortedcontainers>=2.4.0
    attrs>=23.1.0
    pydantic>=2.8.2
    h5py>=3.9.0
    # R is needed for installation. This creates issues.
    #rpy2>=3.5.16 # needed for mechanistic aware. can probably get rid of.


    # database stack
    lmdb>=1.4.1
    filelock>=3.20.1


    # web stack
    aiohttp>=3.8.5

    # ontology stack
    pronto>=2.5.4
    nxontology>=0.5.0
    owlready2>=0.45


    # Workspace
    python-dotenv>=1.0.0

    # dev-tools
    python-semantic-release>=9.0.3
    pre-commit>=3.3.3
    # ptpython>=3.0.23
    pip-tools>=7.1.0
    snakeviz>=2.2.0
    twine>=4.0.2
    memory-profiler>=0.61.0

    # biocypher (stock upstream on PyPI; fork Mjvolk3/biocypher retired 2026-07,
    # its only patch — an import_call_file_prefix auto-join — is now handled by
    # dropping that config key so the absolute output_directory is used verbatim)
    biocypher==0.15.2

    # neo4j
    neo4j>=4.4.11,<5.0

    # command line
    cliff>=4.5.0

    # twine cannot handle these
    # Not allowed in Pypi
    # CaLM@git+https://github.com/oxpig/CaLM@main

    # GEM
    cobra>=0.29.1

    # Hypergraph - fastjsonschema needed as extra dep for hypernetx
    hypernetx>=2.3.10
    fastjsonschema>=2.21.1

    #typing?
    beartype

    # Literature / Zotero capture pipeline (MinerU OCR runs in the separate
    # swanki-mineru env, so mineru is NOT listed here)
    pyzotero>=1.5.0
    # Read/write the Dendron bibliography (torchcell/literature/bib.py). pyzotero
    # already pulls it in for format="bibtex", but we import it directly.
    bibtexparser>=1.4,<2

    # Keyed read-only endpoint serving the OCR literature mirror (issue #20)
    fastapi>=0.115
    uvicorn[standard]>=0.30
    unidecode>=1.3.0