kodukeelStart freeStart free

Funding

Last updated 2 September 2026

Kodukeel is free to use, there’s nothing to buy, and nothing about you is sold. This page shows the math behind that sentence: what the app runs on, what each piece costs, who’s paying for the copy you’re reading, and what would change if somebody funded it.

Who pays for this copy

This installation is run by Upthink Solutions OÜ, and they pay the bills on this page. Kodukeel is software anyone can install rather than one service, so every copy has its own operator and its own invoice.

The code is MIT licensed and the dictionary data is not ours to license: Ekilex is CC BY 4.0 and Wiktionary is CC BY-SA 4.0, which is share-alike and therefore reaches the built dictionary as well. Anyone may run their own copy, and at one learner it costs the price of a domain name.

An organization thinking of trying it with a group can read what a pilot is, which says what it costs them, which is nothing to run.

Every claim this project makes about itself is listed on how we know, with its figure, the day it was measured and the command that measures it again.

What it runs on

12 things, and every one of them has a price on it. The list is longer than the one on the privacy page, because that page answers a narrower question: a service can hold every row in the database without ever being told who a learner is.

Nothing anybody bills us for is counted as free. Every vendor here is on the plan a real deployment is on, because a free tier either pauses when nobody’s using it or forbids commercial use, and pricing one would describe a deployment nobody actually runs.

What is given is credited, not priced. Ekilex, Wiktionary and TartuNLP are public institutions that decided this work should be available. They ask for nothing, so they are named here with what each one gives and the license it comes under, and they appear in no total. Where buying the same thing is possible the panel says what that would come to. The last line of each card says what the app does without it.

  • Vercelon here

    Vercel, in the same region as the database

    Runs the app: every page rendered, every action answered, the speech proxy and the tutor route.

    Without it: The pages a phone has already seen still open, and nothing new loads.

  • Supabaseon here

    Supabase, holding the database, the sign-ins and the cached speech

    Every deck, every review, the dictionary, who is signed in, and the speech files keyed by their content.

    Without it: Nothing works, and the landing page shrinks to a five-word dictionary.

  • The language modelon here

    Google and Anthropic, with Groq behind them: Anthropic writes the conversations and reads a page, and Google answers Anu

    Anu, the note on a piece of writing, and reading a photographed page. Never a single Estonian form.

    Without it: Anu says she can't reach anyone. Review, the dictionary and every drill keep working as normal.

  • Estonian speechon here

    TartuNLP, at the University of Tartu

    Reads a word or a sentence aloud in any of ten voices. Every clip is cached and asked for once.

    Without it: Cards go quiet, and the listening part of the mock exam says so instead of breaking.

  • Hearing Estoniannot set here

    This site's own hosting, serving TalTech's speech model beside the pages

    Turns what a learner says into text on their own device. The model is fetched once per device in the background and kept, so this line is the download and nothing else.

    Without it: Every microphone disappears and everything is typed, exactly as before speaking existed.

  • Ekilex and Wiktionaryon here

    The Institute of the Estonian Language, and the Wikimedia Foundation

    Every Estonian form and example sentence, and the English meaning of most of the dictionary.

    Without it: Live lookups stop. The seeded dictionary carries on, and a word it lacks is simply missing.

  • Resendon here

    Resend, sending the mailed sign-in links

    Sends a sign-in link to anybody without a Google account, and the occasional reminder.

    Without it: Google sign-in still works. Everybody else is locked out.

  • Error reportingnot set here

    Sentry, or whatever the deployment points its webhook at

    Catches anything that breaks, with personal details scrubbed: a user id, never an email address.

    Without it: Errors stay in the server log and nowhere else, just as before.

  • Claude Maxon here

    Anthropic, as the tooling that writes and maintains this

    Writes the code, the tests and the invariants, and checks each against the others.

    Without it: The app carries on running and stops being worked on.

  • The domainon here

    A registrar, under the Estonian Internet Foundation

    The address people type in. By far the cheapest line here.

    Without it: The app is still there under whatever address the host gave it.

  • An Estonian news feednot set here

    Whichever public feed the deployment points at

    Suggests words off today's front page, and prints a few headlines the dictionary can open.

    Without it: The suggestion row picks seasonal or random words instead, and says so.

  • The learner's own phoneon here

    Them

    Keeps 400 clips, 60 pages and every grade that could not be sent, so review works on a train.

    Without it: There's no app without it. It's the one piece nobody here can pay for.

On this installation. Sign-in is on, so every learner has a deck of their own. Live dictionary lookups are on, and speech is cached in shared storage. Anu is answered by Google Gemini and Groq, on at least one model that charges.

What it comes to

Move the slider. Nothing here is stored or sent anywhere. The math runs in your browser, using the same code the app itself uses to decide when to stop spending.

