Skip to main content

ablaut logo

ablaut

Fast, correct verb conjugation for 21 languages.


crates.io PyPI npm CI license

Try it in the browser


The name is the German term for the vowel gradation in singen, sang, gesungen: Jacob Grimm formalized its seven classes in 1819, and they still describe every strong verb in the language.

Highlights

  • Measured correctness. Every language is validated against two independent machine-readable lexicons. Where the two sources agree, ablaut has zero known errors in nineteen of twenty-one languages; the remaining disagreements are ruled on in published adjudication logs. CI re-checks 3.5 million forms on every change.
  • Generalizes to unseen verbs. Rule engines with curated exception tables, not lookup dumps: novel verbs (googeln, tweeter) conjugate correctly.
  • Fast and small. No I/O, no runtime data files, no dependencies in the core crate. A full table takes microseconds; all twenty-one languages fit in one small WebAssembly binary.
  • Permissively licensed. MIT OR Apache-2.0. Reference lexicons are used at test time only and never shipped.

Languages

German, French, Spanish, Catalan, Portuguese, Italian, Romanian, Swedish, English, Danish, Czech, Slovenian, Estonian, Finnish, Irish, Ukrainian, Icelandic, Japanese, Korean, Dutch, and Russian.

Each language is scored against the slots where its two reference lexicons agree; the second column is that score.

Language Verified forms Accuracy
🇩🇪 German 194,254 99.2%
🇫🇷 French 284,034 100.00%
🇪🇸 Spanish 339,200 100.00%
🇦🇩 Catalan 187,186 100.00%
🇵🇹 Portuguese 373,163 100.00%
🇮🇹 Italian 280,143 100.00%
🇷🇴 Romanian 225,494 100.00%
🇸🇪 Swedish 39,453 100.00%
🇬🇧 English 74,600 100.00%
🇩🇰 Danish 20,205 100.00%
🇨🇿 Czech 107,812 100.00%
🇸🇮 Slovenian 10,757 100.00%
🇪🇪 Estonian 24,184 100.00%
🇫🇮 Finnish 406,209 100.00%
🇮🇪 Irish 27,404 100.00%
🇺🇦 Ukrainian 71,990 100.00%
🇮🇸 Icelandic 5,749 100.00%
🇯🇵 Japanese 9,421 100.00%
🇰🇷 Korean 3,576 100.00%
🇳🇱 Dutch 27,836 100.00%
🇷🇺 Russian 151,942 99.98%

Details per language, including which lexicons are used and every adjudicated disagreement, live in docs/{lang}/.

Usage

Rust

cargo add ablaut
use ablaut::{conjugate, Conjugation, Lang};

match conjugate("vorbi", Lang::Ron)? {
    Conjugation::Ron(t) => assert_eq!(t.present[0], "vorbesc"),
    _ => unreachable!(),
}

Per-language modules expose richer APIs; the shared contract is Verb::from_infinitive and Table::build:

use ablaut::{Mood, Number, Person, Tense, Verb};

let v = Verb::from_infinitive("aufstehen")?;
v.conjugate(Tense::Present, Mood::Indicative, Person::First, Number::Singular);
// "stehe auf"

use ablaut::fra;
let v = fra::Verb::from_infinitive("appeler")?;
v.conjugate(fra::SimpleTense::Future, fra::Person::First, fra::Number::Singular);
// "appellerai"

Reverse lookup maps a conjugated form back to its infinitive(s) and the slots it fills — fully productive for German, English, French and Spanish, irregular-index-backed for all 21 languages:

use ablaut::{reverse, Lang};

let m = reverse("suis", Lang::Fra);
// être (present 1sg) and suivre (present 1sg, present 2sg)
assert_eq!(m.len(), 2);
assert_eq!(reverse("war", Lang::Deu)[0].infinitive, "sein");
assert_eq!(reverse("hablé", Lang::Spa)[0].infinitive, "hablar");

Python

pip install ablaut
import ablaut

c = ablaut.conjugate("aufstehen")   # German is the default
c.present[0]                        # "stehe auf"
c.auxiliary                         # "sein"

ablaut.conjugate("appeler", lang="fr").present[0]  # "appelle"
ablaut.conjugate("delati", lang="sl").present[3]   # "delava" (the dual)

Wheels are abi3 (Python 3.11+); no Rust toolchain needed.

WebAssembly

