Skip to main content

BioAnchor 🔬⛓️

Permanent, verifiable archiving of Bayesian/MCMC analysis artifacts on Arweave.

PyPI version License: MIT


The Problem

Bayesian and MCMC analyses in computational biology are nearly impossible to reproduce:

  • Raw MCMC chains are large and rarely shared
  • Zenodo, GitHub, and NCBI can delete or restrict data
  • There is no standard for what constitutes a "reproducible" Bayesian analysis artifact
  • Drug discovery and genomics data have provenance and audit requirements that no current tool addresses

The Solution

BioAnchor defines a minimal, standardised manifest of everything needed to verify and re-run a Bayesian analysis, then uploads it to Arweave — a decentralised storage network where data is permanent and immutable.

You do not upload raw data (privacy + cost). You upload:

  • SHA-256 hash of input data (proof of what was used)
  • MCMC configuration: sampler, chains, draws, seed, priors
  • Posterior summary statistics (mean, SD, R̂, ESS)
  • Software environment fingerprint

This is typically < 5 KB — negligible cost on Arweave.

The Arweave TX ID goes into your paper alongside the DOI. Anyone can verify the analysis, check convergence, and reproduce results with the same seed.


Quick Start

pip install bioanchor[all]

With PyMC

import pymc as pm
from bioanchor import BioAnchor

with pm.Model() as model:
    alpha = pm.Normal("alpha", 0, 1)
    beta  = pm.HalfNormal("beta", 1)
    # ... your model ...
    idata = pm.sample(2000, random_seed=42)

ba = BioAnchor(wallet_path="wallet.json")

tx_id = ba.archive_pymc(
    idata=idata,
    model=model,
    seed=42,
    data=X,                                        # numpy array, hashed not uploaded
    data_description="TCGA-BRCA expression matrix (n=500, p=200)",
    data_source="TCGA",
    title="Sparse Bayesian regression for drug target identification",
    authors=["Your Name <you@uni.ac.kr>"],
    domain="drug_discovery",
    tags=["sparse-regression", "drug-target", "tcga"],
)

print(f"https://arweave.net/{tx_id}")
# → Add this URL to your Methods section

CLI

# Generate a manifest template
bioanchor init --output my_analysis.json

# Upload to Arweave (edit the template first)
bioanchor upload --manifest my_analysis.json --wallet wallet.json

# Verify an uploaded manifest
bioanchor verify xK9mP2abc...

# Check wallet balance
bioanchor balance --wallet wallet.json

Development / Testing (no wallet needed)

ba = BioAnchor(mock=True)   # uses MockUploader, prints fake TX ID
tx_id = ba.archive_pymc(idata, seed=42, data=X, title="Test")

Manifest Format

The manifest is a small JSON file (~2–5 KB). This is the core scientific contribution of BioAnchor.

{
  "schema_version": "1.0",
  "bioanchor_version": "0.1.0",
  "created_at": "2026-04-16T09:00:00+00:00",
  "title": "Bayesian dose-response IC50 estimation",
  "authors": ["Author Name"],
  "analysis_type": "MCMC",
  "domain": "drug_discovery",
  "tags": ["dose-response", "ic50", "hill-equation"],
  "software": {
    "language": "Python 3.11.0",
    "packages": { "pymc": "5.9.0", "arviz": "0.18.0", "numpy": "1.26.0" }
  },
  "data": {
    "sha256": "de2fb170...",
    "description": "12-point IC50 curve (log10 μM, % activity)",
    "n_samples": 12,
    "n_features": 2,
    "source": "synthetic"
  },
  "mcmc": {
    "sampler": "NUTS",
    "n_chains": 4,
    "n_draws": 2000,
    "n_warmup": 1000,
    "seed": 42,
    "prior_spec": {
      "log_ic50": "Normal(mu=-0.3, sigma=1.0)",
      "hill_n":   "HalfNormal(sigma=2.0)"
    },
    "posterior_mean": { "log_ic50": -0.31, "ic50": 0.49, "hill_n": 1.79 },
    "posterior_std":  { "log_ic50": 0.09,  "ic50": 0.10, "hill_n": 0.21 },
    "r_hat":          { "log_ic50": 1.001, "ic50": 1.001, "hill_n": 1.003 },
    "ess_bulk":       { "log_ic50": 892.0, "ic50": 887.0, "hill_n": 755.0 },
    "divergences": 0,
    "acceptance_rate": 0.93
  }
}

Why Arweave?

Storage Permanent? Immutable? Decentralised?
GitHub ✗ (account deletion) ✗ ✗
Zenodo ✗ (operator control) ✗ ✗
IPFS ✗ (requires pinning) ✓ ✓
Arweave ✓ (mathematical guarantee) ✓ ✓

Arweave's endowment model guarantees storage for a minimum of 200 years. A 5 KB manifest costs ~$0.0001 USD to archive permanently.


Arweave Wallet Setup

  1. Go to arweave.app and generate a wallet
  2. Download the JWK JSON file (wallet.json)
  3. Fund with a small amount of AR (~0.01 AR is enough for thousands of uploads)
  4. Use bioanchor balance --wallet wallet.json to check

For testnet experimentation, use Irys devnet.


Supported Integrations

Framework Status
PyMC 5.x ✅ Full integration
ArviZ ✅ (via PyMC)
Stan/CmdStanPy 🔜 Planned
NumPyro 🔜 Planned
R (rstan) 🔜 Planned

Citing This Tool

If you use BioAnchor in your research, please cite:

[Paper citation — in preparation]

And add to your Methods section:

"MCMC analysis artifacts (manifest, posterior summary, and software environment) were permanently archived on the Arweave network using BioAnchor v0.1.0 (TX ID: https://arweave.net/YOUR_TX_ID)."


License

MIT License. See LICENSE.

Metadata

Release files for bioanchor 0.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for bioanchor 0.1.0
File Size Uploaded
bioanchor-0.1.0.tar.gz 12.8 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for bioanchor 0.1.0
File Interpreter ABI Platform
bioanchor-0.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 24.8 kB

Release files / bioanchor-0.1.0.tar.gz

Download URL bioanchor-0.1.0.tar.gz
Size 12.8 kB
Tags Source
SHA-256 checksum
How to use checksums
f743bd8c1692766904174308c43bd8326f5dba3b9742a7afb4e6b23102af26f5
BLAKE2b-256 checksum
How to use checksums
1669dfe199cbd15a5607040313df8f29f6a8fc55fb88238c8e2af286cb9077b6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.11.9

Release files / bioanchor-0.1.0-py3-none-any.whl

Download URL bioanchor-0.1.0-py3-none-any.whl
Size 12.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
c08e8e8f5680c2add4cbf29399ea20a3b9baf25de01c3823f096149afe256be8
BLAKE2b-256 checksum
How to use checksums
2b377c8816abac8301a9f572a8a0b6c91dd4e6ba2a6c9cfd024158511d9198c0
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.11.9

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page