elmo

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.

Request a pilotTalk to us

Self-hosted: your cluster, your database, your directory. English and Turkish throughout, chosen per person, inside the courses as well as around them.

Who is readingLearnerInstructorManageryour cluster — your network, your dataPostgreSQLLab podsCourseCourseCourseEach course is its own application, on its own hostnameon every request, before a single page renderselmoEvery page asks.sessionwho is thisenrolmentapproved for this courseclassrunning todayrolegranted the bypassAny one of these is enough. None of them is a stored flag.your directoryThe page renders. The visit is recorded.Sign in, or back to the catalogue.
What happens when someone opens one page of one course

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.

84courses running on the installation we operate ourselves
45named actions a role can be built from — code never asks for a role name
19isolation checks run from inside a live lab, not read off a policy file
30minutes: the most a single page visit can ever add to engaged time
2interface languages, chosen per person and carried into the courses

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.

How each figure is built

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.

What a lab is, and what it cannot reach

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.

Governance, data and the honest limits

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.

Request a pilotTalk to us

We reply with a written answer to what you asked, not a deck.