100learners

Every month, all of it

$300.73

$3.01 a learner, and every cent of it an invoice somebody sends. In US dollars and net of VAT, which is how the vendors quote their own prices.

Not counted above: buying the speech this app is given would come to a further $2.88 a month.

How hard they study

Cards read themselves aloud

The tutor

Which model answers

Years of reviews already stored

Where it goes

  • Vercel$20.00

    Pro

    The Pro plan's own fee. Nothing here is over its allowance yet.

    • Requests answered52,823 of 1,000,000 included

    • Files served209,243 of 10,000,000 included

    • Data out621 MB of 1,000 GB included

    • Processor time35 min of 4 hours included

  • Supabase$25.00

    Pro, Micro

    The Pro plan's own fee, with the smallest instance inside its compute credit.

    • Database177 MB of 8 GB included

    • Data out632 MB of 250 GB included

    • Speech stored759 MB of 100 GB included

    • People signing in100 of 100,000 included

  • The language model$1.20

    Gemini Flash-Lite

    A question and a writing note on Gemini Flash-Lite, priced the way the ledger prices one before it makes the call.

  • Estonian speechgiven

    Public, and asks for nothing

    180,000 characters read aloud a month, in a real Estonian voice, which would come to $2.88 a month to buy.

    A public research group at the University of Tartu, which charges nothing.

  • Hearing Estonian$0.27

    Hosting transfer

    About 25 downloads of 71 MB a month, at the host's transfer rate.

  • Ekilex and Wiktionarygiven

    Public, and asks for nothing, Ekilex under CC BY 4.0, Wiktionary under CC BY-SA 4.0

    6,280 checked entries with 40,355 forms, and the attested sentences every exercise is built from.

    Neither asks for anything, and neither has a price to quote: nothing else holds a checked Estonian case table with attested sentences, so there is nothing to compare it against.

  • Resend$20.00

    Pro

    The Pro plan. The free tier sends a hundred a day from a shared address, which is for testing.

    • Emails sent300 of 50,000 included

  • Error reporting$26.00

    Team

    A flat plan. It bills by volume of errors rather than by learners, and a well-behaved month is nowhere near the allowance.

  • Claude Max$206.82

    Claude Max, 20x

    The only line here that is not runtime. It does not move with the number of learners, so it is most of the bill at a hundred and a rounding error at a hundred thousand.

  • The domain$1.44

    One a year

    A .ee domain. The registry charges 6 euros a year; a registrar asks about 15.

  • An Estonian news feedinside another line

    No bill of its own

    One request an hour from a function we already pay for, cached and shared by everybody.

  • The learner's own phonethe learner pays

    Not the operator's to pay

    Their hardware, their battery and their data. Every clip and page it keeps is one this deployment does not serve again.

The same app at every size

Each bar is ten times the learners of the one before it, and the heights are logarithmic, so a bar twice as tall is a bill many times larger. The shape to look at is the steps.

What the app costs a month at each size, and what that is per learner
LearnersA monthGivenEach
1$299.28$0.03$299.28
10$299.41$0.29$29.94
100$300.73$2.88$3.01
1,000$314.19$28.8031 cents
10,000$454.66$288.004.5 cents
100,000$2,390$2,8802.4 cents

The plans, the tooling, the mail and the domain come to about three hundred dollars a month before a single learner arrives, and most of that does not move when they do. So the first thousand people are nearly free to serve, and the cost per head falls by roughly a factor of ten for each decade. What grows instead is speech and the database, so past ten thousand the shape is set by how much is said aloud and how many years of reviews are being kept.

The 11 numbers we had to judge rather than measure

Everything else on this page came off a stopwatch, a database or somebody’s published price list. These are judgments, and they are here so you can disagree with a specific one rather than with the total.

  • Devices a learner downloads the speech model to, in a month: 0.25 devices

    The 71 MB is fetched once per device and kept, so this is a new phone or a cleared browser rather than a habit. A learner on a phone and a laptop downloads twice in their first month and then nothing, which spread across a year is about a quarter of a download a month.

  • Pages opened in a sitting: 6 pages

    Today, review, and a few looks at the dictionary or a grammar page on the way past.

  • New spoken clips a learner fetches in a month: 60 clips

    A phone keeps 400, so only new words cost anything. This is roughly the new cards a month at the default pace, plus their sentences.

  • Characters in a spoken phrase: 30 characters

    A word is about eight and a recorded sentence about forty. Speech is billed per character, so this is what decides that line.

  • Questions a learner asks Anu in a month: 4 questions

    The per-person cap is ten a day, so this is far under it. Most people never open her.

  • Pieces of writing a learner has looked at in a month: 8 notes

    Cheaper per call than a question and asked more often, because the writing exercise offers one every time.

  • Emails a learner is sent in a month: 3 emails

    A mailed sign-in link lasts a session, so this is a couple of sign-ins and the occasional reminder.

  • Processor time behind one request: 40 milliseconds

    A page is mostly waiting on the database, which is not charged. This is the part that is, and it is the softest number here.

  • What one page reads out of the database: 25 kilobytes

    Eight or so queries over a deck and a review log, none of which return much.

  • Learners on the app at the same moment, at the busiest: 3 percent of the month's learners

    A class arrives together, so this is higher than it looks. It decides the database instance and nothing else.

  • Times the shared JavaScript is re-fetched by a device in a month: 4 times

    It is cached until a deploy changes its name, so this is really how often the app ships.

