pounce

Library New

Single-crate facade for POUNCE from Rust: re-exports the TNLP trait, the IpoptApplication driver, and the supporting types in one place (plus a prelude), with feature-gated modules for the convex/LP/QP, active-set QP, and sensitivity paths.

Checked · Sources

Downloads
2,486
Dependents
9
Stars
81
Forks
10
Contributors
7
Commits
3,757
Latest release
0.16.0 ·

About

From the project README ·

POUNCE

POUNCE is a pure-Rust interior-point optimization solver. Its nonlinear-programming core began as a faithful port of Ipopt — the same filter line-search algorithm, console output, and option semantics, so anyone used to reading ipopt logs can drop in pounce without relearning where the numbers live — and it has since grown into a family of solvers sharing one numerical backbone:

Read the full README
  • Nonlinear programming — the filter line-search interior-point method (the Ipopt port), plus an active-set SQP path, for general smooth problems min f(x) s.t. g_L ≤ g(x) ≤ g_U, x_L ≤ x ≤ x_U. Complementarity constraints (AMPL complements, Pyomo mpec) are declared rather than hand-lowered: POUNCE picks the formulation and certifies the answer's stationarity (Complementarity Constraints).
  • Conic & quadratic — dedicated interior-point solvers for LP, convex QP, second-order (SOCP), positive-semidefinite (SDP), and the non-symmetric exponential and power cones — each solved to the global optimum, with infeasibility certificates, warm starts, and post-optimal sensitivity.
  • Global optimization — certified global optima for nonconvex polynomial problems via SOS / Lasserre relaxations. Nonconvex problems that are not polynomial get a local answer; there is no spatial branch-and-bound solver.

Convex and conic problems are solved to global optimality; nonconvex problems are solved locally by default, or — for polynomials — to a certified global optimum via the SOS path. See Choosing a Solver for the full map of which solver fits which problem.

The default build is pure Rust — no Fortran, no HSL, no system BLAS required. The FERAL backend provides a sparse symmetric LDLᵀ factorization that is also in pure Rust. The HSL MA57 backend is available behind the optional ma57 feature for users who have libcoinhsl installed.

Being pure Rust also means the whole solver compiles to WebAssembly: try it in your browser — drop an AMPL .nl file on the page to see the model's structure and solve it client-side, with nothing uploaded anywhere. There is also a Pyomo playground, where Pyodide runs CPython and Pyomo in the tab and POUNCE solves the model you write. See POUNCE in the Browser — the docs site serves the same page at /dev/wasm.html until the next release build picks it up at the site root.

License: EPL-2.0 (same as upstream Ipopt).

Status

Production-ready for the core IPM workflow. The algorithm-side core, NLP interface, line search, filter, barrier update (monotone + Mehrotra adaptive), KKT solve, restoration phase, AMPL .nl reader, the C ABI (pounce-cinterface), the Python wrapper (pounce-solver), and the CLI all solve a wide range of NLPs from the standard test suites (Hock-Schittkowski, CUTEst, Mittelmann ampl-nlp, CHO parameter estimation, gas/water network design). Sensitivity analysis (sIPOPT port) and reduced-Hessian computation are wired end-to-end; the pounce-presolve pass (auxiliary-equality elimination + FBBT + bound-tightening) and the active-set SQP path (pounce-qp-backed) are available behind option keys.

Beyond the NLP core, the solver family is wired end-to-end and validated against external suites:

  • Convex & conic (pounce-convex) — LP / convex-QP, SOCP, the exponential and power cones (geometric programming, entropy, logistic, p-norms), and small dense SDPs, with a Conic Benchmark Format (.cbf) reader cross-checked against the CBLIB tier. The CLI's auto routing classifies an .nl and sends LP / convex-QP problems here automatically.
  • Global (polynomials) — SOS / Lasserre polynomial optimization (sos_minimize / pounce.sos_minimize): a single SDP certifies the global minimum and recovers the global minimizers. This is the only certified-global path for a nonconvex problem, and it covers polynomials only — there is no spatial branch-and-bound solver for general factorable models.

The shipped solvers — NLP, conic, and SOS — are reachable from the CLI, the Python package, and the JSON solve report.

See benchmarks/ for the comparison harness against upstream Ipopt.

