Description
Rooster LRS makes your WordPress site an xAPI Learning Record Store (LRS). Learning applications, e-learning packages (xAPI and cmi5), simulators and learning management systems send their xAPI statements to it, and reporting tools read them back. The records stay in your own database, in the plugin’s own tables, and nothing is sent anywhere else.
Website · Documentation · Rooster LMS
What it does
- The xAPI resources under
/wp-json/rooster-lrs/xapi/: statements (store, query, void), State, Activity Profile, Agent Profile, Activities, Agents and About. - xAPI 1.0.3 and xAPI 2.0 (IEEE 9274.1.1) at the same endpoint, chosen by the
X-Experience-API-Versionheader. - Strict statement validation with clear error messages that name the property and the rule.
- xAPI Profiles: statements that follow the Rooster assessment or adaptive profile (quiz attempts and answers, from Rooster LMS Pro or any platform that emits them) have the profile’s extensions checked against their schemas. The profiles are bundled with the plugin, so nothing is fetched.
- Every statement query parameter: agent, verb, activity, registration, related activities and agents, since and until, limit, ascending, formats exact, ids and canonical, paging with
more, and statements that refer to other statements. - Attachments (multipart/mixed) and signed statements (JWS structure, payload, and the signature when the certificate is included).
- Documents with ETags and concurrency control (If-Match / If-None-Match).
- The 1.0.3 alternate request syntax and CORS for browser-based content.
- Credentials per application (HTTP Basic): a key and a secret shown once, xAPI scopes, an authority, an expiry, revocation.
- LRS Statements: a statement browser with filters and a “Void” action. LRS Credentials and LRS Settings.
- Privacy: personal-data export and erasure, erasure of one person’s records by e-mail address or xAPI agent, a retention period.
- Built for large stores: its own tables, an index for every query parameter, keyset paging (tested with 100,000 statements).
- WordPress Abilities: read-only reports (activity per course, lesson, verb or learner, time spent, unfinished activities, quiz answers per question) that AI assistants on your own site, such as Rooster One’s Insights Chat, can ask for; learners are pseudonymised.
Rooster LRS implements xAPI 1.0.3 and 2.0 and is tested against its own conformance suite; it has not yet been certified with the ADL LRS Conformance Test Suite.
When Rooster LMS is active, the screens use its design system. Rooster LRS works without it.
Endpoint and credentials
- Go to LRS Credentials and create a credential with the scopes the application needs.
- Copy the key and the secret (the secret is shown once).
- Give the application the endpoint shown on that screen (for example
https://example.com/wp-json/rooster-lrs/xapi/), the key as the user name and the secret as the password.
To forward statements from Rooster LMS Pro, create a credential with the scopes statements/write and define, and choose a custom authority with Rooster LMS Pro’s LMS agent.
Caching and security plugins
xAPI requests must never be cached. If your site uses a page cache, a CDN or a caching plugin, exclude /wp-json/rooster-lrs/ (and ?rest_route=/rooster-lrs/ on sites without pretty permalinks).
Some security plugins block REST API requests from visitors who are not logged in; allow /wp-json/rooster-lrs/ for xAPI clients. Some servers remove the Authorization header before PHP sees it; Rooster LRS also reads REDIRECT_HTTP_AUTHORIZATION and PHP_AUTH_USER.
Multi-tenant mode
For the Rooster Adaptive LMS service only, which keeps the statements of many sites in one store. It is off on every other site, where it costs nothing and nothing changes. wp rooster-lrs multi-tenant on turns it on (status and off too; off is refused while tenants exist). In this mode:
- Every stored row belongs to a tenant. A credential reads and writes its own tenant only; another tenant’s statement, document or activity answers 404, and the same statement id sent by two tenants is two statements.
- Tenants and their signed credentials are created by the service’s own plugin on the same site, through Rooster LRS’s PHP API (
RoosterLRS\Tenancy\TenantRegistry,TenantCredentials): there is no provisioning endpoint. A tenant credential may send statements and activity definitions only, at most 300 requests a minute. - Quiz answers and engagement statements that follow the Rooster profiles are also written, in the same transaction, to two tables the service’s models read (
rooster_lrs_responses,rooster_lrs_exposures).wp rooster-lrs projection rebuild --tenant=<id>derives them again from the statements. - Each tenant has its own retention period; a person’s records and a whole tenant are erased through
RoosterLRS\Privacy\TenantEraser. - LRS Statements and LRS Credentials show every tenant, with a tenant filter and column.
External services
Rooster LRS does not connect to any external service. Your site never sends anything anywhere because of it: it only answers the xAPI requests that the applications you give a credential send to it. The links below open in the browser only when someone clicks them, and the addresses after them are identifiers that are never contacted.
rooster.systems: links (on click only)
The Rooster LRS header and Home page link to the website of Oxford Metadata Ltd, the makers of Rooster LRS: the manual (https://rooster.systems/category/en/documentation/rooster-lrs/), help, feedback and rooster.systems. Nothing is sent before the click. Terms and conditions · Privacy policy
wordpress.org and Viber links (on click only)
The Rooster LRS header links to this plugin’s page and review form on wordpress.org, and to the Rooster community’s chat on Viber (https://invite.viber.com/). WordPress.org privacy · Viber terms · Viber privacy
xAPI identifiers (never contacted)
xAPI names verbs, activity types, extensions and profiles with IRIs that look like web addresses. Rooster LRS compares them as text and never opens them: the ADL verbs (http://adlnet.gov/expapi/verbs/... and https://w3id.org/xapi/adl/verbs/...), and the Rooster profiles’ own identifiers (https://rooster.systems/xapi/...), whose definitions are bundled in data/xapi-profiles/.
Privacy
Rooster LRS stores the learning records that authorised applications send: xAPI statements and documents. A statement names a learner by the identifier the sending application chose (an e-mail address, a hashed e-mail address, an OpenID or an account) and describes an activity and its result. Records stay until the site owner deletes them, a person’s records are erased, or the retention period set under LRS Settings ends. Nothing is sent to other services. The plugin adds suggested text to the privacy policy guide and registers a personal-data exporter and eraser.
Installation
- Install and activate Rooster LRS from Plugins Add New, or upload the
rooster-lrsfolder to/wp-content/plugins/. - Go to LRS Credentials and create a credential for each application that sends or reads statements.
- Give each application the endpoint shown on that screen, its key and its secret.
FAQ
-
Does Rooster LRS send data anywhere?
-
No. It makes no outbound requests. Its screens show links (to the manual, help and wordpress.org) that open only when you click them.
-
Which authentication methods are supported?
-
HTTP Basic with a credential per application. OAuth is planned.
-
How do I delete a person’s records?
-
Use Tools Erase Personal Data with their e-mail address, or LRS Settings “Erase a person’s learning records” with an e-mail address or an xAPI agent. Other systems can call
POST /wp-json/rooster-lrs/v1/erasurewith a credential that has therooster:erasescope. -
What happens to the records when I delete the plugin?
-
They stay, unless “Delete all Rooster LRS data when the plugin is deleted” is ticked under LRS Settings: then deleting the plugin removes its tables, settings and capabilities.
-
Is it fast with many statements?
-
Every query parameter has its own index and the lists page by key, so a query reads only the rows it returns. The suite stores 100,000 statements and checks the number of database queries each request makes.
Reviews
There are no reviews for this plugin.
Contributors & Developers
“Rooster LRS” is open source software. The following people have contributed to this plugin.
ContributorsTranslate “Rooster LRS” into your language.
Interested in development?
Browse the code, check out the SVN repository, or subscribe to the development log by RSS.
Changelog
1.0.0
- First version: the core LRS, xAPI 1.0.3 and 2.0 (statements, documents, attachments, signed statements, every query parameter), credentials per application, the statement browser, privacy tools and retention.
- The Rooster assessment and adaptive xAPI Profiles (JSON-LD, bundled): statements that name them have their extension values checked.
- Read-only reports as WordPress Abilities for AI assistants on the site (Rooster One’s Insights Chat): activity per course, lesson, verb or learner, time spent, activities launched but never completed, and quiz answers per question, quiz, item or skill; learners pseudonymised.
- Multi-tenant mode for the Rooster Adaptive LMS service (off by default): tenant scoping, tenant credentials issued in-process, the answer and exposure tables with their rebuild, erasure and retention per tenant.
