modist

Drag a density curve to shape a distribution, then feed the params straight into a distribution constructor. These widgets run right here in the browser — no Python, no notebook.

Normal

Beta

Gamma

StudentT

Exponential

HalfNormal

LogNormal

Cauchy

Laplace

Logistic

Weibull

HalfStudentT

ChiSquared

InverseGamma

Kumaraswamy

Use it in your own project — one file, no build step

<script type="module">
import { beta } from "https://williambdean.github.io/modist/latest/modist.js";

const w = beta(document.getElementById("prior"), { alpha: 1, beta: 3 });
w.onChange(p => console.log(p));   // every drag
</script>

Pin a release for reproducible, cache-stable URLs (the bundle is immutable for a year):

<script type="module">
import { gamma, studentT } from
  "https://cdn.jsdelivr.net/gh/williambdean/modist@v0.7.0/dist/modist.js";
</script>

Use it in Python — marimo or Jupyter

Same widgets, from a notebook. w.value is a live, plain-dict readout of the current params — it changes on every drag — and w.scipy / w.pymc are reactive adapters: they rebuild from the current params on every access, so they always reflect where you've left the curve.

import marimo as mo
import modist as md

w = mo.ui.anywidget(md.Normal())   # or Beta() / Gamma() / StudentT()
w                                  # drag the density curve
w.value    # {'mu': 0.0, 'sigma': 1.0} — live params, plain dict
import pymc as pm
dist = pm.Normal.dist(**w.value)   # splat the live params into the constructor
w.scipy    # reactive scipy.stats.norm — CDF, moments, sampling
w.pymc     # reactive pm.Normal.dist(...) — drops into any pm.Model
uv add modist            # then slice w.scipy or pm.X.dist(**w.value)