LITHOS / getting started / costs

Costs

Lithos itself is free and runs on your own hardware. What costs money is the translation provider — OpenAI or Google — and it bills your API key, by the minute, for every language stream that is open. This page is about what "open" means, what a Sunday actually comes to, and the handful of settings that keep a forgotten laptop from paying for an empty room all week.

Updated for v0.6.0-beta.6, with screenshots captured from that release. Room names and settings shown are examples.

The whole model in one sentence

How you're charged

One stream per language, for every minute it is open. That is what drives the bill. Not per listener — fifty phones on Spanish cost the same as one. A stream is a live connection to the provider, and while it is open the meter runs, whether or not anyone is speaking. How the provider turns those minutes into dollars differs:

  • OpenAI charges a flat rate, about $0.034 a minute per stream, and nothing else. A silent minute costs exactly what a spoken one does, and what the meter shows is what you are billed.
  • Google Gemini charges per token — $3.50 per million in, $21.00 per million out — and the app converts that to a per-minute figure of roughly $0.037 per stream. The microphone audio is metered at a steady rate the whole time the stream is open, so a silent minute still costs (a little less), and the synthesised voice is most of the rest, so a wordy minute costs a little more. The $0.037 is a working average for continuous speech, not a tariff.
  • The self-hosted stack costs nothing per minute. It needs a GPU box — see below.

Two consequences worth holding onto. Only opening and closing streams moves the bill in any real way — muting a microphone, hiding a page, or having nobody listen does not (on Gemini a muted stream is cheaper, but not free; on OpenAI it is identical). And the bill scales with languages, not people: the cheapest thing you can do is turn on only the languages somebody in the room needs.

Where the money goes: to OpenAI or Google, on the account whose key you pasted in. Lithos never sees it. Both providers let you set a monthly spending limit on the key's account — do that too; it is the one guard that works even if the laptop is stolen.

Where the minutes come from

What opens and closes a stream

There are three places streams live, and they behave differently.

The main service

▶ Start translating (or the hall’s named Start button) opens one stream for every enabled language on the hall’s menu — at once, whether or not anyone is listening yet. ■ Stop closes them all. Switching a language off while running closes its stream immediately; switching one on opens it. Nothing else touches them.

Enabled English, Spanish and French in the Languages card.
The Languages card. Every ticked row is a stream the moment you press Start.

Why not open on demand? Because the first Spanish listener would otherwise wait several seconds for a connection while the speaker is already talking, and the sentence they came for would be lost. A service is the case where you know the languages in advance; the groups below are the case where you don't.

Classes and groups you set up

A class bills the same way whoever starts it — the operator pressing Start on the group's row, or the teacher tapping Go live on the presenter page. Either way it opens streams only for the languages phones or assigned room speakers in the class need: a class offered in four languages with phones on two of them is two streams, and when the last listener leaves and no room speaker needs the language, its stream closes after a fifteen-second grace — long enough for a language switch or a WiFi blip not to close and reopen a billed connection. A class with no phones or speaker demand costs nothing while it waits. An assigned room speaker opens its language even with no phones listening.

And it stops the same way: the teacher's Stop on the presenter page and the operator's Stop on the group's row both end the class, whoever started it. The guards below catch the day nobody presses either. The groups guide spells this out.

Private groups

The same on-demand rule, plus their own caps: how many groups can exist, how many streams they may share in total, how long one may sit empty, and how long one may live at all. Those caps are the entire cost story for attendee-created groups — the private groups guide works them through in dollars.

And one that bills from boot

Server installs have an LT_AUTOSTART=1 option that opens the main service's streams the moment the box boots. It exists for a box that only ever runs during a service and is powered off after. Leave it unset on anything that stays on.

Real numbers

What a Sunday costs