Documentation

The full user guide lives in docs/ as an mdbook — installation, the CLI, solver options, the JSON solve report, sensitivity analysis, and the Pyomo / Python integrations. Browse the Markdown sources directly on GitHub, or render the book locally:

make book       # builds docs/book/ (requires `cargo install mdbook`)

Workspace layout

CratePurpose
pounce-commonTypes, exceptions, journalist, options, tagged objects, cached results (Ipopt src/Common).
pounce-linalgBLAS-1, dense/compound vectors and matrices, triplet storage, CSC conversion (Ipopt src/LinAlg).
pounce-linsolSymmetric linear-solver trait layer — no FFI; backends plug in below.
pounce-feralPure-Rust sparse symmetric LDLᵀ backend. Default.
pounce-hslMA57 backend via libcoinhsl (optional, behind ma57 feature).
pounce-nlpTNLP trait, TNLPAdapter, IpoptApplication entry point (Ipopt src/Interfaces).
pounce-nlAMPL .nl reader and AD tape — parses the model and evaluates its derivatives; what pounce-cli reads a problem with.
pounce-algorithmIteratesVector, IpoptData, calculated quantities, KKT, line search, mu update, conv check, main loop (Ipopt src/Algorithm).
pounce-restorationRestoration phase (Ipopt Algorithm/Resto*).
pounce-presolveNLP preprocessing — auxiliary-equality elimination, FBBT, bound tightening, redundant-row removal.
pounce-l1penaltyThierry-Biegler ℓ₁-exact penalty-barrier wrapper for degenerate / MPCC problems.
pounce-sensitivityPost-optimal sensitivity + reduced-Hessian (port of upstream sIPOPT).
pounce-qpSparse parametric active-set QP subproblem solver — drives the SQP path and the sensitivity corrector.
pounce-convexConvex/conic interior-point solver — LP, QP, SOCP, exponential/power cones, small SDP, and SOS polynomial optimization.
pounce-solve-reportpounce.solve-report/v1 JSON writer (shared by pounce-cli --json-output and IpoptWriteSolveReport).
pounce-observabilitytracing subscriber install + per-iteration collector layer that feeds the iteration stream into the solve report.
pounce-cinterfaceC ABI shim — CreateIpoptProblem / IpoptSolve / FreeIpoptProblem / IpoptWriteSolveReport; PounceQp* matrix-form QP/conic entry.
pounce-pyPyO3 bindings — the cyipopt-compatible pounce Python package (the pounce-solver wheel).
pounce-cliThe pounce command-line driver.
pounce-rsSingle-crate Rust facade — re-exports the TNLP trait and the solver driver, so a Rust caller depends on one crate, not eight.
pounce-studio-coreSolve-report / iter-dump parsers and diagnostic analysis (foundation for the pounce-studio GUI / MCP server).
pounce-studio-pyo3PyO3 bindings mounting pounce-studio-core as pounce._pounce.studio, for the pounce-studio-mcp server ([mcp] extra).
pounce-wasmWebAssembly build behind the in-browser demo (docs/ → /demo/). Not published to crates.io.

Install

With pip (most users)
pip install pounce-solver

That is everything: the pounce command-line solver, the pounce Python package, and no toolchain to install — the wheels are prebuilt for Linux, macOS, and Windows.

pounce problem.nl                       # solve an AMPL .nl file
python -c "import pounce; print(pounce.__version__)"

For Pyomo models, add the solver plugin:

pip install pyomo-pounce
import pyomo.environ as pyo
results = pyo.SolverFactory("pounce").solve(model)

Optional extras, none of them required for a normal solve:

ExtraInstallFor
JAX autodiffpip install "pounce-solver[jax]"pounce.jax frontend
PyTorch autodiffpip install "pounce-solver[torch]"pounce.torch frontend
Plotspip install "pounce-solver[viz]"debugger viz / pounce-dbg-viz
GAMS linkpip install "pounce-solver[gams]"option nlp = pounce; — see GAMS
CasADi pluginbuild from source, make -C casadi installnlpsol("S", "pounce", nlp) / opti.solver("pounce") — see CasADi
Julia / JuMPbuild pounce-cinterface, then Pkg.develop(path="Pounce.jl")Model(Pounce.Optimizer) — see Julia
With a container (clusters, or no install at all)

