Skip to main content

RENKIN — Retrosynthesis Engine for Knowledge-Informed Navigation

Computer-Aided Synthesis Planning (CASP) · Pure Rust · WebAssembly · Python
Named after 錬金 (れんきん, renkin) — Japanese for alchemy: just as alchemists transformed base metals into gold, RENKIN transforms target molecules back into cheap starting materials.

CI Docs

Crates.io docs.rs PyPI Python npm License: MIT

日本語版 README · 中文版 README · Documentation · Live Demo →


Keep your planner. Audit every route. Audit retrosynthesis routes from AiZynthFinder, Syntheseus, SynPlanner, or RENKIN — locally, reproducibly, and without sending molecular structures anywhere.

Audit a route in your browser → · Python quick start ↓ · Route planning engine ↓


What is RENKIN?

RENKIN Bridge is a tool-neutral route auditor: it checks structural integrity, stock coverage, and declared-reaction forward-replay for routes from AiZynthFinder, Syntheseus, SynPlanner, or RENKIN's own planner — the identical pass/fail/partial pipeline regardless of which tool produced the route, entirely local and reproducible (every audit records a verifiable audit_manifest), structures never leaving your machine unless you explicitly ask.

RENKIN is also, in its own right, an open-source retrosynthesis engine for computer-aided synthesis planning (CASP) that automatically discovers chemical reaction routes from a target molecule back to cheap, commercially available starting materials.

Built entirely in Rust with the chematic cheminformatics crate — zero C/C++ dependencies, #![forbid(unsafe_code)] throughout. One codebase compiles to a native CLI, a Rust library, Python wheels (PyO3), and a WebAssembly module that runs entirely client-side in the browser.


Installation

pip install renkin          # Python
cargo add renkin            # Rust
npm install renkin          # JavaScript (browser / bundler -- see docs/api/wasm.md)

Auditing Syntheseus routes needs one more, optional package: pip install renkin[syntheseus] (verified against Syntheseus 0.7.2 and 0.8.0).


Live Playground

→ Try it now — runs entirely in WebAssembly: no installation, no server, no network calls.


Audit a Route

Bring a route from wherever you already plan them — every path below runs through the identical audit pipeline: the same pass/fail/partial verdict regardless of source tool, or whether you ran it from the CLI, Python, or a browser tab.

AiZynthFinder

import json
import renkin

report = json.loads(
    renkin.audit_route(open("trees.json").read(), format="aizynthfinder")
)
print(report["summary"])

For an evidence-boundary report, add --chemical-review to renkin audit-route ... --output json. The optional report is deterministic; missing conditions, selectivity, and substrate-scope evidence remain not_evaluable. See the chemical review rubric.

Syntheseus (pip install renkin[syntheseus])

import json
import renkin
from renkin.syntheseus_exporter import dumps_syntheseus_route_v1

route_json = dumps_syntheseus_route_v1(my_synthesis_graph)
report = json.loads(renkin.audit_route(route_json, format="syntheseus"))
print(report["summary"])

SynPlanner

import json
import renkin

report = json.loads(
    renkin.audit_route(open("routes.json").read(), format="synplanner")
)
print(report["summary"])

In your browser — no installation, no upload, no server: Try the Playground →

Full walkthroughs with real output, end to end: AiZynthFinder · Syntheseus · SynPlanner.


Quick Start

Planning a route from scratch, not auditing one you already have — see Audit a Route above for that.

import json
import renkin

result = json.loads(
    renkin.find_routes(
        target="CC(=O)Oc1ccccc1C(=O)O",  # Aspirin
        depth=5,
        max_routes=3,
    )
)

for route in result["routes"]:
    for step in route["steps"]:
        print(f"  {step['target']}{' + '.join(step['precursors'])}  [{step['rule']}]")
import init, { find_routes } from './pkg/renkin.js';
await init();
const result = JSON.parse(find_routes("CC(=O)Oc1ccccc1C(=O)O", 5, 3, 0));
./target/release/renkin --target "CC(=O)Oc1ccccc1C(=O)O" --depth 5 \
    --templates data/templates_extracted_5000.smi --format tree
Target: CC(=O)Oc1ccccc1C(=O)O
Routes found: 3

Route 1  [score=1.02, depth=1]
OC(=O)c1ccccc1OC(=O)C
└── [extracted_169]
    ├── OC(=O)C  ✓ BB
    └── [OH]c1ccccc1C(=O)O  ✓ BB

Route 2  [score=1.02, depth=1]
OC(=O)c1ccccc1OC(=O)C
└── [extracted_145]
    ├── CC(=O)Cl  ✓ BB
    └── [OH]c1ccccc1C(=O)O  ✓ BB

Route 3  [score=1.03, depth=1]
OC(=O)c1ccccc1OC(=O)C
└── [extracted_238]
    ├── c1cccc(c1O)C(O)=O  ✓ BB
    └── C([OH])(=O)C  ✓ BB

Use --format mermaid for GitHub/Notion-compatible flowcharts.

Open In Colab


Current Limitations

⚠️ Benchmark numbers are under active re-measurement after a validator-accuracy fix — historical 78.0%/95.9%/81.8%(ChEMBL) figures elsewhere in this repo predate that fix and are invalidated. RENKIN does not predict yields, calibrated experimental success probabilities, or side reactions, and does not search the literature automatically (success_probability is a template-frequency search-ranking score, not a calibrated prediction — see Benchmark for the corrected historical baseline, full methodology, and known limitations — that page is a frozen, single-commit measurement, not a live number).


Why RENKIN?

RENKIN is designed as a Rust-native synthesis planning stack:

Fast A* / AND-OR tree search with beam search and template frequency weighting
Portable Native CLI · Python wheels · npm/WASM · browser playground — one codebase
Explainable Per-step confidence, atom_economy, route_cost, and procedure_hint
Verifiable renkin-forward validates each retrosynthetic step by forward-applying templates
Benchmarkable USPTO-50k, PaRoutes-style evaluation, route diversity, and atom balance checks
Agent-ready MCP server exposes routes and validation to Claude Desktop and AI agents

Constraint-based Search

Restrict routes by the element composition of their building blocks.

Default search — all 5 routes for biphenyl:

renkin --target "c1ccc(-c2ccccc2)cc1" --templates data/templates_extracted_5000.smi --format tree
Routes found: 5
Route 1  [score=1.00, depth=1]  c1ccccc1Br + c1c(B(O)O)cccc1
Route 2  [score=1.03, depth=1]  c1ccccc1Br + c1c(B(O)O)cccc1
Route 3  [score=1.06, depth=1]  c1cc(Cl)ccc1 + c1c(B(O)O)cccc1
Route 4  [score=1.08, depth=1]  c1(I)ccccc1  + c1c(B(O)O)cccc1
Route 5  [score=1.08, depth=1]  c1ccccc1Br  + c1(B2OC(C(C)(C)O2)(C)C)ccccc1

Constrained search — boronic-acid coupling, no Br or I starting materials:

renkin --target "c1ccc(-c2ccccc2)cc1" --templates data/templates_extracted_5000.smi \
    --require-elements "B" --avoid-elements "Br,I" --format tree
Routes found: 1

Route 1  [score=1.06, depth=1]
c1ccccc1-c2ccccc2
└── [extracted_398]
    ├── c1cc(Cl)ccc1  ✓ BB
    └── c1c(B(O)O)cccc1  ✓ BB

Constraints compose freely and are enforced in two layers:

  • --avoid-elements prunes expansions during search when a BB precursor contains a forbidden element (no dead-end nodes added to the heap).
  • A final route-level post-filter is still applied for correctness.
  • --require-elements is a route-level post-filter only.

Add --verbose to print search statistics (nodes expanded, elapsed time) to stderr. Performance counters are available in native builds only; disabled in WASM.