Set the hall’s Auto-stop after above 75 minutes first. Take a 75-minute service and the rates above. Multiply languages by minutes by the rate:

  • One language, 75 minutes — 75 stream-minutes. About $2.55 on OpenAI, $2.80 on Gemini.
  • Three languages, 75 minutes — 225 stream-minutes. About $7.65 on OpenAI, $8.35 on Gemini. Whether three people or three hundred are listening.
  • Add a 50-minute class offered in three languages, where phones actually pick two — 100 stream-minutes. About $3.40 more, so the whole morning lands around $11–12. (The third language costs nothing until someone chooses it.)
  • Add a private group — two people talking through one language for 20 minutes is 20 stream-minutes, under a dollar.

For a room that meets weekly, that is roughly $45–55 a month for a three-language service and a class. The same three languages for a forgotten engine running from Sunday to Tuesday would be about $300 — which is what the guards are for.

Every stream is billed, including duplicates: a language on in the main service and being listened to in a class is two streams. That is correct — they are translating two different rooms.

Seeing it as it happens

The cost meter

The operator page keeps a running estimate under the Start button: est. $ total, with the main service's share in brackets, and each class's own figure on its row further down. It adds up every five seconds, counting each live stream at its provider's rate, and it keeps counting from the moment the app was opened until you close it — so at the end of a morning it reads the whole morning, classes included.

The stopped Chapel status card with a zero cost estimate and a prompt to add an API key.
The meter, with the engine stopped. It starts moving the moment a stream is live.

Three things to know about what it says:

  • It is an estimate, not the invoice. It counts a stream only while it is fully live — the seconds spent connecting or reconnecting are not counted — and it uses the rates you have set, not what the provider's billing page later says. For OpenAI's flat rate the two agree closely; for Gemini's per-token pricing expect the bill to differ a little either way.
  • It uses the $/min rates in Service settings. Each provider's row has a rate box at the right; the defaults are the published figures above. If your account has a different rate (a discount, a different model), put yours in — the box feeds the meter and nothing else.
  • A rate of 0 makes it blind. If a provider's rate is zero the meter says so — rate not set for gemini (meter undercounts) — rather than showing a reassuring $0.00 over a live service. Older installs that saved a zero for Gemini pick up the published estimate automatically on the next start.
The OpenAI and Gemini provider rows with their per-minute rate fields.
Service settings → provider rows. The right-hand box is $/min; it feeds only the meter.

When a guard stops something on its own, the same line says why — ⏹ the main service auto-stopped (idle 20 min) — for a quarter of an hour afterwards, so a stopped engine does not look like a crash.

The ones that matter

The guards against a runaway bill

The expensive mistake is never the service. It is the engine somebody forgot to stop. Three guards, all on by default, all in Service settings on the operator page (or LT_IDLE_STOP_MIN / LT_MAX_SESSION_MIN on a server):

Service-wide idle and max auto-stop fields, set to 20 and 90 minutes; room caps are set separately.
Service settings → Auto-stop. Idle and max, in minutes; 0 switches either off.
  • Idle auto-stop (default 20 minutes). If no sound has reached the engine for this long, it stops — the main service and each class separately. This catches the engine left running after everyone went home. It listens for sound, not for listeners, so a service that is all projector and no phones is never cut off. It also means it does not catch a presenter phone left live on a table in a noisy hall — that is what the next one is for.
  • Per-room cap. New rooms, including a fresh hall, get 60 minutes under Rooms → Edit rooms → Edit → Auto-stop after. Raise it before a longer meeting: a 75-minute service needs more than the default hour. Existing saved caps are kept.
  • Service-wide max (default 90 minutes) is the fallback when a room's cap is 0. Check the room itself first; changing this fallback does not extend a room with its own explicit 60-minute cap.

And for private groups, the four caps described in the private groups guide: the number of groups, the total streams they may share, idle minutes, and lifetime.

One more that costs nothing to set: a spending limit on the provider account. OpenAI and Google both offer a monthly cap on the key's project. It is the only guard that still works if the laptop walks off with the key on it.

Before, during, after