No toolchain, no pip, nothing on the host — useful on a cluster, where you often cannot install either. The image carries the CLI, the Python API, and the Pyomo plugin:

docker run --rm -v "$PWD:/work" ghcr.io/jkitchin/pounce:latest problem.nl

Most HPC sites run Apptainer/Singularity rather than Docker; it pulls the same image and runs it as your own user:

apptainer pull pounce.sif docker://ghcr.io/jkitchin/pounce:0.16.0
apptainer run pounce.sif problem.nl

Pin X.Y.Z for anything you need to reproduce later — latest moves. make docker builds the same image from your working tree instead. Full details, including a Slurm example: Docker & Containers.

From source

Prerequisites: a stable Rust toolchain. Nothing else for the default build — no Fortran, no HSL, no system BLAS.

make            # release build of the workspace
make test       # run all tests
make clippy     # lint
make doc        # rustdoc
make install    # installs to $HOME/.local

make install drops the pounce binary into $PREFIX/bin and the libpounce_cinterface shared library into $PREFIX/lib (override with sudo make install PREFIX=/usr/local). Make sure $HOME/.local/bin is on your PATH.

To build with the HSL MA57 backend instead of the default pure-Rust FERAL one (requires libcoinhsl discoverable by the linker):

cargo build -p pounce-cli --release --features ma57

Usage

Solve an AMPL .nl file:

pounce problem.nl
pounce problem.nl print_level=8 max_iter=500 tol=1e-10
pounce problem.nl linear_solver=ma57       # with --features ma57

Trailing KEY=VALUE pairs follow the same syntax and semantics as the upstream Ipopt CLI; they override values loaded from an options file — --options-file <path>, option_file_name=<path>, or a pounce.opt / ipopt.opt found in the working directory.

List available built-in test problems:

pounce --list-problems
pounce --problem rosenbrock

Full help:

pounce --help
Solution output (.sol)

Following the AMPL solver convention, solving a positional .nl file writes a sibling <stub>.sol next to it — pounce problem.nl produces problem.sol. The file carries the primal x and dual lambda blocks plus an objno line with the AMPL solve_result_num, so AMPL (or any .sol reader) can pull the solution back:

pounce problem.nl                       # writes problem.sol
pounce problem.nl --sol-output out.sol  # write to an explicit path
pounce problem.nl --no-sol              # skip the .sol write

A .sol is written even when the solve fails, so the solve_result_num is always recoverable. Built-in problems (--problem …) have no .nl stub, so they only produce a .sol when --sol-output is given explicitly.

AMPL imported (external) functions

.nl files that import functions from a shared library (declared in F segments, called via f<id> expression tokens) are supported. Set AMPLFUNC to a newline-separated list of library paths — the same convention upstream Ipopt uses — and pounce loads each library through the standard AMPL funcadd_ASL ABI:

AMPLFUNC=$HOME/.idaes/bin/general_helmholtz_external.dylib \
  pounce helmholtz.nl

Multiple libraries: AMPLFUNC=$(printf '%s\n%s\n' /path/lib1 /path/lib2) pounce …. Without AMPLFUNC set, problems that need external functions fail with a clear error naming the offending function.

Pyomo

Because pounce speaks the AMPL NL/SOL protocol, it drops into Pyomo through the AMPL Solver Library interface — exactly how Pyomo drives Ipopt. The pyomo-pounce package registers pounce as a Pyomo SolverFactory solver:

import pyomo_pounce  # registers 'pounce'
from pyomo.environ import *

solver = SolverFactory('pounce')
solver.solve(model)

To invoke pounce directly as an AMPL solver, pass -AMPL (pounce problem.nl -AMPL); in that mode the termination is conveyed through the .sol file rather than the process exit code.

Machine-readable output (JSON)

Pass --json-output PATH to write a structured solve report alongside the regular console output:

pounce problem.nl --json-output result.json
pounce problem.nl --json-output result.json --json-detail full

