Interactive demos

Everything below runs entirely in your browser — no server. The forecasting code is a faithful JavaScript port of the Python package, verified to agree to 1e-6 by the parity suite.

Live JavaScript forecasting race →

Race the actual skaters JS port against the npm forecasting ecosystem — arima and @bsull/augurs (ETS), plus classical baselines — on 150 real FRED series, live in your browser. A whole-universe win-rate sweep, a single-series drill-down, and a run-forever tournament that keeps drawing random series and charts each method's win-rate against its compute cost relative to laplace.

Forecasting playground →

Pick a policy and a data regime; watch the one-step-ahead forecast and its uncertainty band update live, with rolling log-likelihood and coverage. Native JavaScript — instant and offline.

Running normalization →

One ugly stream, two normalizers. A rolling z-score smears, fattens, and scars; laplace's calibration state turns the same points into the same N(0,1) bell every time — and anything with |z| > 4 earned it.

The Rosenblatt bijection →

The commutative diagram, computed live: upstairs the raw series trends, cycles and bursts; downstairs its image under z = Φ−1(Ft(y)) stays in the same ±1.96 band. The forecast fan upstairs is the image of a flat band downstairs — the map does the work.

Running in Pyodide →

The actual Python package, compiled to WebAssembly, running unmodified in the browser. Proof that what you pip install runs client-side.

Robustness explorer →

Slice the non-price benchmark any way you like — at random, by category, frequency, stickiness, or martingality — and watch laplace's per-series win-rate hold, with a live bootstrap band.

Use the port yourself

The JavaScript port is a zero-dependency ES module. Drop it into any page:

<script type="module">
  import { laplace } from "https://skaters.microprediction.org/js/skaters/index.mjs";

  const f = laplace(1);
  let state = null;
  for (const y of observations) {
    const [dists, st] = f(y, state); state = st;
    dists[0].mean;            // point forecast
    dists[0].std;             // uncertainty
    dists[0].quantile(0.975); // 97.5th percentile
  }
</script>