wasm-pack build --target web -- --features wasm
import init, { conjugate } from "./pkg/ablaut.js";
await init();
conjugate("aufstehen").present[0];   // "stehe auf"
conjugate("andare", "it").auxiliary; // "essere"

Language codes are ISO 639-1/-3 or English names, case-insensitive.

Coverage

Each language covers its full synthetic paradigm plus the analytic tenses of its written standard: German's separable prefixes and both Konjunktiv rows, French spelling doublets and reflexive clitics, Spanish enclitic imperatives with written stress, Portuguese's personal infinitive, Italian's perfect auxiliary, Romanian's synthetic pluperfect, the Scandinavian s-passives, Czech gendered participles, Slovenian's dual, Estonian and Finnish impersonals and potentials, and Irish's initial mutations. docs/design.md documents the German engine in depth; each other language documents its scope in docs/{lang}/oracles.md.

How correctness is verified

For each language, two independently derived lexicons (a Wiktionary extraction and a national or academic resource) are converted to a common format. The engine is scored on every slot where the two agree, and CI fails if accuracy regresses. Disagreements between the sources are ruled on case by case in docs/{lang}/adjudications.tsv, with references to standard grammars. The process regularly finds errors in the reference data itself; several fixes have been filed upstream.

Design

Each engine is a productive default rule plus a finite table of stored exceptions, the dual-mechanism model of inflection (Marcus, Pinker et al., 1995). Features follow the UniMorph schema.

License

MIT OR Apache-2.0.

Data provenance: the exception tables are factual data about each language (principal parts, class membership, auxiliaries), established by the agreement of independent sources and verified against reference grammars. The reference lexicons themselves are fetched at development time and never shipped, whatever their license.

Metadata

Release files for ablaut 0.8.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Built distributions (wheels)

Table of built distributions (wheels) for ablaut 0.8.0
File Interpreter ABI Platform
ablaut-0.8.0-cp311-abi3-win_amd64.whl CPython 3.11 abi3 Windows x86-64 Details
ablaut-0.8.0-cp311-abi3-manylinux_2_34_x86_64.whl CPython 3.11 abi3 Linux glibc 2.34+ x86-64 Details
ablaut-0.8.0-cp311-abi3-macosx_11_0_arm64.whl CPython 3.11 abi3 macOS 11.0+ ARM64 Details

Total release size: 5.6 MB

Release files / ablaut-0.8.0-cp311-abi3-win_amd64.whl

Download URL ablaut-0.8.0-cp311-abi3-win_amd64.whl
Size 1.8 MB
Tags CPython 3.11 Windows x86-64 abi3
SHA-256 checksum
How to use checksums
bdc493fa4985d8caf78b9d77ff36ba44c22d899e5d018cb01952e4e536f35c64
BLAKE2b-256 checksum
How to use checksums
660d14558248f5da67b7b6e59db380b23ebebe630c7aa5897a06beecef6c5aa9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 19, 2026.

Transparency log

Release files / ablaut-0.8.0-cp311-abi3-manylinux_2_34_x86_64.whl

Download URL ablaut-0.8.0-cp311-abi3-manylinux_2_34_x86_64.whl
Size 1.9 MB
Tags CPython 3.11 Linux glibc 2.34+ x86-64 abi3
SHA-256 checksum
How to use checksums
13339c167199f94aedd6d8a295c71695223ebba344541b7f41435dbd4cad1eed
BLAKE2b-256 checksum
How to use checksums
ab693c74df83f6ba3f104e57b9d8dd99c47ef754734bc3cf383b95f8513d0a59
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 19, 2026.

Transparency log

Release files / ablaut-0.8.0-cp311-abi3-macosx_11_0_arm64.whl

Download URL ablaut-0.8.0-cp311-abi3-macosx_11_0_arm64.whl
Size 1.9 MB
Tags CPython 3.11 abi3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
ed3ec359e7ebdf795a5b49c6b0a07eee13d5cf29db79001755af98780d16d55e
BLAKE2b-256 checksum
How to use checksums
a43ef2dae16dcd20b3a70a9d8ac75d5b309dcd85e53bf9843012c48fb5a07741
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 19, 2026.

Transparency log

Release history Release notifications | RSS feed

0.11.0

3 release files

0.10.0

3 release files

0.9.0

3 release files

This release

0.8.0 This release

3 release files

0.7.0

3 release files

0.1.4

3 release files

0.1.3

3 release files

0.1.2

3 release 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