The report is FAIR-aligned (Wilkinson et al. 2016, DOI 10.1038/sdata.2016.18) — every field documented in docs/src/schema/solve-report-v1.md. --json-detail summary (default) emits status, primal x, dual lambda, and aggregate statistics; --json-detail full adds the per-iteration trajectory (iter, objective, inf_pr, inf_du, mu, ||d||, alphas, line-search trials) for debugging.

The schema is versioned (pounce.solve-report/v1) so downstream tooling can pin against a major version. Consumers should tolerate unknown fields — additive changes don't bump the version.

Logging & diagnostics

POUNCE emits diagnostics through the tracing ecosystem. Logs go to stderr; program output (the iteration table, summary, --dump) stays on stdout, so the two never collide when redirected. The per-iteration table is colored when stdout is a terminal.

VariableEffect
RUST_LOGVerbosity / per-target filtering (default info); e.g. RUST_LOG=pounce::linsol=debug.
POUNCE_LOG_FORMATtext (default) or json — structured JSON sink on stderr for Studio / CI.
NO_COLOR / CLICOLOR_FORCEDisable / force the colored iteration table.

See docs/src/options.md and docs/src/troubleshooting.md for details.

Interactive solver debugger (--debug)

POUNCE ships an interactive debugger for the interior-point loop — a pdb for the IPM. Pause the solve at well-defined checkpoints, inspect and mutate the live state (iterate, multipliers, the barrier parameter μ), set breakpoints by iteration / numeric condition / solver event, step through an iteration's internal phases, rewind, and re-solve with new options. It has zero effect on the solve when not attached.

pounce problem.nl --debug             # human REPL (history, Tab-complete)
pounce problem.nl --debug-on-error    # run freely; drop in only on failure
pounce problem.nl --debug-json        # newline-delimited JSON for agents/tools

--debug-json speaks a self-describing protocol: the first line is a hello handshake advertising every command, event, checkpoint, metric, and capability, so an LLM agent, script, or visual debugger can drive the solver with no out-of-band docs. Full guide: docs/src/debugger.md. Post-mortem analysis of a finished solve is also available through the pounce-studio MCP server (pip install "pounce-solver[mcp]"; see studio/mcp) and the JSON solve report.

Sensitivity analysis (sIPOPT-compatible)

The pounce-sensitivity crate is a Rust port of upstream Ipopt's contrib/sIPOPT/ (Pirnay, López-Negrete & Biegler 2012, DOI 10.1007/s12532-012-0043-2). Four entry points cover the common workflows:

  • AMPL CLI — the main pounce driver auto-detects the sIPOPT suffixes (sens_state_1, sens_state_value_1, sens_init_constr) in an input .nl, runs a post-optimal sensitivity step after the solve, and writes the perturbed primal back as sens_sol_state_1 — no separate binary or flag needed:

    pounce problem.nl                   # writes problem.sol
    pounce problem.nl out.sol --json-output result.json --json-detail full
    

    pounce_sens is retained as a thin backward-compatibility alias: pounce_sens in.nl out.sol is identical to pounce in.nl out.sol, so existing AMPL / solver scripts keep working unchanged.

  • Rust library — SensSolve is a builder that wraps the on_converged callback plumbing into a single call:

    use pounce_sensitivity::SensSolve;
    let result = SensSolve::new(vec![2, 3])
        .with_deltas(vec![0.05, 0.0])
        .with_reduced_hessian()
        .run(&mut app, tnlp);
    // result.dx, result.reduced_hessian, result.status
    
  • Python (pounce.Problem) — solve_with_sens exposes the same capability from the cyipopt-compatible Python wrapper. See python/notebooks/04_sensitivity.ipynb for a walkthrough.

  • Pyomo (pyomo_pounce) — declare the parameters that matter when building the model, solve normally, then query derivatives; no suffixes and no upfront perturbation values:

    from pyomo_pounce import declare_sens_param, sens_jacobian, sens_solution
    declare_sens_param(m.p)
    SolverFactory("pounce").solve(m)     # keeps the KKT factorization
    sens_jacobian(m.x, wrt=m.p)          # dx*/dp; constraints give dlambda/dp
    sens_solution(m, [(m.p, 2.5)])       # perturbed-solution estimate
    sens_covariance(m)                   # estimation models: declare the fitted
                                         # vars and residuals, get the asymptotic
                                         # parameter covariance from one solve
    

    See docs/src/sensitivity.md and python/notebooks/25_pyomo_sensitivity.ipynb (an optimal-control example where the first-move gradients are the NMPC feedback gains).

