kodukeelkodukeel
EnglishEesti
Start freeStartStart free

How we know

Last updated 15 October 2026

Each claim this project makes about itself, the figure behind it, the day it was measured, and the command that measures it again. Run the command on a copy of the repository and you should get the same figure. The file named under each claim is the one that fails if the rule behind it breaks.

Most figures are rewritten by npm run evidence, which re-runs every audit that needs no server and no database. The rest need a running build or a database, so a person wrote them down with the day and the place they ran. Each row says which. A figure older than the latest release is still a figure, so its date is printed rather than hidden. The wider picture is on the trust page, and what it costs to run is on the funding page.

16 claims

  • Every person of a verb the app works out from a stored first person agrees with what Ekilex records for that verb.

    Figure
    806 verbs, none disagreeing
    Measured
    15 October 2026, by npm run evidence
    Command
    npm run audit:verbs
    Asserted in
    lib/estonian/conjugate.test.ts, which fails on a person ending the rule gets wrong
  • Every regular case of a noun the app works out from its stored forms agrees with the form Ekilex records.

    Figure
    5,229 nouns, 1 disagreeing (grappa)
    Measured
    15 October 2026, by npm run evidence
    Command
    npm run audit:cases
    Asserted in
    lib/estonian/attested.test.ts, which walks every shipped entry and fails on a case that disagrees
  • No question the app can build from the shipped dictionary prints its own answer.

    Figure
    83,165 questions over 6,274 entries, none printing its answer
    Measured
    15 October 2026, by npm run evidence
    Command
    npm run audit:questions
    Asserted in
    .github/workflows/ci.yml, which runs the audit on every pull request and fails on one
  • Every question and sentence the app builds makes sense for the word it is about.

    Figure
    60,298 questions and sentences over 6,274 entries, none failing
    Measured
    15 October 2026, by npm run evidence
    Command
    npm run audit:sense
    Asserted in
    .github/workflows/ci.yml, which runs the audit on every pull request and fails on one
  • The level check places a learner who says they do not know at their own level most of the time, and almost never above it.

    Figure
    At their own level 55% to 97% of the time across six levels, above it at most 3%
    Measured
    15 October 2026, by npm run evidence
    Command
    npm run measure:placement
    Asserted in
    lib/assessment/session.test.ts, which checks a band ends early only where the finished band would agree
  • A one-letter slip is forgiven only from eight letters, because below that a slip usually spells another real word.

    Figure
    140 pairs of real answers one letter apart at seven letters, 43 at eight
    Measured
    15 October 2026, by npm run evidence
    Command
    npm run measure:typo-collisions
    Asserted in
    lib/estonian/answer.test.ts, which fails on a short answer marked as a slip
  • No package the app runs on is under a license that would bind the project's own code.

    Figure
    196 packages, none under a license that would bind the code
    Measured
    15 October 2026, by npm run evidence
    Command
    npm run check:licences
    Asserted in
    .github/workflows/ci.yml, which runs the license check on every pull request
  • The rules in CLAUDE.md are asserted by checks that read the source, not described.

    Figure
    803 checks, all holding
    Measured
    15 October 2026, by npm run evidence
    Command
    npm run test:invariants
    Asserted in
    scripts/test-invariants.ts, which exits non-zero on a broken rule, and CI runs it
  • The unit suite runs with no database, no network and no clock it does not control.

    Figure
    6,127 tests in 337 files, all passing
    Measured
    15 October 2026, by npm run evidence
    Command
    npm run test
    Asserted in
    vitest.config.mts, which blanks every variable the app reads and pins the time zone
  • No credential reaches the code a browser downloads.

    Figure
    Passed
    Measured
    15 October 2026, CI run #3181 on main
    Command
    npm run check:secrets
    Asserted in
    .github/workflows/ci.yml, which builds with a marked string in every server-only variable and searches the output
  • Text and icons stay inside the boxes they were drawn in, on every route, at three widths and in both themes.

    Figure
    9,061 checks, none failed
    Measured
    15 October 2026, CI against a production build, the third-batch branch
    Command
    npm run test:containment
    Asserted in
    scripts/test-containment.mjs, which measures the rectangles and fails on one outside its box
  • No page scrolls sideways on a phone, and every control under a finger is at least 44 pixels.

    Figure
    195 checks, none failed
    Measured
    15 October 2026, a local run against a production build
    Command
    npm run test:mobile
    Asserted in
    scripts/test-mobile.mjs, which measures five widths and fails on overflow or a small target
  • An automated accessibility checker finds no fault on any route, in the light theme or the dark.

    Figure
    1,151 checks, none failed
    Measured
    15 October 2026, CI against a production build, the third-batch branch
    Command
    npm run test:a11y
    Asserted in
    scripts/a11y-check.mjs, which runs axe on every route in both themes and fails on a violation
  • Progress is worked out from the review log on every request and still answers quickly for a learner with a year of history.

    Figure
    Every query under 32 ms and every page under 610 ms at the 95th percentile
    Measured
    15 October 2026, a local run, 40 learners and 5,000 reviews each
    Command
    npm run test:load
    Asserted in
    scripts/load-test.mjs, which fails a query over 400 ms or a page over 1,500 ms at the 95th percentile
  • A dump of the database restores into an empty one with every row and the app healthy against the copy.

    Figure
    30 tables and 202,023 rows matched, healthy in 10.2 seconds
    Measured
    15 October 2026, a local database, not a production backup
    Command
    npm run drill:restore
    Asserted in
    scripts/restore-drill.mjs, which compares every table's rows and asks the health check
  • Every English gloss in the built dictionary still says what the Wiktionary page it came from says.

    Figure
    5,363 entries, none disagreeing
    Measured
    31 August 2026, a full run by hand
    Command
    npm run audit:glosses
    Asserted in
    .github/workflows/drift.yml, which re-reads the pages every week

What is not on this page

A claim with no command behind it. This project has no SOC 2 report, no ISO 27001 certificate and no external penetration test, and none of the checks here stands in for one. The accessibility figures are automated checks, which find some faults and not others; the accessibility statement says what a person has to judge.

Privacy, Terms, Funding, Trust, For teachers, Running a pilot, Accessibility, The state examination, Help, Sign in, Contact