Every page of every course asks who is reading it.
elmo runs your training on a Kubernetes cluster you already own — the catalogue, the enrolments, the classes, the hands-on labs and the reports. Each course is a separate application behind its own hostname, and it asks elmo for permission on every request it serves. Access is worked out at that moment from enrolment, class membership and role, so it begins and ends exactly when you say it does.
Self-hosted: your cluster, your database, your directory. English and Turkish throughout, chosen per person, inside the courses as well as around them.
What is usually vague
Four questions a learning platform should answer with a mechanism.
Each of them is a design decision rather than a line on a feature list, and each has its own page here.
Who can open this, right now?
Access is usually a flag written on a row the day someone enrols, then copied and forgotten. A course that should have closed on Friday is still open on Monday, and withdrawing it means finding every place the flag was written.
Did anyone actually read it?
A completion percentage counts pages visited. Clicking through two hundred pages in three minutes scores exactly what a fortnight of evening study scores. The figure is not false; it is simply not evidence.
A percentage of what?
Most completion figures have a guessed denominator — the pages somebody has opened, rather than the pages the course contains. Read one more page and your percentage can fall, because the denominator moved underneath you.
Where does the material sit?
Licensed courseware, recordings of your own staff, a customer's documentation. A hosted platform keeps all of it on infrastructure you do not run, in a country you did not pick, under a contract you renegotiate every year.
None of these is fixed by adding a column to a report.
Measured, not claimed
Five figures, each with a source and an expiry date.
Every number on this site is stored beside the command that produces it and the date it was last checked. When one goes past its expiry the site fails to build rather than printing it. Marketing copy does not usually rot loudly, and that is the problem with marketing copy.
Access
A class opens, runs and ends — and nothing has to be cleaned up afterwards.
Access is not a row that gets written and later deleted. It is worked out on each request from what happens to be true at that moment, which is why the end of a course is an event that needs no job to run.
Someone is given access
They request a course and their manager approves it; a manager enrols them directly; or they are added to a class that carries several courses, a start date and a last day. All three can be true of the same person at once.
They open a page
The course names itself and the path it was asked for. elmo checks the session, the enrolment, every class the person belongs to and the roles they hold, then answers once — briefly cacheable, never stored as permission.
The class ends
Access through the class simply stops being true. Someone who also held that course in their own right keeps it, by construction rather than by a rule: a class was never written down as an enrolment in the first place.
The record stays
What they read, when, and for how long stays on their own transcript and on their supervisor's report. Ending access has never meant deleting the evidence that the training happened.
Reporting
Figures that say what they actually claim.
Three decisions kept this from becoming another progress bar.
The denominator is real
Each course publishes its own table of contents — the pages it contains, in reading order — and completion is measured against that. Where a course cannot publish one, the estimate is marked as an estimate rather than passed off as the course's length.
The client is the adversary
Engaged time accrues only while a page is visible, focused and being used, and every beat is re-derived against the server's clock. Counted time can never exceed real elapsed time, and a single page visit stops contributing after thirty minutes.
It flags; it does not gate
A verdict sits beside the percentage. Unmeasured is the load-bearing one: engaged time cannot be backfilled, so a course that predates the measurement says so instead of reporting zero seconds and implying nobody read it.
Hands-on
A lab the learner opens in a browser tab, running in your cluster.
An instructor hands a lab to a class; the learner starts it from their own page and works in a real terminal against real tooling. It is a group of pods in a locked-down namespace, it ends itself when the class does, and one person runs one at a time.
Where it runs
Your cluster. Your database. Your directory.
elmo installs onto a Kubernetes cluster you already operate — on-premises, or in your own cloud subscription. The database is a pod beside it. Sign-in is your own directory, or an address and a password. Nothing about running it requires an outbound connection to us.
Bring us the requirement you think will break it.
A pilot is scoped against your own criteria before anyone commits to it: which courses, which people, and which report has to be true at the end of it.
We reply with a written answer to what you asked, not a deck.