All three are verified against upstream sIPOPT 3.14.19's parametric_cpp golden output to 1e-8. Reduced-Hessian eigendecomposition is available via --rh-eigendecomp (AMPL CLI), SensSolve::with_reduced_hessian_eigen (Rust), and solve_with_sens(rh_eigendecomp=True) (Python). Bound projection of the perturbed step is available via --sens-boundcheck [--sens-bound-eps EPS] (AMPL CLI), SensSolve::with_boundcheck(eps) (Rust), and solve_with_sens(sens_boundcheck=True, sens_bound_eps=…) (Python). The bound projection pins any violated variable at its bound and re-solves the step, for up to 16 passes (since #587); it covers variable bounds only, not constraint-row limits — use parametric_step_bounded when a row limit can bind.

Sessions: factor-once / solve-many

For workflows that issue several follow-up operations against the converged KKT factor — sensitivity sweeps, reduced Hessians over many pinned-row sets, raw KKT back-solves — the session APIs hold the factor alive between calls:

  • Python — pounce.Solver(problem) with .solve(...), .parametric_step(...), .reduced_hessian(...), .kkt_solve(...).
  • C — IpoptCreateSolver(&prob) / IpoptSolverSolve / IpoptSolverParametricStep / IpoptSolverReducedHessian / IpoptSolverKktSolve / IpoptFreeSolver. The classic IpoptSolve API is unchanged and unaffected.
  • Rust — pounce_sensitivity::Solver; or pounce_linsol::Factorization for the underlying factor-only primitive (no IPM in the loop).

See docs/src/sessions.md for the full walkthrough.

Benchmarks

benchmarks/ contains comparison harnesses against upstream Ipopt across several suites (CUTEst, Mittelmann ampl-nlp, CHO, electrolyte, grid, gas, water, large-scale synthetic NLPs, GAMS nlpbench). All suites feed a single composite report at benchmarks/BENCHMARK_REPORT.md with provenance metadata (versions, git SHA, linear solvers).

make benchmark              # full sweep: every suite + composite report
make benchmark-report       # regenerate the composite report only
make benchmark-water        # one suite at a time (water, gas, cutest, …)

The Ipopt comparison side runs against a locally-built Ipopt-MA57 (ref/Ipopt/install-ma57/). Build it once with make -C benchmarks build-ipopt-ma57. See benchmarks/README.md for the full list and per-suite details.

pounce in the wild

You can find an external benchmark of pounce at https://plato.asu.edu/ftp/ampl-nlp.html

Opyrability now uses pounce as its default solver.

SiNDAE — A Simultaneous Approach for Training Neural Differential-Algebraic Equations

Devin Griffith has been creating a series of interactive optimization examples that use pounce:

  • https://quadtank.griffith-pse.com/
  • https://cstr-sensitivity.griffith-pse.com/
  • https://circle-packing.griffith-pse.com/

