|
| 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> |
0 commit comments