Add --search-diagnostics to add a search_diagnostics block to JSON output (beam eviction counts/scores, cross-template duplicate precursor signatures, rule-application attempts, stock-terminal/non-stock candidate counts, depth-wise branching factor, hypothetical dedup-strategy counts) — diagnostics-only bookkeeping, off by default, does not affect search behavior (Issue #101). Add --candidate-trace-limit <N> (implies --search-diagnostics) to also collect up to N per-candidate trace records (precursor signature, template provenance, beam rank/survival, whether it fed a returned route) — offline diagnostic use only, gated at collection time so the default no-trace path allocates nothing extra.


Template Evidence Metadata

Extracted templates only have a positional display name (extracted_{i}) that changes whenever the source .smi file is reordered or re-extracted, so external knowledge (a DOI, a reported yield, a known side reaction) can't be durably attached to one. Every template — hand-crafted and extracted — now has a stable template_id instead:

  • Hand-crafted rules: rule:<rule_name> (e.g. rule:suzuki_retro).
  • Extracted templates: smirks-sha256:<hex> — the SHA-256 hex digest of the trimmed SMIRKS string. Independent of file position, load order, and count; purely syntactic (no SMIRKS canonicalization — a semantically equivalent SMIRKS written differently gets a different ID).

Run renkin template ids <file.smi> to list every template's template_id, display name, SMIRKS, and weight (TSV by default, --format json for JSON) — use this to look up the IDs you need when authoring a sidecar file.

Attach curated evidence with --template-metadata sidecar.json (also available in Python as find_routes(..., template_metadata_path=...)), keyed by template_id:

{
  "schema_version": 1,
  "templates": {
    "smirks-sha256:ef8778a2888469d619c52cce7e74f6848e101049050dd1b765b78f32e3c94498": {
      "references": [
        { "id": "ref-1", "kind": "doi", "identifier": "10.xxxx/example" }
      ],
      "condition_candidates": [
        {
          "catalysts": ["Pd(PPh3)4"],
          "bases": ["K2CO3"],
          "solvents": ["EtOH", "water"],
          "temperature_c": { "min": 75.0, "max": 85.0 },
          "source": "literature",
          "scope": "template",
          "reference_ids": ["ref-1"]
        }
      ],
      "reported_yields": [
        {
          "percentage": { "min": 72.0, "max": 81.0 },
          "basis": "isolated",
          "source": "literature",
          "scope": "template",
          "reference_ids": ["ref-1"]
        }
      ],
      "warnings": [
        {
          "code": "possible_protodeboronation",
          "severity": "medium",
          "message": "Protodeboronation has been reported under prolonged aqueous heating.",
          "source": "literature",
          "scope": "template",
          "reference_ids": ["ref-1"]
        }
      ]
    }
  }
}

A matching step gets an evidence field with condition_candidates, reported_yields, references, and warnings; steps whose template has no sidecar entry get no evidence key at all. The sidecar is loaded and validated (schema version, duplicate/dangling reference IDs, yield range, range min <= max, non-empty DOI/patent identifiers) before search starts — malformed metadata is a hard error, and a template_id in the sidecar that matches no loaded rule prints a warning rather than failing silently.

What this is not:

  • reported_yields is a curated record of what was reported externally — not a RENKIN prediction. step_confidence/success_probability are unaffected and keep meaning template-frequency-derived search-ranking scores, not experimental success rates.
  • warnings reflects only what's explicitly present in the sidecar you supply — not automatic side-reaction detection.
  • Templates without a matching sidecar entry get no fabricated evidence. Nothing is invented for missing data.

Yield/success prediction and automatic literature search are explicitly out of scope for this phase — tracked as future work in #41.

Substrate-specific examples (schema_version: 2)

Everything above is template-level: it applies to every step using that template, regardless of the actual molecule. schema_version: 2 adds examples — a per-template array where each entry is one curated record of this exact reaction, keyed by target_smiles/precursor_smiles:

{
  "schema_version": 2,
  "templates": {
    "smirks-sha256:...": {
      "references": [{ "id": "ref-1", "kind": "doi", "identifier": "10.xxxx/example" }],
      "examples": [{
        "id": "ex-1",
        "target_smiles": "c1ccc(-c2ccccc2)cc1",
        "precursor_smiles": ["Brc1ccccc1", "c1ccccc1"],
        "conditions": { "catalysts": ["Pd(PPh3)4"], "solvents": ["EtOH"], "source": "literature", "scope": "substrate_specific", "reference_ids": ["ref-1"] },
        "reported_yield": { "percentage": 78.0, "basis": "isolated", "source": "literature", "scope": "substrate_specific", "reference_ids": ["ref-1"] },
        "reference_ids": ["ref-1"]
      }]
    }
  }
}

examples requires schema_version: 2 (a hard error under 1); under schema_version: 2, reported yields must live under examples[].reported_yield too — a non-empty template-level reported_yields is a hard error there (it stays allowed under schema_version: 1), so a substrate-specific number can't leak onto every step using that template. Every condition/yield/warning nested inside an example must be scoped substrate_specific.

A route step's evidence.examples are resolved, not just copied from the sidecar: matched against that step by canonical target SMILES plus the canonical, order-independent precursor set (reordering precursor_smiles in the sidecar changes nothing), with every exact-substrate match kept and same-template-different-substrate precedents capped at 3. Each resolved entry carries a match_kind (exact_substrate/template_only) in the JSON itself, plus a template_examples_total count — so JSON/Python consumers, not just --format explain, can tell "evidence for this exact reaction" apart from "literature precedent for a different substrate." --format explain shows exact-substrate matches first, each labeled either Exact substrate example: or "different substrate; not a prediction", with conditions/ reported_yield/warnings each showing their own cited references directly underneath (deduplicated when the same reference backs more than one part of an example). See Reaction Evidence guide for full matching/validation semantics.

Importing evidence from ORD. renkin evidence match (exact-set batch template matching, no fuzzy/similarity matching) and scripts/ord_evidence_audit.py (offline, network-free) turn a locally-downloaded Open Reaction Database corpus into a schema_version: 2 sidecar — every accepted record is independently re-validated by RENKIN's own loader, and anything not uniquely matched, unambiguous, and provenanced is excluded and counted in an audit report rather than guessed at. RENKIN itself never fetches or searches the literature; reported yields are citations, not predictions. ORD's reaction data is CC-BY-SA-4.0, a different license from RENKIN's own MIT code — see Reaction Evidence guide for the full acceptance criteria and licensing split.


Key Features

Feature Detail
Pure Safe Rust #![forbid(unsafe_code)] on all crates — compiler-enforced, zero C/C++ dependencies
Search engine A*/AND-OR tree search (Retro*-equivalent, pluggable MoleculeValueEstimator/ReactionPrior) with --beam-width N for memory-bounded exploration and rayon parallel rule application (sequential fallback on wasm32)
Up to 50k reaction templates Auto-extracted from USPTO-50k/MIT via rdchiral; frequency-weighted priority (optional pure-Rust tract-onnx NN scorer via --scorer); --templates for custom sets
Template quality tools renkin template stats|validate|dedup|explain|coverage|ids — frequency distribution, validity, duplicates, per-template lookup, coverage rate, stable IDs
Stable template IDs + evidence sidecar Every template gets a stable template_id (rule:<name> / smirks-sha256:<hex>, independent of file order). Attach curated DOIs/patents, conditions, yields, and side-reaction warnings via a --template-metadata sidecar.json; matching steps get an evidence field — see Template evidence metadata below. schema_version: 2 sidecars can also attach examples (curated exact-substrate records, surfaced first in --format explain). Automatic yield/success prediction and literature search remain out of scope (#41)
Ring-context safety guard --ring-context-policy conservative --ring-context-sidecar <path> — opt-in match-level filter that rejects an extracted template's ring-opening/closing disconnection when its historical training data never observed that bond as ring-forming/-breaking; default disabled (unchanged legacy behavior) — see Issue #72
LightGBM candidate reranker --reranker-model/--reranker-freq-table (CLI) or reranker_model_path/reranker_freq_table_path (Python) — opt-in, ordering-only re-ranking via a frozen LightGBM model; never changes which candidates are generated, only their order, and reproduces legacy ordering byte-for-byte when off. Paired 100-target route-search gate: route_to_configured_stock 16→20 (+4/-0). python3 scripts/fetch_reranker_model.py fetches the frozen model (SHA-256-verified, not bundled in any package — see Roadmap)
Coverage mode (opt-in) --search-mode coverage --coverage-templates <path> (CLI) or search_mode="coverage", coverage_templates_path=... (Python) — if the default template set finds no route, automatically escalates to a larger, separately loaded template set, cooperatively cancellable via --coverage-timeout-secs. Standard-mode output is byte-for-byte unchanged when not used. python3 scripts/fetch_coverage_templates.py fetches the frozen 2,000-template Stage-2 set (SHA-256-verified, not bundled in any package, same reasoning as the reranker model — see Roadmap)
RENKIN Bridge / audit-route renkin audit-route route.json [--format auto|renkin|aizynthfinder|syntheseus|synplanner] [--stock stock.smi] [--output human|json] — tool-neutral route audit: structural integrity, stock, and declared-reaction forward-replay validation, each reported independently as pass/fail/not_evaluable, rolled up into a route-level pass/fail/partial verdict. Reads RENKIN-native route JSON (v0.25.0), real AiZynthFinder route JSON — single-target and gzip-compressed batch output, verified against AiZynthFinder 4.3.2, 4.4.0, and 4.4.1 specifically, not claimed for every version (v0.26.0, version matrix widened v0.32.0) — Syntheseus routes via the optional renkin.syntheseus_exporter's syntheseus-route-v1 interchange schema, since Syntheseus itself has no native route export (v0.30.0) — and real SynPlanner 1.6.0 write_routes_json exports directly, no exporter package needed (v0.34.0); --format auto detects the input shape and hard-errors rather than guessing on anything ambiguous. AiZynthFinder walkthrough → · Syntheseus walkthrough → · SynPlanner walkthrough →
Route scoring confidence, step_confidence, success_probability (Retro-prob style), convergency, atom_economy, route_cost (Σ BB cost + steps×0.5, or actual prices via --bb-prices/--stock) per step/route — see caveat below the table
Step metadata provenance Each step reports metadata_source/metadata_scope so it's machine-readable whether conditions/reaction_family came from a rule-author default vs. something more grounded; absent (not fabricated) for extracted templates
Pareto multi-objective search --format pareto returns a Pareto front across route_cost/success_probability/steps; objectives configurable via --objectives
Constraint DSL --constraints constraints.json — element/building-block filters, step/cost limits, confidence thresholds, required/avoided/preferred reaction families; enables LLM → RENKIN pipelines
Output formats & diagnostics --format json|tree|mermaid|explain|compare|compare-json|pareto; zero-route JSON includes a diagnostics block with likely_causes/suggestions
renkin-forward toolkit predict (rank forward products), enumerate (bounded products from one reactant + partner library), hints (partner-free retrieval hints, no concrete product), validate (forward-verify each retro step) — see the Forward guides
renkin-bench USPTO-50k/PaRoutes evaluation with --plausibility (forward-validated composite score), --failure-taxonomy, atom-balance checks (target_MW > Σ precursor_MW), and multi-stage cascade re-runs on unsolved targets — see Benchmark
Stock management renkin stock stats|validate|coverage for legacy CSV plus the vendor_stock library API for v0.38 CSV/TSV vendor records (SMILES, ID, vendor, price, lead time, availability), explicit exact/parent/stereo/tautomer match modes, and an InChIKey candidate index
MCP server renkin-mcp exposes 6 tools: find_routes, validate_route, explain_route, find_pareto_routes, plan_with_constraints, estimate_diversity
renkin-doctor Environment diagnostic binary — templates, building blocks, Python import, tool versions, data integrity
renkin-kg Reaction knowledge graph builder — bipartite mol↔reaction graphs from routes, GraphML/Cypher export
Multi-target pip install renkin (pre-built wheels, Linux/macOS/Windows) · npm install renkin (~500 KB WASM, near-native browser speed)
Building blocks + stereo 402 unique compounds loaded from data/building_blocks.smi (aryl halides, boronic acids, heterocycles, amines, acids, amino acids — see Benchmark); full tetrahedral @/@@ and E/Z stereochemistry; building_blocks field in every route JSON (leaf starting-material SMILES, no manual parsing)

step_confidence/success_probability are not yields or measured success rates. They're template-frequency-derived search-ranking scores (rule_weight / max_rule_weight, multiplied across a route's steps) used to order candidate disconnections during search — not a calibrated probability of experimental success, and not an expected isolated yield. Route-level experimental yield/success-rate reporting is not implemented.


Pipeline Examples

# Route cost scoring with commercial prices
renkin -t "Cc1ccc(-c2ccccc2)cc1" --bb-prices data/prices.csv --format json

# Standalone forward prediction — no route search involved
renkin-forward predict --reactants "Oc1ccccc1C(=O)O" "CCO" --report --max-results 5

# Forward validation — pipe find_routes output directly
renkin -t "CC(=O)Oc1ccccc1C(=O)O" --format json | renkin-forward validate

# Faster template retrieval with bond-center index (~24% speedup)
renkin -t "c1ccc(NC(=O)c2ccccc2)cc1" --templates data/templates_extracted_5000.smi --bond-index

# Audit a real AiZynthFinder route export with RENKIN (see the full walkthrough:
# https://kent-tokyo.github.io/renkin/guides/aizynthfinder-audit-demo/)
renkin audit-route tests/fixtures/aizynthfinder/v4.4.1/single_trees.json \
  --format aizynthfinder \
  --stock data/building_blocks.smi \
  --output human

# Same audit pipeline, either source — --format auto also detects both correctly
renkin -t "CC(=O)Oc1ccccc1C(=O)O" --format json > /tmp/renkin-route.json
renkin audit-route /tmp/renkin-route.json --format renkin
renkin audit-route tests/fixtures/aizynthfinder/v4.4.1/single_trees.json --format aizynthfinder

Benchmark

USPTO-50k test set (4,907 molecules, full evaluation):

Evaluation definition: A molecule is solved if find_routes returns at least one route whose leaf precursors are all in the building block set, within depth=5 and beam=100. Ground-truth reactants from USPTO-50k are not checked — any commercially accessible route counts.

Corrected baseline (commit e20dc8c, 2026-07-22)

Public label Internal metric Value
Search-to-stock rate raw_solved_rate 20.09% (986/4,907)
Atom-balance-filtered rate atom_balanced_solved_rate 15.41% (756/4,907) — subset of search-to-stock
Current-validator-confirmed rate provenance_validated_solved_rate 0.88% (43/4,907) — subset of atom-balance-filtered

402 building blocks (unique compounds actually loaded from data/building_blocks.smi — see below), 5,000 extracted templates, 28 handcrafted rules, depth=5, beam=100. These three rates are a nested series over the same 4,907 targets, not independent numbers, and none is an experimentally-verified synthesis success rate or a human-chemist-reviewed route-accuracy figure. provenance_validated_solved_rate is not a measured chemical-accuracy rate and not a proven lower bound on correctness — it only counts routes the current validator can positively confirm, and an unknown fraction of "invalid" verdicts may be validator false negatives rather than real chemistry or route errors (the split is unmeasured). Full methodology, per-rule breakdown, and reproduction command: tasks/phase31_final_remeasurement_run.md · Full benchmark details →

Historical progression (pre-fix, invalidated — see notice above)

⚠️ The figures in this subsection (78.0% single-pass, 95.9% cascade, 81.8% ChEMBL OOD) predate the 31.11/31.12 fixes, are invalidated, and have not been re-measured. Kept for continuity only — do not cite as current performance.

Evaluation note: All numbers use the standard USPTO-50k train/test split (same corpus). Templates are extracted from the training set and evaluated on the test set. Numbers reflect performance within the USPTO-50k domain; out-of-distribution generalization was separately evaluated via ChEMBL approved drugs (81.8%, 409/500, also not re-measured).

Config Solved Rate BBs Templates depth beam ms/mol
v0.1.0 initial 366/4907 7.5% 463 31 3 50
+ auto templates (top-300) 1363/4907 27.8% 463 222 3 50
+ depth=5, top-500 templates 2315/4907 47.2% 463 314 5 50
+ beam=100 2688/4907 54.8%* 463 314 5 100
+ Phase A (template freq. weighting) 3540/4907 72.1%† 463 314 5 100
+ 5,000 templates, 480 BBs 3826/4907 78.0% 480 5,000 5 100 2,775
Phase A unlimited (beam=0) 3832/4907 78.1% 480 5,000 5 0
Phase B (NN scorer, tract-onnx) 3826/4907 78.0% 480 5,000 5 100 3,394
+ diaryl sulfone rule, 509 BBs 3826/4907 78.0% 509 5,000 5 100 ≈2,800
Cascade (stage2: depth=7, beam=300 on unsolved) 4705/4907 95.9% 509 5,000 7 300

* 29/50 chunks, previous binary
† 50/50 chunks — 72.1% (3,540/4,907) confirmed
BB counts in this historical table (463/480/509) are as originally documented at each point in time — legacy documentation values, not re-verified against ChemEnv::bb_count(). The corrected-baseline section above uses the actually-loaded count (402) for the current data/building_blocks.smi.

Note: LocalRetro (53.4%) and GLG (58.0%) report single-step top-1 prediction accuracy — a different metric, not directly comparable.

Benchmark scope note: USPTO-50k is used here as a standardized sanity benchmark, not as proof of broad real-world synthesis performance. The corpus covers a narrow slice of reaction space (primarily C–C and C–N bond formations common in pharmaceutical synthesis), and reaction types with sparse USPTO representation are systematically underserved. Out-of-distribution performance on ChEMBL approved drugs (81.8%, 409/500, pre-fix, not re-measured) suggested the rule set generalizes beyond the test corpus, but neither historical number should be interpreted as a guarantee of route quality on arbitrary targets.

PaRoutes compatibility

RENKIN is compatible with the PaRoutes multi-step benchmark. Download their stock compounds and target molecules, then pass them directly:

renkin-bench \
  --input paroutes_n1_targets.smi \
  --building-blocks paroutes_stock.smi \
  --templates data/templates_extracted_5000.smi \
  --depth 5 --beam-width 100

The JSON output includes avg_nodes_expanded, avg_confidence, avg_convergency, and avg_success_prob (Retro-prob style) alongside the standard solved/success_rate metrics.


Competitive Landscape

⚠️ RENKIN's row below uses the corrected raw_solved_rate (20.09%, see notice near the top of this README) — the 95.9% cascade figure some earlier versions of this table cited is invalidated and not re-measured; it is not included here.

Tool Language License WASM Zero-dep Algorithm Template source Stock
ASKCOS Python CC BY-NC No No (Docker, 64 GB) MCTS + A* USPTO (ML) ZINC
AiZynthFinder Python MIT No No (conda + model) MCTS USPTO (ML, ~50k) eMolecules (~6M)
SYNTHIA Closed Proprietary No No SMARTS + AND/OR Manual curated Sigma-Aldrich
IBM RXN Closed Cloud SaaS No No Transformer USPTO
Retro* Python MIT No No (unmaintained) A* + AND/OR USPTO (ML) eMolecules
★ RENKIN Rust MIT Yes Yes A* + AND/OR Hand-curated + rdchiral (5k default; 50k via --templates) 402+

raw_solved_rate is the closest available RENKIN metric to the published route-finding success rates of the other planners above, but the figures are not directly comparable — stock size, template library, target set, search budget, and route-quality checks all differ across systems, and this table does not establish RENKIN as better or worse than the alternatives.

RENKIN's goal: match state-of-the-art accuracy using only curated rules and auto-extracted SMIRKS templates — no GPU, no training data, no black boxes. Under RENKIN's benchmark setting (corrected baseline, commit e20dc8c, 2026-07-22), it reaches 20.09% raw_solved_rate (986/4,907) single-pass — see the Benchmark section above for the full nested-metric series and why the stricter provenance_validated_solved_rate (0.88%) is not RENKIN's measured or bounded correctness rate. RENKIN runs anywhere: browser, CLI, Python — single cargo build.

⚠️ The table above lists tools under different evaluation conditions. No matched-condition experiment against other tools has been performed.


MCP Server

renkin-mcp exposes retrosynthesis as an MCP tool so AI agents (Claude, etc.) can call it directly.

Setup — add to claude_desktop_config.json:

{
  "mcpServers": {
    "renkin": { "command": "/path/to/renkin-mcp" }
  }
}

Tools (6):

Tool Description
find_routes Retrosynthesis: SMILES → routes with scoring
validate_route Forward-validate a retrosynthetic route
explain_route Human-readable strengths/weaknesses per route
find_pareto_routes Pareto-front multi-objective route search
plan_with_constraints Constraint-DSL planning (element/building-block filters, step/cost limits, confidence thresholds, required/avoided/preferred reaction families)
estimate_diversity Route diversity and coverage metrics

find_routes also accepts search_mode: "coverage" with a required coverage_templates path. It runs the standard Stage 1 first and escalates to Stage 2 only when Stage 1 finds no route; the response reports the selected stage, timeout status, and per-stage elapsed time.

The server auto-detects data/building_blocks.smi and data/templates_extracted_5000.smi in the working directory. Falls back to the embedded DEFAULT_BUILDING_BLOCKS / default_rules() defaults if not found (152 unique building blocks per ChemEnv::bb_count(), 22 handcrafted rules, including the new graph-based carbamate_cleavage rule).

cargo build --release
# binary: target/release/renkin-mcp

Architecture

Workspace scope

┌──────────────────────────────────────────────────────────────────┐
│ renkin workspace (this repository)                               │
│                                                                  │
│  renkin  (retrosynthesis)         renkin-forward                  │
│  ──────────────────────           ─────────────────────────────  │
│  target → precursors              reactants → products           │
│  A* / AND-OR search               template-based forward         │
│  route scoring & constraints      (validates retro routes)       │
│        │                                    │                    │
│        └──────────────────┬─────────────────┘                    │
│                           ▼                                      │
│               chematic  (molecular representation,               │
│               SMILES, substructure matching, reaction SMARTS)    │
└──────────────────────────────────────────────────────────────────┘

Internal data flow (renkin crate)

Target SMILES
     │
     ▼
┌─────────────────────────┐
│     chem_env.rs         │  ← chematic wrapper
│  - SMILES parse         │     canonical-SMILES FxHashSet BB lookup (O(1))
│  - 21 built-in + up to 50k via --templates  │     fragment sanitization + ring-leak filter
│  - Building block check │     apply_retro memoization cache
└────────────┬────────────┘
             │  par_iter (rayon / sequential on WASM)
             ▼
┌─────────────────────────┐
│      search.rs          │  ← A* / AND-OR Tree Search
│  - Priority queue       │     SA Score heuristic + memoization
│  - Closed list          │     beam search (SmallVec frontier)
│  - Arc<PathNode> paths  │     O(1) path sharing per child
└────────────┬────────────┘
             │
             ▼
┌─────────────────────────┐
│      score.rs           │  ← Heuristic / Cost Function
│  - SA Score (chematic)  │     h = Σ(1 + 0.5·(sa−1)/9)
│  - MW step cost         │     g = Σ(1 + total_mw/2000)
└────────────┬────────────┘
             │
             ▼
┌─────────────────────────┐   (optional)
│      scorer.rs          │  ← Phase B: NN Template Scorer
│  - tract-onnx           │     Pure Rust ONNX inference
│  - --scorer flag        │     molecule-specific template ranking
└────────────┬────────────┘
             │
             ▼
  JSON  ←  CLI / Python / WASM

Project Structure

renkin/                          ← Cargo workspace root
├── Cargo.toml
├── src/                         ← renkin crate (retrosynthesis)
│   ├── lib.rs                   # public library
│   ├── main.rs                  # CLI binary (--templates, --template-metadata, --scorer, --constraints, --objectives flags)
│   ├── bin/benchmark.rs         # renkin-bench binary (--plausibility flag)
│   ├── bin/doctor.rs            # renkin-doctor diagnostic binary
│   ├── bin/fp.rs                # renkin-fp ECFP4 fingerprint (nn-scoring feature)
│   ├── bin/mcp.rs               # renkin-mcp MCP server (6 tools)
│   ├── chem_env.rs              # retro rules + BB lookup + template loader
│   ├── score.rs                 # SA Score heuristic + step cost
│   ├── search.rs                # A* / AND-OR tree engine + beam pruning
│   ├── scorer.rs                # Phase B: tract-onnx NN template scorer
│   ├── candidate.rs             # one-step candidate proposal (offline reranking foundation, not wired into search)
│   ├── pool_export.rs           # candidate-pool JSONL + reproducibility-manifest export
│   ├── python.rs                # PyO3 bindings (--features python)
│   └── wasm.rs                  # wasm-bindgen bindings (cfg = wasm32)
├── crates/                      ← sibling crates
│   ├── renkin-forward/          # forward reaction prediction (reactants → products)
│   └── renkin-kg/               # reaction knowledge graph builder (GraphML / Cypher export)
├── data/
│   ├── building_blocks.smi              # 402 curated commercial starting materials (loaded/deduplicated count)
│   ├── templates_extracted_5000.smi     # 5,000 auto-extracted SMIRKS templates
│   ├── benchmark_targets.smi            # internal benchmark set
│   └── bench_chunks/                    # USPTO-50k per-chunk results
├── scripts/
│   ├── extract_templates.py         # rdchiral template extraction pipeline
│   ├── run_benchmark_chunks.sh      # resumable chunked benchmark runner
│   ├── train_reranker.py            # candidate reranker training/evaluation (dev tool, offline only)
│   └── tests/                       # unittest suite for train_reranker.py
├── docs/                # MkDocs source → kent-tokyo.github.io/renkin/
└── mkdocs.yml

Roadmap

Full shipped history (every release, in order): CHANGELOG.md. This section only tracks the current headline items and what's next — see "Earlier milestones" below for older shipped work.

Recently shipped

  • SynPlanner Bridge (--format synplanner, shipped v0.34.0) — Keep SynPlanner. Audit its routes with RENKIN. A fourth route adapter, and the first whose native export carries real, forward-replayable atom mapping: renkin audit-route --format synplanner (also auto-detected) reads real SynPlanner 1.6.0 write_routes_json exports directly, no exporter package needed. Confirmed against real SynPlanner output twice — hand-constructed reactions through SynPlanner's own exporter, and a real CPU-only MCTS-searched planning run through the real synplan planning CLI end to end — every one of 317 real reaction nodes across a 167-route real search carries a structurally valid atom map, and real routes reach a genuine pass verdict, not just not_evaluable. New 4-way (RENKIN-native/AiZynthFinder/Syntheseus/SynPlanner) structural and policy-verdict parity tests. The browser playground's Audit tab gained SynPlanner as a fourth format option, with a one-click real-MCTS-output example. 5-minute walkthrough with real output →
  • Syntheseus Bridge (--format syntheseus, shipped v0.30.0) — Syntheseus has no route export. RENKIN built one — and audits it exactly like every other adapter. A third route adapter alongside RENKIN-native and AiZynthFinder: the optional renkin.syntheseus_exporter (pip install renkin[syntheseus]) turns a real Syntheseus SynthesisGraph into the syntheseus-route-v1 interchange schema, which renkin audit-route --format syntheseus (also auto-detected) consumes through the identical audit pipeline every adapter shares. Forward validation honestly reports not_evaluable for every real Syntheseus route today — reaction_smiles carries no atom mapping, never faked into a pass. The browser playground's Audit tab gained Syntheseus as a third format option. 5-minute walkthrough with real output →
  • Audit Policy Profiles (--policy informational|standard|strict, shipped v0.29.0) — One set of findings. Three ways to derive the verdict. Audit the same route under informational, standard, or strict policy without ever hiding or changing the underlying findings — policy only changes how the overall pass/fail/partial verdict is derived from findings already collected, recorded in audit_manifest.policy. Consistent across every surface: renkin audit-route --policy, the Rust API, the first Python binding for route auditing (renkin.audit_route()), and a new WASM audit_route_v2() (the existing audit_route() stays as a standard-policy wrapper). The browser playground's Audit tab gained a policy selector.
  • Audit Playground ([ Audit a Route ] tab, shipped v0.28.0) — Audit a route in your browser — the same pipeline, the same verdict, zero network calls. The browser playground now audits a RENKIN or AiZynthFinder route export (single-route or Pandas batch) and an optional stock list entirely client-side, via a new audit_route WASM export that calls the identical report-building pipeline renkin audit-route uses — the same pass/fail/partial verdict either way, not a separately-maintained copy. Paste or upload, run off the main thread, download the JSON report.
  • Reproducible Route Audit (audit_manifest on renkin audit-route --output json, shipped v0.27.0) — Reproduce what was audited, from which input, with which stock and policy. Every audit report now records RENKIN version, report schema version, source format/version, input/stock content SHA-256 hashes, and audit policy — tested for byte-identical determinism (auditing the same input twice), not just claimed. Adds a shared adapter conformance suite across RENKIN-native and AiZynthFinder route inputs, plus a written reproducibility/compatibility contract (verified-vs-supported versions, unknown-field tolerance, report-schema rules, adapter-fixture runbook). The browser playground also got a safety/UX pass this release: search runs off the main thread with cancel/time-budget support, structure rendering stays local by default (no third-party SMILES transmission), and search settings round-trip exactly through Copy CLI/Python.
  • RENKIN Bridge — Cross-Tool Route Audit (renkin audit-route, RENKIN-native adapter shipped v0.25.0, AiZynthFinder adapter shipped v0.26.0) — Keep AiZynthFinder. Audit its routes with RENKIN. A tool-neutral route audit model: structural-integrity, stock, and declared-reaction forward-replay validation, each reported independently as pass/fail/not_evaluable, rolled up into a route-level pass/fail/partial verdict — never a silently force-passed boolean. v0.26.0 adds a real AiZynthFinder adapter (single-target and gzip batch JSON, verified against captured v4.4.1 output — see PROVENANCE.md) plus --format auto detection, so both tools' routes run through the exact same audit pipeline; auditing the real fixtures also surfaced and fixed a shared forward-replay bug where precursor ordering, not just chemistry, affected the verdict. renkin audit-route route.json --stock stock.smi --output json audits every route in a file and aggregates the results into one machine-readable report, regardless of which tool produced it.
  • Coverage mode (--search-mode coverage, #101, shipped v0.24.0) — opt-in Stage-1/Stage-2 template-count escalation, addressing the candidate-generation coverage gap below. Confirmed by a one-shot 500-target formal-TEST (data/coverage_mode_formal_test/protocol_v2.md): coverage +6.0pp, net gain +30, zero regressions, zero reranker failures, Stage-2 timeout rate 0.25% — all against pre-registered thresholds. See the Key Features table above for the shipped surface
  • Reranker made actually usable: Python exposure (find_routes()'s reranker_model_path/reranker_freq_table_path) and batteries-included model distribution (scripts/fetch_reranker_model.py, SHA-256-verified fetch from the v0.22.0 GitHub Release's canonical assets) (#101, shipped v0.23.0) — v0.22.0 proved the reranker works; v0.23.0 is the usability/distribution unlock, not a new accuracy claim
  • LightGBM candidate reranker, trained/gated offline and wired into route search (#101 Task 35, CLI shipped v0.22.0) — LambdaMART model trained on real USPTO-50k labels, passed its VAL screening gate (top1 +11.7pp, MRR +11.3pp, top10 +9.3pp, bootstrap-CI-confirmed) and a formal 4,903-target TEST evaluation against the frozen model exactly once (top1 +12.7pp, MRR +11.9pp, top10 +9.1pp — consistent magnitude with VAL, no overfitting signal), then wired into find_routes as an ordering-only rank bonus and confirmed with a paired 100-target route-search gate: route_to_configured_stock 16→20/100 (+4/-0). See the Key Features table above
  • Formal 500-target RENKIN vs AiZynthFinder comparison (#66) — under a fixed 500-target sample, shared 393-compound stock, and each tool's configured policy/budget, RENKIN Conservative's route_to_shared_stock outcome was 9.8 percentage points higher than AiZynthFinder's (73/500 vs 24/500). This is a protocol-specific paired result, not a general search-capability superiority claim; native-mode configurations use unmatched stocks and are not directly comparable.
  • Ring-context safety guard for extracted templates (#72/#242) — opt-in --ring-context-policy/--ring-context-sidecar, catches extracted templates silently misapplying a ring-opening/closing disconnection their training data never saw; default remains disabled (unchanged legacy behavior)
  • atom_economy no longer silently clamped to 100% when a route's represented precursor set can't account for the target's full mass (#79) — a new atom_economy_status field (normal/above_expected_range/not_evaluable) reports this explicitly instead

In progress

  • Candidate-generation coverage gap — 33.0% (1,618/4,903) of the formal TEST corpus has zero positive candidates in-pool, a ceiling reranking cannot fix by construction; template-diversity-scaling confirmed as a strong mechanism (Phase A.5/B.2, see coverage mode above), higher-level-template research direction not yet started
  • Template retrieval index (element bitmask + bond-center prefilter) for the 50k template set
  • Calibrated route confidence (map success_probability to empirical solve rate)

Next

  • Graph rule expansion — sulfonamide and carbamate cleavage (one PR per family, with structural and atom-accounting gates; carbamate shipped v0.61.0)
  • Urea cleavage — validated atom-balanced disconnection to isocyanate + amine; implemented locally as the next-version candidate (not published)
  • Stock-aware planning (price / hazard / availability re-ranking)
    • Deterministic policy-aware vendor-offer selection (price, lead time, availability) for exact private-stock matches
    • Optional local hazard labels and blocked-hazard policy decisions
    • Route-level stock score and deterministic multi-route ranking metadata
    • Constraint DSL route-cost cap (max_route_cost) with explicit route-cost semantics
    • Exact canonical building-block exclusion (avoid_building_blocks) for private/constrained stock policies
    • Exact canonical building-block requirement (require_building_blocks) for house-stock policies
Earlier milestones

Percentage figures below are historical milestones at the time each was shipped, not current performance — several predate the validator-accuracy fix noted in Current Limitations and are invalidated; see Benchmark for the corrected historical baseline.

  • Reranker made actually usable: Python exposure + batteries-included model distribution (#101, v0.23.0) — see "Recently shipped" above for the current-cycle summary; full detail in CHANGELOG.md
  • Stable template_id (rule:<name> / smirks-sha256:<hex>) + --template-metadata evidence sidecar + renkin template ids (#41 phase 1)
  • Substrate-specific examples (schema_version: 2) — per-step exact-substrate vs. same-template-different-substrate resolution, surfaced in --format explain and as match_kind in JSON (#41 phase 2)
  • Deterministic ORD (Open Reaction Database) evidence import — offline renkin evidence match exact-set batch template matcher + scripts/ord_evidence_audit.py audit/converter into schema_version: 2 sidecars (#41 phase 3A)
  • RETROSPECT-inspired offline candidate-reranking foundation — candidate proposal/selection separation, feature schema v1, manifest v2, leakage-safe train/val/test splitting, baseline arms + trained-ranker arm, paired bootstrap + offline gate tooling (#59)
  • renkin-forward enumerate — bounded, template-guided forward enumeration from a single known reactant plus an explicit partner library (#64)
  • renkin-forward hints — partner-free retrieval hints (matched template slots, missing-partner SMARTS, bond deltas) for patent/database search, no concrete product predicted (#64 phase 2)
  • renkin-forward CLI hardening — versioned ForwardPredictionReport, deterministic candidate IDs/merge/provenance, reactant-order-independent matching, strict CLI/route-JSON validation
  • apply_retro/run_reactants performance regression resolved — chematic moved to the published 0.8.0 release (upstream automorphism-orbit-pruned canonicalization, chematic#193); zero correctness change
  • renkin-bench cascade — multi-stage search (fast defaults → hard cases re-run deeper); only unsolved targets propagate to later stages
  • renkin-bench --failure-taxonomy — classify unsolved targets by cause (beam limit / depth limit / template gap / stock near-miss)
  • Graph-based ester cleavage — BFS-leakage-free R-C(=O)-O-R' → RCOOH + R'OH
  • --top-templates N — frequency-rank filter: use the top-N most frequent templates for speed / less noise
  • raw / validated / practical solved-rate metrics (--plausibility --practical-max-steps N)
  • Retro cache hit-rate in SearchStats + --verbose
  • Route cost scoring — route_cost field + --bb-prices path.csv / --stock stock.csv
  • Cargo workspace — crates/renkin-forward/ + crates/renkin-kg/
  • renkin-forward predict / validate — forward prediction + route validation (stdin-pipe friendly)
  • renkin-doctor — environment diagnostic binary (templates, BBs, Python, binaries)
  • Failure diagnostics — zero-route output includes likely_causes + suggestions JSON block
  • --format explain|compare|compare-json — human-readable and tabular route output
  • renkin stock stats|validate|coverage — stock CSV management subcommand
  • Pareto multi-objective search — --format pareto, --objectives, find_pareto_routes MCP
  • Constraint DSL — --constraints JSON, plan_with_constraints MCP tool
  • renkin template stats|validate|dedup|explain|coverage — template quality tools
  • renkin-kg — reaction knowledge graph (bipartite mol↔reaction, GraphML/Cypher export)
  • MCP server (renkin-mcp) — expanded to 6 tools (explain_route, find_pareto_routes, plan_with_constraints, ...)
  • Core search engine foundation — SMIRKS retro-reaction rules + fragment sanitization, A*/AND-OR tree search with closed list + degenerate-route filter, SA Score heuristic + beam search, rayon parallel rule application (sequential fallback on WASM), FxHashMap/SmallVec beam frontier/SA-Score-memoization/Arc<PathNode> path-sharing perf work
  • Multi-target packaging — Python bindings (PyO3 + maturin, pip install renkin), WASM build (npm install renkin), published to crates.io/PyPI/npm with GitHub Actions CI/CD, WASM browser playground + i18n (EN/JA/ZH)
  • Benchmark CLI (renkin-bench) + USPTO-50k evaluation, --format tree|mermaid visualization, MkDocs documentation site + GitHub Pages playground
  • Graph-based biaryl cleavage · O(1) canonical-SMILES BB index
  • Tetrahedral stereo @/@@ + E/Z double-bond stereo
  • NN template scorer via --scorer flag (tract-onnx, Pure Rust ONNX)
  • Constraint-based search (--avoid-elements, --require-elements) + --verbose search statistics
  • #![forbid(unsafe_code)] — compiler-enforced Pure Safe Rust from the start

Citation

If you use RENKIN in academic work, please cite it — see CITATION.cff for the canonical, version-tracked citation record. GitHub's "Cite this repository" button (top of the repo page) reads it directly and can export APA or BibTeX on demand.


Security

Report vulnerabilities via GitHub Private vulnerability reporting. See SECURITY.md.


License

MIT


GitHub Topics: retrosynthesis cheminformatics wasm rust drug-discovery casp synthesis-planning computational-chemistry


If RENKIN saves you time, a GitHub star helps others discover it.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

renkin-1.0.0.tar.gz (1.9 MB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

renkin-1.0.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.6 MB view details)

Uploaded PyPymanylinux: glibc 2.17+ x86-64

renkin-1.0.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.5 MB view details)

Uploaded PyPymanylinux: glibc 2.17+ ARM64

renkin-1.0.0-cp315-cp315t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.6 MB view details)

Uploaded CPython 3.15tmanylinux: glibc 2.17+ x86-64

renkin-1.0.0-cp315-cp315-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.6 MB view details)

Uploaded CPython 3.15manylinux: glibc 2.17+ x86-64

renkin-1.0.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.6 MB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.17+ x86-64

renkin-1.0.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.5 MB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.17+ ARM64

renkin-1.0.0-cp314-cp314-win_amd64.whl (1.3 MB view details)

Uploaded CPython 3.14Windows x86-64

renkin-1.0.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.6 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ x86-64

renkin-1.0.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.5 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ ARM64

renkin-1.0.0-cp314-cp314-macosx_11_0_arm64.whl (1.4 MB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

renkin-1.0.0-cp313-cp313-win_amd64.whl (1.3 MB view details)

Uploaded CPython 3.13Windows x86-64

renkin-1.0.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.6 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

renkin-1.0.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.5 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ ARM64

renkin-1.0.0-cp313-cp313-macosx_11_0_arm64.whl (1.4 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

renkin-1.0.0-cp312-cp312-win_amd64.whl (1.3 MB view details)

Uploaded CPython 3.12Windows x86-64

renkin-1.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.6 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

renkin-1.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.5 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ ARM64

renkin-1.0.0-cp312-cp312-macosx_11_0_arm64.whl (1.4 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

renkin-1.0.0-cp311-cp311-win_amd64.whl (1.3 MB view details)

Uploaded CPython 3.11Windows x86-64

renkin-1.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.6 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

renkin-1.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.5 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ ARM64

renkin-1.0.0-cp311-cp311-macosx_11_0_arm64.whl (1.4 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

renkin-1.0.0-cp310-cp310-win_amd64.whl (1.3 MB view details)

Uploaded CPython 3.10Windows x86-64

renkin-1.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.6 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

renkin-1.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.5 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ ARM64

renkin-1.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.6 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ x86-64

renkin-1.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.5 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ ARM64

renkin-1.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.5 MB view details)

Uploaded CPython 3.8manylinux: glibc 2.17+ ARM64

File details

Details for the file renkin-1.0.0.tar.gz.

File metadata

  • Download URL: renkin-1.0.0.tar.gz
  • Upload date:
  • Size: 1.9 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for renkin-1.0.0.tar.gz
Algorithm Hash digest
SHA256 352efdde92fff1f8b6a1c99fa4d00a8db5940dd107857a4ef9f0f6dd931a4787
MD5 568bc629c34e27bcdbdd0010fada8f3e
BLAKE2b-256 f7480190eec9e11630378ebe94b62ecdfb5410a4a7a8714d9ea316a9fe041d5a

See more details on using hashes here.

File details

Details for the file renkin-1.0.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for renkin-1.0.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 a99476de6dd68a6f99e03119ffda7f0ce4fde338f9c6c25598a4c871b31b1831
MD5 07934761c60076216d2d6e65a82f287e
BLAKE2b-256 cf7b0b860cebf4981c05375720e5dad5ef5d728320f0b1e06381a4950215b96c

See more details on using hashes here.

File details

Details for the file renkin-1.0.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for renkin-1.0.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 e43c0a212e24f89da86bd030632a1f0e0dddf4ef4ef30e449fcdc4497edfb12d
MD5 bf0ab022804138e32427836a50cf8723
BLAKE2b-256 73efcd9e842c09afb4581bc514f3eaf463ad48ddc3346aa91b5a4a61b7e7a6fa

See more details on using hashes here.

File details

Details for the file renkin-1.0.0-cp315-cp315t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for renkin-1.0.0-cp315-cp315t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 734c8b62bcaab87522190f29a638c4e62d13a4ddb992b82a1d5754c5e8ee8b7f
MD5 cf78cec9de0174c132e75d62abc876ea
BLAKE2b-256 5c0f20d5de3e97db442afd56a8e1341bcd9e5cf30b6cf893d3f37f57680fb1a3

See more details on using hashes here.

File details

Details for the file renkin-1.0.0-cp315-cp315-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for renkin-1.0.0-cp315-cp315-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 047664bb4d6a142ee67cf616978c146078d629854aa64bd7def997a1e1962b70
MD5 d8101dcd9a2dc8c79e68619d34631859
BLAKE2b-256 6d004ba80c702de58812a4b6fe4f6f2a805dfdc5a185a90a4d23122b295f9672

See more details on using hashes here.

File details

Details for the file renkin-1.0.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for renkin-1.0.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 64223d55a02601ff0966b20bba60a78081872adaf14c15e6a38c2fef3632b148
MD5 964e60f54a5e621891dd3c2726dfec4f
BLAKE2b-256 0c9db1296b2625aac3169df70e17001351ba35259544bc716b6ff75311bcf3e1

See more details on using hashes here.

File details

Details for the file renkin-1.0.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for renkin-1.0.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 8f0a5a1410bff5c02e51b25c7b1a0331d00f1f624a440952c1686ec150b612e0
MD5 60fd49076d9615892ee000e4efa3836d
BLAKE2b-256 fd76b46ef5727f2b32503326ddb4a2635a8bbe313ef2686c7df895daeeda92f6

See more details on using hashes here.

File details

Details for the file renkin-1.0.0-cp314-cp314-win_amd64.whl.

File metadata

  • Download URL: renkin-1.0.0-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 1.3 MB
  • Tags: CPython 3.14, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for renkin-1.0.0-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 8b567937621112ba348892a812989e30f8b13228453503a06743e4ba872848ee
MD5 ffde89001185ea90e933f627b91b25c6
BLAKE2b-256 61e1a4ad86f9c3763f1ff4cc0e4a95d7c496f187528d395470212e4f5288e276

See more details on using hashes here.

File details

Details for the file renkin-1.0.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for renkin-1.0.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 1f43c46bf7fc8c7bbb017ff0b8d30a6ce94519a4b7a5847de35a00534a65c0a8
MD5 f819e2af28ebc56ee5db720194fd91db
BLAKE2b-256 39cf885d28636058a667a5be94d13f7303fc2771bda295b7a207ecae4a1d55da

See more details on using hashes here.

File details

Details for the file renkin-1.0.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for renkin-1.0.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 83ad0ee08dc344f8dd6fc5a4eb5f16fd5bc9e81e591ab6ecb2ac99b2e8aa33ee
MD5 b2e6a5afaa130c46a31e99fbdc7481b5
BLAKE2b-256 3a731858c5601bb2b744df4f6ac51a9edf4091df90a0f25f730776e1a280911b

See more details on using hashes here.

File details

Details for the file renkin-1.0.0-cp314-cp314-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for renkin-1.0.0-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a91ce17cec1b6d2f20034b049b04d4cf50e945e568b8b548774fbf3cfaaed39a
MD5 6311d8934dd75cd0dd20977f1670ce12
BLAKE2b-256 ac13ce255e8130d5d83188e963574e6e4e50cc6131d476d0e5ef55d8a0b19ba6

See more details on using hashes here.

File details

Details for the file renkin-1.0.0-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: renkin-1.0.0-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 1.3 MB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for renkin-1.0.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 55e15f6b2d11553bbef897a866a14249c15223d1cb5bc364a05fefc94e965264
MD5 0c4eb7b0a82bf5f25f00967776af3e8e
BLAKE2b-256 d521f8e032d68c4ac4d2a298ff0557957625e07042df083986635c9e58a21f89

See more details on using hashes here.

File details

Details for the file renkin-1.0.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for renkin-1.0.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 305668e789df3dc7e314cc0889e807a8e0d1f86902e353d031f2c62e3c82e914
MD5 d6c16dcda27b97f16a9f1e8e50a75284
BLAKE2b-256 42679ccdeebe74951a7e118a351e49a6fa4dea90084969fe69bfed7cb2609e9b

See more details on using hashes here.

File details

Details for the file renkin-1.0.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for renkin-1.0.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 c1ebd131893365b0fffb2a3ade23d1417fd3733fae5454867ead66bbf7604957
MD5 d7e3ddfdff559141af1c970f920b9622
BLAKE2b-256 6dae34744ac038058d6e142accf3dd11721de95ce5be5dd4c94151747d9a112e

See more details on using hashes here.

File details

Details for the file renkin-1.0.0-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for renkin-1.0.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 8199cc72f0f8dca55075b392cc8f7fe3f87864c1cd6fb685b77f5cfa932710ef
MD5 36070eaf817893040694d97cf5428fc0
BLAKE2b-256 98d45c48826eae52041e91954b982cf043e168387476f739d1fd52d1ad326e0b

See more details on using hashes here.

File details

Details for the file renkin-1.0.0-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: renkin-1.0.0-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 1.3 MB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for renkin-1.0.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 e5bb0a75b5d36a1635a8f516d49d4680c95ef7f13c9863bba2b0ab9c65fa3025
MD5 0f9b23ff21e93fa93d3a6f3c54842603
BLAKE2b-256 0451df6e24a985c6362db7ef5d62883b5c84e9edf6f9295a85efe9fb9bcbd972

See more details on using hashes here.

File details

Details for the file renkin-1.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for renkin-1.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 3337b67210625a54cb221b095fc0a31a1673ca5ecf9d78d58ab10cde76a8bc88
MD5 444058cb4b2ce16751eb760b399fa736
BLAKE2b-256 6b57369c79d7a8253a84a58f3fbaedac4c921a47da172af6dc1490d319f10623

See more details on using hashes here.

File details

Details for the file renkin-1.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for renkin-1.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 2f36d25d5a22d922d915bc1fb86b0ac71f872a0ae164c36f259917f570c2b183
MD5 b1a6aa1a8f6e2b8424cdf6685f6e693e
BLAKE2b-256 3f569aeedca8371662b90889babf97763c949a321ad0f714bcf029b9bb8adf3b

See more details on using hashes here.

File details

Details for the file renkin-1.0.0-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for renkin-1.0.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c3eb6cfde5ae679eb402ecbfe3dabf1adbf990bca1987f7f656b39c471ab1700
MD5 b42b11c1b1d79a44166db210b854b8e4
BLAKE2b-256 79c8ffd4677ce8073e93546b69b5fdd95211de4ef3d4a6813f5f264da322d306

See more details on using hashes here.

File details

Details for the file renkin-1.0.0-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: renkin-1.0.0-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 1.3 MB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for renkin-1.0.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 7ea51a0ff7217ae925b9bb03b731b779abc1e77c85b62a5e3408a80f911585e3
MD5 88257f54bbc14e10254ef3a9cd77291f
BLAKE2b-256 a06affd0021f38a4b406bdfd66ea83c32a61130b633cf4c122b410923e9a7c68

See more details on using hashes here.

File details

Details for the file renkin-1.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for renkin-1.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 f9587f037d7d253c3c9e3dda4716756bccfa6f891881ef108bef639139b46062
MD5 55abcff5d16a891788148066337c59d6
BLAKE2b-256 d02c090a93c7efbc004d9e5a709c8d0af5b1c28c51bc812bfb26d38c705f0793

See more details on using hashes here.

File details

Details for the file renkin-1.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for renkin-1.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 71a6c484345584583e59d3f1fe0ab63d0e7973f43ee4d42f1d2f8b7fc999abfb
MD5 a7f0513ece5d84b1c4d58ef2e6883d3e
BLAKE2b-256 25d4c9a54940216245b68a542b11a2b16ed522e03cc62fa568712888b27f4451

See more details on using hashes here.

File details

Details for the file renkin-1.0.0-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for renkin-1.0.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c82711faba7988babf110e91326106c53de21978fa6441c1509470fa0937a518
MD5 fcdc025c992d88d46817f8d09b96faaa
BLAKE2b-256 2e0029f6ec760c565a8301184438bfc93cab5ee09145bbb960bc43de32727185

See more details on using hashes here.

File details

Details for the file renkin-1.0.0-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: renkin-1.0.0-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 1.3 MB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for renkin-1.0.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 412b04845a8e187f3f2a47f434d6d4ca7579e8aff7f56a172af12ebe487b2d28
MD5 782875eb1d52e9a06d8182a20c97ab69
BLAKE2b-256 3d3e482ce55eb36811ce8f4ca2a1eb1ab0c831ab76325ed0e115e25bd327dfbd

See more details on using hashes here.

File details

Details for the file renkin-1.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for renkin-1.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 6c9aa58b2cd1193be265606c6025d846c08b1b04605c46338339659fa127581b
MD5 94100a7bcfb1573cad4b720786ef18f3
BLAKE2b-256 260fedd23e170b69e388b1e2e357ec60aa24a9ae7b7e15f60277107e20d7d6db

See more details on using hashes here.

File details

Details for the file renkin-1.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for renkin-1.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 ff4d896243abf74f867b21f765524bb770850f539b0ee5841f05685098aea60c
MD5 7d252c6462866c37327a69bb94f4719e
BLAKE2b-256 ddbce42136eb26d3a9a4e1553d75de9f5405feed452ec8ead37b2d51fa6cd7d5

See more details on using hashes here.

File details

Details for the file renkin-1.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for renkin-1.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 6a564c295344c063d773aec80f05e28abdb3cfb90e057cf659f5c4e4d2bfa1de
MD5 7286d73878c76b03031943f6001663ea
BLAKE2b-256 fefdbdc985e42a06cb94552f848d8b58ae84387e458ba3938e55065d67de368c

See more details on using hashes here.

File details

Details for the file renkin-1.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for renkin-1.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 06fe17ecf6d0907265276ff253a828af0241268dc40c82c2a4f0704aa7e94bd6
MD5 60cfea5f85cb1a7709b8c24cae1fb663
BLAKE2b-256 62527dee0028cb70d3b585f3579aeac89d98d1cb1e2d6bf4181d841c5896ab37

See more details on using hashes here.

File details

Details for the file renkin-1.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for renkin-1.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 c80acac2b8bd8bb0853e39dfd2940b5dbaabcced97a5f885551623bee39536ad
MD5 211cb0b6063a2ed73e4dfe2937b14472
BLAKE2b-256 38324e2ceedb478298e873feb4cac96b7cb1c8752c3d406332a0651a8fe09b69

See more details on using hashes here.

Release history Release notifications | RSS feed

1.0.2

29 files

1.0.1

29 files

This release

1.0.0 This release

29 files

0.61.0

29 files

0.60.0

29 files

0.59.0

29 files

0.58.0

29 files

0.57.0

29 files

0.56.0

29 files

0.55.1

29 files

0.55.0

29 files

0.54.1

29 files

0.54.0

29 files

0.53.0

29 files

0.52.0

29 files

0.51.0

29 files

0.50.0

29 files

0.49.0

29 files

0.48.0

29 files

0.47.0

29 files

0.46.0

29 files

0.45.0

29 files

0.44.0

29 files

0.43.0

29 files

0.42.0

29 files

0.41.0

29 files

0.40.0

29 files

0.39.0

29 files

0.38.0

29 files

0.37.0

29 files

0.36.0

29 files

0.35.0

29 files

0.34.0

29 files

0.33.0

29 files

0.32.0

29 files

0.31.0

29 files

0.30.0

29 files

0.29.0

29 files

0.28.0

29 files

0.27.0

29 files

0.26.0

29 files

0.25.0

29 files

0.24.0

29 files

0.23.0

29 files

0.22.0

29 files

0.21.1

29 files

0.21.0

29 files

0.20.0

29 files

0.19.0

29 files

0.18.0

29 files

0.17.0

29 files

0.16.0

29 files

0.15.4

29 files

0.15.3

29 files

0.15.2

29 files

0.15.1

29 files

0.15.0

29 files

0.1.0

29 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page