The checklist

  1. Set a monthly limit on the provider account. Once, when you make the key.
  2. Turn on only the languages somebody needs. Each ticked language is a stream for the whole service. Turn one off the week nobody needs it; turn it back on in two taps.
  3. Leave the auto-stop guards on and set max to your longest normal meeting. Set each class's Auto-stop after to its length.
  4. Start when the speaker starts, not when you arrive. Forty minutes of prelude with three languages open is a dollar and a half of nothing.
  5. Stop when it's over. ■ Stop on the operator page for the main service; for a class, the teacher's Stop or the row's Stop — either ends it. The guards are for the day you forget; they are not the plan.
  6. Glance at the meter before you close the lid. If it reads what you expected for the morning, you're done. If it doesn't, something is still running — the sessions list under it says what.
  7. If attendees may create groups, keep the langs cap and ttl at numbers you'd be comfortable paying for in the worst case.
The other way

Paying nothing per minute

Lithos can also run its own open-weight translation stack instead of a provider — a language's provider is set to Local stack and Lithos talks to a box you run. Nothing is billed per minute. Honest trade-offs:

  • It needs a GPU machine on the LAN (or a rented one for testing), which is a real up-front cost and some setup — the recipe lives in the project's scripts/aws-stack.
  • It waits for a pause and then translates the utterance, so output lands a couple of seconds after the speaker stops rather than while they talk; the quality is good, not provider-grade.
  • Languages can be mixed: Spanish on the local stack and Khmer on Gemini, say. Only the provider languages bill.

For a room that translates every week into several languages, the maths can favour the box within a year or two. For a room that needs one language on Sundays, the provider is cheaper by a mile and needs no one to run it.

Fixes

When something's wrong

The meter says $0.00 but the service is live
Look at the same line for rate not set for … (meter undercounts). A provider's $/min box in Service settings is 0. Put the published rate in (OpenAI 0.034, Gemini 0.037) and save; the meter counts from then on. It cannot back-fill the minutes it missed — the provider's own usage page has those.
My bill is higher than the meter said
Three usual reasons. Gemini is per-token, so a wordy service costs more than the per-minute estimate; check the rate box against your last invoice and adjust. The meter resets when the app is closed, so it shows this launch, not the month. And the same key may be used elsewhere — another room, a test laptop, the bench scripts — all of which land on the same account. The provider's usage page breaks it down by day.
The engine ran all night
Something was feeding it sound, so idle auto-stop never fired — a presenter page left live, a room microphone near a fan, a browser tab still capturing. The max session guard is the one that stops this regardless; if you had set it to 0 (off), set it back to your longest meeting. Then check the provider account has a monthly limit, so the worst case has a ceiling.
It stopped by itself in the middle of the service
The line under the Start button says which guard: idle means no sound reached the engine for that many minutes — check the microphone actually feeding it; 60 min limit (or whatever you set) means the room reached its cap — raise Auto-stop after on that room for long meetings. Press Start again; nothing is lost but the gap.
Does turning a language off mid-service save money?
Yes, immediately — its stream closes everywhere the moment you untick it, and the meter stops counting it. Listeners on that language see it disappear from their menu. Turning it back on reopens the stream in a few seconds.
Do listeners cost anything? What about the projector?
No. Phones, the projector page, room speakers and the presenter page all talk to your server over your WiFi. The only thing that leaves the building is one stream per language to the provider, and that is the only thing billed.
Does a class cost extra if the main service is already on?
Yes, for the languages phones in the class actually pick — each is its own stream, because it is translating a different speaker. A class offered in five languages but listened to in one costs one stream.
Where do I set the rate my account actually pays?
Service settings → the OpenAI and Gemini rows → the last box on each. It is dollars per minute per stream, feeds the meter only, and takes effect on the next tick. Use your invoice, not the default, if they differ.

Still unsure what something cost? Write to support@lithos.community with what the meter read and the provider's usage page for the same day, and we'll reconcile the two with you.