Skip to content

Commit ce4ad6d

Browse files
authored
Merge pull request #76 from logannye/docs/relaunch-landing-readme
docs: landing page + README freshness
2 parents e3e593e + f9cefa7 commit ce4ad6d

4 files changed

Lines changed: 124 additions & 6 deletions

File tree

.github/workflows/pages.yml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,9 @@ jobs:
3838
- uses: actions/configure-pages@v5
3939
- uses: actions/upload-pages-artifact@v3
4040
with:
41-
path: web/verify
41+
# Publish the whole site: web/index.html is the landing page (root),
42+
# web/verify/ is the in-browser verifier (built into web/verify/pkg above).
43+
path: web
4244

4345
deploy:
4446
needs: build

README.md

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
[![crates.io](https://img.shields.io/crates/v/rosalind-bio?logo=rust&label=crates.io&color=orange)](https://crates.io/crates/rosalind-bio)
66
[![Output: byte-reproducible](https://img.shields.io/badge/output-byte--reproducible-brightgreen)](CONTRACT.md)
77
[![License: MIT OR Apache-2.0](https://img.shields.io/badge/license-MIT%20OR%20Apache--2.0-blue)](#license)
8-
[![Verify a receipt (live)](https://img.shields.io/badge/demo-verify%20a%20receipt-2f81f7)](https://logannye.github.io/rosalind/)
8+
[![Verify a receipt (live)](https://img.shields.io/badge/demo-verify%20a%20receipt-2f81f7)](https://logannye.github.io/rosalind/verify/)
99

1010
**A deterministic, low-memory genomics engine in Rust, built around a different promise: memory is a contract — you see it before you commit, and verify it after.**
1111

@@ -92,6 +92,7 @@ You'll see `plan` predict `[FITS]`, `variants --enforce` print `contract: OK —
9292
- **Truth-set evaluation**`rosalind eval-germline` / `rosalind eval-somatic` compare a call set against a truth VCF over confident regions (BED), with variant normalization (left-align + trim) and precision / recall / F1. `eval-germline` is the drop-in interface for a GIAB benchmark.
9393
- **Extensibility** — Build custom bounded per-locus analytics by implementing one trait ([ColumnKit](#columnkit-implement-one-trait-inherit-the-contract); see [`examples/columnkit_coverage.rs`](examples/columnkit_coverage.rs)) — inheriting bounded memory, determinism, and a verifiable receipt for free. Or iterate the raw `PileupColumn` substrate directly ([`examples/custom_pileup_analytics.rs`](examples/custom_pileup_analytics.rs)).
9494
- **Determinism by design** — Primary artifacts are emitted in a canonical, stable order, byte-for-byte identical across repeated runs given identical inputs. See [`docs/determinism.md`](docs/determinism.md).
95+
- **A self-scrutinizing claims harness**`bash benchmarks/run.sh` re-derives five contract + reproducibility properties on bundled data (predicted ≥ realized peak; honor-or-refuse; byte-identical output; `reproduce` + tamper-evidence; `pack`), each of which **fails the run if false**. It runs in CI, so a broken claim turns the build red. Re-run it yourself — don't trust the numbers. See [`benchmarks/`](benchmarks/).
9596

9697
## Why it matters
9798

@@ -162,7 +163,7 @@ pack: 37 job(s) → 3 node(s) of 64000 MiB — every node within capacity by pre
162163
163164
## Reproduce a result — a command a stranger can run
164165
165-
> 🔍 **Try it in your browser:** [**verify a receipt live**](https://logannye.github.io/rosalind/) — drag in a `*.manifest.json` (or edit one byte of the bundled sample) and watch its tamper-evident hash flip to **TAMPERED**. 100% client-side, running the same Rust check that ships in the CLI, compiled to wasm.
166+
> 🔍 **Try it in your browser:** [**verify a receipt live**](https://logannye.github.io/rosalind/verify/) — drag in a `*.manifest.json` (or edit one byte of the bundled sample) and watch its tamper-evident hash flip to **TAMPERED**. 100% client-side, running the same Rust check that ships in the CLI, compiled to wasm.
166167
167168
Hand someone a `*.vcf` and its `*.manifest.json`. On a *different machine*, with one offline command, they re-derive it byte-for-byte — no GATK, no Docker, no Nextflow, no re-aligning:
168169
@@ -243,7 +244,7 @@ Target architecture and per-phase specs/plans live in [`docs/superpowers/specs/`
243244
## Install & build
244245

245246
### Prerequisites
246-
- Rust 1.72+ (`rustup` recommended)
247+
- Rust 1.83+ (the crate's MSRV; `rustup` recommended)
247248
- Native compression headers for BAM I/O: `libbz2-dev` & `liblzma-dev` on Debian/Ubuntu, `brew install bzip2 xz` on macOS
248249
- Python 3.9+ with `numpy` for the feature-substrate boundary (`python/rosalind.py`); the optional legacy PyO3 bindings additionally need `maturin` (set `PYO3_PYTHON=/path/to/python` if the default interpreter is unsuitable)
249250

@@ -256,10 +257,10 @@ cargo test # run the full suite
256257
cargo run --release -- --help
257258
```
258259

259-
Use Rosalind as a library in another crate:
260+
Use Rosalind as a library in another crate (the crate is `rosalind-bio`; the library you `use` is `rosalind`):
260261
```toml
261262
[dependencies]
262-
rosalind = { path = "./rosalind" }
263+
rosalind-bio = "0.1" # then in code: use rosalind::{ ... };
263264
```
264265

265266
Bundled sample data lives in `examples/data/` (small FASTA/FASTQ + alignments) so the commands below run without external downloads. For a larger, deterministic toy dataset:

web/index.html

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
<!doctype html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="utf-8" />
5+
<meta name="viewport" content="width=device-width, initial-scale=1" />
6+
<title>Rosalind — memory is a contract</title>
7+
<meta name="description" content="A deterministic, low-memory genomics engine in Rust. Declare your RAM; it proves the job fits before it runs, never silently OOM-kills you, and emits a receipt anyone can reproduce byte-for-byte." />
8+
<style>
9+
:root { color-scheme: dark; }
10+
* { box-sizing: border-box; }
11+
body {
12+
margin: 0; padding: 3rem 1.25rem 5rem;
13+
font: 16px/1.6 ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
14+
background: #0b0e14; color: #c9d1d9; display: flex; flex-direction: column; align-items: center;
15+
}
16+
main { width: 100%; max-width: 760px; }
17+
.eyebrow { color: #8b949e; letter-spacing: .08em; text-transform: uppercase; font-size: .8rem; margin: 0 0 .5rem; }
18+
h1 { font-size: 2.4rem; line-height: 1.15; margin: 0 0 .75rem; color: #f0f6fc; }
19+
h1 .accent { color: #2f81f7; }
20+
.lede { font-size: 1.15rem; color: #c9d1d9; margin: 0 0 1.5rem; }
21+
.install {
22+
background: #0d1117; border: 1px solid #30363d; border-radius: 10px; padding: 1rem 1.1rem; margin: 0 0 1rem;
23+
font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; font-size: .92rem;
24+
}
25+
.install .c { color: #56d364; }
26+
.install .muted { color: #8b949e; }
27+
.cta { display: flex; gap: .6rem; flex-wrap: wrap; margin: 1.25rem 0 2.5rem; }
28+
.btn {
29+
text-decoration: none; border-radius: 8px; padding: .55rem 1rem; font-weight: 600; font-size: .95rem;
30+
border: 1px solid #30363d; color: #c9d1d9; background: #161b22;
31+
}
32+
.btn.primary { background: #1f6feb; border-color: #1f6feb; color: #fff; }
33+
.btn:hover { filter: brightness(1.15); }
34+
h2 { font-size: 1.05rem; color: #f0f6fc; margin: 2.25rem 0 .6rem; }
35+
.verbs { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: .75rem; margin: 0 0 1rem; }
36+
.verb { background: #0d1117; border: 1px solid #21262d; border-radius: 8px; padding: .8rem .9rem; }
37+
.verb b { color: #f0f6fc; display: block; }
38+
.verb span { color: #8b949e; font-size: .88rem; }
39+
.pillars { list-style: none; padding: 0; margin: 0; }
40+
.pillars li { padding: .5rem 0; border-top: 1px solid #21262d; }
41+
.pillars li:first-child { border-top: none; }
42+
.pillars b { color: #f0f6fc; }
43+
.demos { display: flex; gap: .6rem; flex-wrap: wrap; }
44+
.demos a { color: #2f81f7; text-decoration: none; border: 1px solid #21262d; border-radius: 8px; padding: .5rem .8rem; font-size: .92rem; }
45+
.demos a:hover { border-color: #2f81f7; }
46+
.scope { margin-top: 2.5rem; padding: 1rem 1.1rem; border: 1px solid #21262d; border-radius: 8px; background: #0d1117; font-size: .9rem; color: #8b949e; }
47+
.scope b { color: #c9d1d9; }
48+
code { background: #161b22; padding: .08em .35em; border-radius: 4px; font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; font-size: .9em; }
49+
footer { margin-top: 2.5rem; color: #6e7681; font-size: .85rem; }
50+
a { color: #2f81f7; }
51+
</style>
52+
</head>
53+
<body>
54+
<main>
55+
<p class="eyebrow">A genomics engine in Rust</p>
56+
<h1>Memory is a <span class="accent">contract</span>.</h1>
57+
<p class="lede">
58+
Most variant callers spend memory that grows with your data, so <em>“will this finish on my
59+
machine?”</em> is something you find out the hard way. Rosalind declares the RAM you have, proves
60+
the job fits <strong>before it runs</strong>, never silently OOM-kills you, and emits a receipt
61+
anyone can reproduce <strong>byte-for-byte</strong>.
62+
</p>
63+
64+
<div class="install">
65+
<span class="c">cargo install rosalind-bio</span><br>
66+
<span class="muted"># the crate is rosalind-bio; the installed binary is `rosalind`</span><br><br>
67+
<span class="muted"># or grab a prebuilt binary — no toolchain (macOS · Linux):</span><br>
68+
<span class="c">curl -fsSL https://raw.githubusercontent.com/logannye/rosalind/main/install.sh | sh</span>
69+
</div>
70+
71+
<div class="cta">
72+
<a class="btn primary" href="./verify/">🔍 Verify a receipt in your browser →</a>
73+
<a class="btn" href="https://github.com/logannye/rosalind">GitHub</a>
74+
<a class="btn" href="https://crates.io/crates/rosalind-bio">crates.io</a>
75+
<a class="btn" href="https://docs.rs/rosalind-bio">docs.rs</a>
76+
</div>
77+
78+
<h2>The contract, in four verbs</h2>
79+
<div class="verbs">
80+
<div class="verb"><b>Declare</b><span>State the RAM you have.</span></div>
81+
<div class="verb"><b>Predict</b><span><code>plan</code> reads the index header — no run — and tells you if it fits.</span></div>
82+
<div class="verb"><b>Honor</b><span><code>--enforce</code> refuses up front or fails loud. Never a silent OOM.</span></div>
83+
<div class="verb"><b>Verify</b><span>A BLAKE3 receipt re-checks the run, offline, months later.</span></div>
84+
</div>
85+
86+
<h2>Why it's different</h2>
87+
<ul class="pillars">
88+
<li><b>Bounded, predictable memory.</b> Peak tracks local read depth, not file size — and the realized peak is recorded, so the bound is <em>verifiable, not just claimed</em>.</li>
89+
<li><b>Byte-for-byte reproducible.</b> Identical inputs → an identical VCF + a content-addressed receipt. <code>rosalind reproduce</code> re-derives a result offline — something a non-deterministic caller can't do.</li>
90+
<li><b>Honest about uncertainty.</b> Where the evidence is too thin, it <strong>abstains</strong> instead of guessing — and every claim it makes is a re-runnable check.</li>
91+
</ul>
92+
93+
<h2>See it for yourself</h2>
94+
<p class="demos">
95+
<a href="./verify/">Drag in a receipt → watch tampering get caught (in-browser)</a>
96+
<a href="https://github.com/logannye/rosalind#reproduce-a-result--a-command-a-stranger-can-run">Reproduce a result, offline</a>
97+
<a href="https://github.com/logannye/rosalind/tree/main/benchmarks">Re-run the claims harness</a>
98+
</p>
99+
100+
<div class="scope">
101+
<b>Honest scope.</b> Today: bounded whole-genome <b>germline SNV</b> calling over a sorted BAM + a portable index,
102+
a reproducible feature substrate for ML, and the verifiable memory contract — <b>single-threaded</b>, with accuracy
103+
measured on <b>simulated</b> diploid truth so far (a real GIAB benchmark is next). <b>Building toward:</b> extending the
104+
same contract to index <em>construction</em> along a sublinear-space (~√t) curve, so “declare your RAM and it's honored”
105+
holds end to end. It's a Rust <b>library + CLI</b> — not a black-box pipeline.
106+
</div>
107+
108+
<footer>
109+
Built for edge, field, and large-genome work where RAM is fixed and an OOM at hour 20 is unacceptable.
110+
Dual-licensed MIT OR Apache-2.0 · <a href="https://github.com/logannye/rosalind">github.com/logannye/rosalind</a>
111+
</footer>
112+
</main>
113+
</body>
114+
</html>

web/verify/index.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@
5353
</head>
5454
<body>
5555
<main>
56+
<p style="margin:0 0 1rem"><a href="../" style="color:#8b949e;text-decoration:none">← Rosalind</a></p>
5657
<h1>Verify a Rosalind receipt</h1>
5758
<p class="tag">
5859
Drag in (or paste) a <code>*.manifest.json</code> and this checks its tamper-evident

0 commit comments

Comments
 (0)