@GermanHeim is integrating pounce into oximo a Rust algebraic modeling library for mathematical optimization (https://github.com/oximo-rs/oximo/tree/main/crates/oximo-pounce)

tellegen is using pounce to run their live interactive power flow analysis!

Are you using pounce for something and want it listed here? Let me know!

Acknowledgments

POUNCE's nonlinear-programming core is a Rust port of Ipopt, the interior-point nonlinear programming solver by Andreas Wächter, Lorenz T. Biegler, and the COIN-OR community. Its algorithm, console output, and option semantics are modeled directly on that codebase, which is released under the EPL-2.0.

It is a sibling of ripopt, an earlier memory-safe interior-point NLP optimizer in Rust by the same author (doi:10.5281/zenodo.19542664).

I want to thank Carl Laird and Victor Alves for encouraging this particular development path. In ripopt I codeveloped the ipm and linear algebra solvers, which led to a plateau in progress because of the difficulty in debugging which side the problems were on. They encouraged me to instead use a good, known linear algebra library and just focus on the ipm development. In parallel, I also did the same for the linear algebra library, and separated out feral to focus only on that. This package is the union of these two efforts, and it is much more robust than ripopt is.

Key references
  • Wächter, A., Biegler, L.T. "On the implementation of an interior-point filter line-search algorithm for large-scale nonlinear programming." Mathematical Programming 106(1), 25–57 (2006). doi:10.1007/s10107-004-0559-y — the algorithm POUNCE implements.
  • Wächter, A., Biegler, L.T. "Line search filter methods for nonlinear programming: Motivation and global convergence." SIAM Journal on Optimization 16(1), 1–31 (2005). doi:10.1137/S1052623403426556
  • Wächter, A., Biegler, L.T. "Line search filter methods for nonlinear programming: Local convergence." SIAM Journal on Optimization 16(1), 32–48 (2005). doi:10.1137/S1052623403426544
  • Fletcher, R., Leyffer, S. "Nonlinear programming without a penalty function." Mathematical Programming 91(2), 239–269 (2002). doi:10.1007/s101070100244 — the filter concept underlying the line search.
  • Pirnay, H., López-Negrete, R., Biegler, L.T. "Optimal sensitivity based on IPOPT." Mathematical Programming Computation 4(4), 307–331 (2012). doi:10.1007/s12532-012-0043-2 — the sIPOPT method behind pounce-sensitivity.
  • Duff, I.S. "MA57—a code for the solution of sparse symmetric definite and indefinite systems." ACM Transactions on Mathematical Software 30(2), 118–144 (2004). doi:10.1145/992200.992202 — the optional ma57 linear-solver backend.
Runs on
GPU support unknown
What shows it
  • no dependency or feature matches a backend row
Native code
Optional
  • Binds native code: pounce-hsl (feature ma57)
Python bindings
No Python binding crate found
License
EPL-2.0

Compare with similar projects

Order: strongest tier first, then most downloads, then name, with unmeasured values last. A library counts downloads over 30 days. An app counts binary downloads per release. An app with none counts its crate downloads over 30 days. ML Rust runs this catalogue, so its closest project always gets a row.

pounce beside the projects that share a topic with it
ProjectDownloadsDependentsStarsLatest releaseRuns on (GPU)Native codeLicense
pounce This page New

Single-crate facade for POUNCE from Rust: re-exports the TNLP trait, the IpoptApplication driver, and the supporting types in one place (plus a prelude), with feature-gated modules for the convex/LP/QP, active-set QP, and sensitivity paths.

2,486 downloads over 30 days 9 81 0.16.0 GPU support unknown Binds native code: pounce-hsl (feature ma57) EPL-2.0
peroxide Listed

Rust comprehensive scientific computation library contains linear algebra, numerical analysis, statistics and machine learning tools with familiar syntax

Python bindings

56,548 downloads over 30 days 9 732 0.43.1 GPU support unknown Binds native code: openblas-src (feature O3-openblas-system), blas-sys (feature O3), hdf5-metno-sys (feature nc), lapack-sys (feature O3), libz-sys (feature nc) and 1 more Apache-2.0 OR MIT
basin Listed

Numerical optimization in pure Rust, with pluggable linear-algebra backends and WASM support.

22,519 downloads over 30 days 9 128 3.2.0 GPU support unknown Binds native code: blas-sys (feature nalgebra_latest-lapack), lapack-sys (feature nalgebra_latest-lapack) Apache-2.0 OR MIT
numr Listed

The base for numerical code in Rust, in the role NumPy has in Python: n-dimensional tensors, linear algebra, FFT, statistics and autograd on CPU, CUDA and WebGPU. The backends use native kernels, with no cuBLAS, MKL or other vendor math library.

1,673 downloads over 30 days 7 59 0.15.2 CUDA, WebGPU Binds native code: ring (feature distributed) Apache-2.0
solvr Listed

Scientific computing on numr, in the role SciPy has in Python, with a module map for SciPy users: optimization, ODE, DAE and PDE solvers, interpolation, statistics, signal processing, spatial algorithms and clustering.

31 downloads over 30 days 0 11 0.3.1 CUDA, WebGPU No native code found Apache-2.0
rapl Listed

A crate that makes numerical scripting with Rust simple and enjoyable.

21 downloads over 30 days 1 107 0.4.0 GPU support unknown No native code found MIT
Why NewIts first release on 25 May 2026 is under 180 days old.

The check tests the Featured gates once the first release passes this age limit.

What else the check found

  • The last activity is on 8 Nov 2026, 1 day ago. The rules expect an update within 365 days. Dormancy rule

Exact rules: New. The check on applied thresholds version 9.

Every rule outcome, as the check records it
  • expected-interval: version 0.16.0 base 140, raised to the 365-day floor: E = 365 days
  • dormancy: last activity 2026-11-08, 1 days ago, E = 365: active
  • new: new: first release 2026-05-25 is under 180 days old
Crates15 crates

Measurements and sources

Each signal row shows the raw value, its source and the fetch date. The Sources list gathers every distinct source on this page. Movement needs more history.

Sources6 sources
Adoption2 active dependents, 2 new dependents in 365 days1 not measured
Adoption measurements
SignalValueSourceFetchedCounts
Active dependents2crates.io database dumpYes
New dependents (365 days)2crates.io database dumpYes
Peak active dependents2crates.io database dumpYes
Active dependents as a share of the peak1crates.io database dumpYes
Binary downloads per releaseNot measuredYes
MaintenanceLatest human commit: 1 day ago3 not measured
Maintenance measurements
SignalValueSourceFetchedCounts
Latest human commit2026-11-08GitHub repositoryYes
Latest release2026-11-07crates.io database dumpYes
First release2026-05-25crates.io database dumpYes
Latest version0.16.0crates.io database dumpYes
Days the oldest outside issue waits for a reply0GitHub repositoryYes
Maintainer replies over 365 days95GitHub repositoryYes
Repository archivedfalseGitHub repositoryYes
Repository gonefalseGitHub repositoryYes
Release commit or manifest in the repotruecrates.io packageYes
Published docstruecrates.io database dumpYes
Latest release fails cargo checkNot measuredYes
Build check dateNot measuredYes
Build check toolchainNot measuredYes
SecurityUnpatched vulnerabilities: none
Security measurements
SignalValueSourceFetchedCounts
Unpatched vulnerabilities past the grace windownoneRustSec advisory databaseYes
RustSec unmaintained advisorynoneRustSec advisory databaseYes
Deprecation noticenonecrates.io database dumpYes
Deprecated requirementnonecrates.io database dumpYes
Distribution10 releases, 2,486 downloads over 30 days5 not measured
Distribution measurements
SignalValueSourceFetchedCounts
Releases10crates.io database dumpYes
Downloads over 30 days2486crates.io database dumpYes
Binary downloads over the last 3 releasesNot measuredYes
Homebrew installs on request over 365 daysNot measuredYes
Repology repository familiesNot measuredYes
Docker pull growth over 90 daysNot measuredYes
Docker pulls at the growth baselineNot measuredYes
Every version a prereleasefalsecrates.io database dumpYes
Every version 0.0.xfalsecrates.io database dumpYes
Every version yankedfalsecrates.io database dumpYes
Crate deleted from crates.iofalsecrates.io database dumpYes
Repository81 stars, 10 forks, 7 contributors, 3,757 commits. Stars alone never qualify a project.
Repository measurements
SignalValueSourceFetchedCounts
GitHub stars81GitHub repositoryYes — one part of the repository route
GitHub forks10GitHub repositoryYes — one part of the repository route
Contributors with a GitHub account7GitHub contributorsYes — one part of the repository route
Commits on the default branch3757GitHub repositoryNo
Repository's main crate left out of the entrynonecrates.io database dumpYes
Facts that never count
Facts that never count measurements
SignalValueSourceFetchedCounts
LicenseEPL-2.0crates.io database dumpNo
Runs on, from listed crates and their direct dependenciesGPU support unknowncrates.io database dumpNo
What shows each backendno dependency or feature matches a backend rowcrates.io database dumpNo
Native code, from listed crates and their dependenciesBinds native code: pounce-hsl (feature ma57)crates.io database dumpNo
Python bindings, from direct dependencies of listed cratesNo Python binding crate foundcrates.io database dumpNo
Crates that depend on a listed crate directly9crates.io database dumpNo

Corrections and review history

Report a correction

No correction applies to this entry.

Judgments

A judgment enters only through an approved issue and a merged pull request.

No judgment applies to this entry.