What was measured, and how

Taken on 2 September 2026, against Postgres 16 on one machine and a production build served locally. Each row says what to run to get the same number.

Measurements taken on this repository
WhatHow much
The dictionary, in Postgresnpm run db:seed, then pg_total_relation_size over Lexeme and Form20 MB for 6,280 entries and 40,355 forms, indexes included
Postgres itself, before a single rowpg_database_size on the empty schema, subtracted from the seeded oneabout 8 MB
The speech model, downloaded once per devicenpm run asr:fetch, which checks each file against its SHA-256 and prints the total71 MB, 4 files
One review80,000 rows written by scripts/load-fixture.ts, divided into the table size300 bytes, with the four indexes that make it readable
One cardthe same fixture, 2,000 cards352 bytes, indexes included
A year of one learner, at fifteen reviews a day five days a weekthe two rows above, times the default daily goal in lib/settings/store.ts3,900 reviews and a starter deck of about 400 cards, so 1.3 MB
One spoken phrase, as storedone request to TartuNLP for a three-word sentence, passed through prepareClip in lib/audio/wav.ts, read back off the WAV header51 KB for 1.15 seconds, which is 43 KB a second
What that speech actually isthe fmt chunk of the same file, before and after16-bit PCM, 22,050 Hz, one channel, no compression; the service sends 32-bit float with half a second of silence each end, 199 KB for the same sentence
A page, as HTML over the wirecurl --compressed against the built app, seven routes14 KB for the dictionary, 88 KB for the whole course page, 21 KB in the middle
The JavaScript every page sharesthe First Load JS line of next build102 KB, fetched once per build and then cached
Requests behind one page viewChrome DevTools request counts over seven routes, twice eachabout 35, of which 11 to 15 reach the server once the browser cache is warm
What a phone keeps, so it stops askingLIMITS in public/sw.js400 spoken clips, 220 build files and 60 pages
Loading the whole dictionary into an empty deploymenttime npx tsx prisma/seed.ts3.4 seconds

A review row is 300 bytes, so a learner costs about 1.3 MB a year and the whole review log of a thousand people for a year fits in less space than a phone photograph album. A spoken clip is uncompressed audio, 43 KB for every second of it once trimmed and stored as 16-bit, which makes speech the largest thing this app moves by a wide margin. Turning the audio off in the panel above is the single biggest saving available.

Where the prices came from

Read on 22 September 2026. These are the numbers most likely to be out of date by the time you read this, which is why they carry a date rather than being folded into the total.

  • Vercel: $20 a month, then $0.15 a gigabyte out past the first 1,000.
  • Supabase: $25 a month with 8 GB of database, 100 GB of files and $10 of compute credit.
  • Database instances: from $10 a month to $3,730. This is the steepest ladder on the page.
  • Speech: $16 a million characters, which is what Amazon Polly's neural voices charge. TartuNLP charge nothing. That rate is here only to show the size of what they give, and it is in no total on this page.
  • Resend: $20 a month for 50,000 emails, then $0.9 a thousand.
  • Error reporting: $26 a month for 50,000 events.
  • Claude Max, 20x: 180 euros a month. The tooling that writes and maintains this, which is the one line here that is not runtime and the one that does not grow.
  • The euro: 1.149 dollars, the European Central Bank’s reference rate. Two lines here are billed in euros and the rest in dollars, and every price is net of VAT, which is how each vendor quotes its own.
  • A .ee domain: about 15 euros a year.

Ekilex, Wiktionary and TartuNLP are not on that list, because they do not charge. They are credited above instead, with what each one gives and the license it comes under. Where buying the same thing is possible the panel says what that would come to, and that figure is in no total here.

What that number leaves out

Somebody’s time, which is the largest real cost of this project by a long way and is not a hosting bill. The panel above prices machines. It does not price writing the course, checking 5,363 English glosses against their sources, or reading the queue of corrections learners send in.

Answering people. A dead end in this app offers to send a report, and somebody has to work through them for that to mean anything.

A bad month. The projection is a steady month. It does not model the week something is on the radio, and a plan’s included allowance is exactly where a spike is felt first.

What money would change

Four things, in the order they would matter.

The daily cap on the tutor could go up. Every model call in the app is booked against a shared budget of $3 a day, which cannot be turned off and is what stops the one line that could run away. Raising it is a knob with a stop on it rather than an open check, and at ten thousand learners it is already the thing holding that line down.

A school could keep its history. Everything on the progress screens is worked out from the review log on each request rather than stored, so the log is never thrown away and the database only grows, which makes the instance ladder the steepest line on this page.

The corrections could be worked. The dictionary is built from Ekilex and Wiktionary rather than typed, which keeps invented Estonian out of it and does not make every entry right. Learners already report the wrong ones.

Something could go back to the institutions this is built on. Ekilex, Wiktionary and TartuNLP ask for nothing and there is no suggestion they should start. But this app would not exist without any of the three, and at a size worth funding the decent thing is to support the work rather than only to use it: a contribution, a corrected entry sent back, or paying for the compute somebody else is currently absorbing.

What happens when the money stops

The figures below are the same bill as above with things switched off, in the order somebody would actually switch them off. The tooling that writes the software goes first, because a reader opening the app tomorrow does not notice it. The server and the database go last, because without those there is nothing.

Funded, $301 a month. Somebody is paid to work on it, and every part of it is switched on.

Unstaffed, $94 a month. The grant ends and nobody works on it any more. Learners don't lose a thing at this step: the software keeps running when the developer stops. What goes: Claude Max. The app carries on running and stops being worked on.

Quiet, $48 a month. The error reports only the operator reads, and the emails with sign-in links, both go. Google sign-in still works, so nobody already using it gets shut out. What goes: Claude Max. The app carries on running and stops being worked on. Error reporting. Errors stay in the server log and nowhere else, just as before. An Estonian news feed. The suggestion row picks seasonal or random words instead, and says so. Resend. Google sign-in still works. Everybody else is locked out.

Lights on, $45 a month. A server and a database, at whatever address the host gives it. Everything the course is made of still works, because none of it was ever bought. What goes: Claude Max. The app carries on running and stops being worked on. Error reporting. Errors stay in the server log and nowhere else, just as before. An Estonian news feed. The suggestion row picks seasonal or random words instead, and says so. Resend. Google sign-in still works. Everybody else is locked out. The domain. The app is still there under whatever address the host gave it. The language model. Anu says she can't reach anyone. Review, the dictionary and every drill keep working as normal. Hearing Estonian. Every microphone disappears and everything is typed, exactly as before speaking existed.

The fall is gradual because most of what this app is made of was never bought. The dictionary is Ekilex, the speech is TartuNLP, the English is Wiktionary, and all three are public institutions that decided this work should be available. The scheduler, the course, the exams, the games and the grammar run on a server and a database and nothing else. What money buys is the tutor, the polish, and somebody to work on it.

This will not become profitable. At $45 a month one unpaid person can keep it running, and it keeps teaching Estonian.

What survives even that

Six things, each a file somebody can open.

The code is MIT and the built dictionary carries the licenses of the sources it was made from. Anybody may run their own copy, including the institutions whose data it was built on, and nobody needs permission to. (LICENSE)

There is no proprietary service in the middle of it. Postgres, a Next.js app and two public APIs, so a copy runs on a laptop, in a university's own cluster, or on any host that runs Node. (README.md)

The dictionary is built by a script from Ekilex and Wiktionary rather than typed, so it can be rebuilt from scratch by somebody who has neither this database nor this deployment. (scripts/expand-seed.ts)

Every learner can take their whole record out of it at any time, in one file, and put it back into another copy. The privacy page names that right, and it is a button in Settings. (app/api/export/route.ts)

The pages a learner has already opened keep opening with no network at all, and grades taken offline are held and replayed. (lib/offline/db.ts)

Nothing a learner is taught comes from a model. The course, the dictionary, the exercises and the exams are assembled from attested sources, so the app keeps teaching with every AI key removed. (docs/03-architecture.md)

For a language this size, what money can buy that outlives the project is a corrected dictionary, a course built out of attested sources, and the code to run both, all published under a license that lets somebody else pick it up.

What it will not be spent on

There is no advertising, no analytics script and no third-party tracker on any page of this app, which the privacy page states and the code keeps true: an analytics package was mounted here once, on every visitor of the hosted build, while that same notice said there was none. It was removed rather than the notice being edited.

Nothing about a learner is sold, shared or used to train anything. Whether a teacher can see a student is answered narrowly and separately, and the answer is effort rather than contents. Each of those promises costs money to keep.

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