I didn't find any blockers and recommend this plugin for approval.
What it does
A learner opens the activity, chooses which topics to practise (question bank categories the teacher has exposed), and plays a run of single-answer multiple-choice questions. After each answer they see an explanation drawn from the question's general feedback. One wrong answer ends the run. Personal bests are tracked per scope, so there is always a number to beat, whether the learner is revising one topic or the whole course.
The activity is deliberately ungraded. It is low-stakes practice, and staying out of the gradebook is part of the design: teachers can add it to any course without changing how the course is assessed.



Try the mechanic here
This is the One Life loop rebuilt in the browser so you can feel it without installing anything: pick your topics, answer, and one wrong answer ends the run. The questions below are invented for this page. In the real plugin they come from the course question bank, and the explanation under each answer is the question's own general feedback.
Prefer the real thing? Install One Life from the Moodle Marketplace.
Design decisions worth knowing
- Learner-driven, not teacher-configured. Existing quiz-game plugins let the teacher choose what is played. One Life lets the learner choose the scope at play time and keeps personal records across scopes. That is the difference from
mod_game, which is credited as prior art in the README. - One feedback field, two uses. If a question's general feedback contains a horizontal rule, only the part after the rule is shown in the run. The same question keeps working in a normal quiz.
- Honest backup and restore. Course backups carry question history correctly. Activity-only backups cannot, because the question bank is not in them, so the plugin clears those references on restore rather than pointing at whichever question now occupies the id. The README says exactly what is kept and what is not.
- Question bank changes across versions. Moodle 5.0 moved the question bank into
mod_qbank. The repository layer is tested for both worlds, and tests skip rather than assert a layout that does not exist on a given branch.
How it is built
- Pure-function game engine (
next_streak,score_percent, explanation extraction) with tests written before the implementation. - Topic repository over the question bank, tested for its three load-bearing behaviours on every supported branch.
- Full activity module surface: instance settings, completion rules, events, backup and restore with user data, privacy provider (export and delete), reset, generator for tests.
- Mustache templates and AMD JavaScript for the play screen, strings through the language pack, ARIA via core helpers.
Quality
- PHPUnit176 tests
- Behat5 scenarios
- CI16 jobs passing
- Moodle4.5 to 5.2
- PHP8.1 to 8.4
- DBPostgreSQL, MariaDB
- MarketplacePublished, plugin 4140
The CI matrix runs Moodle 4.5, 5.0, 5.1 and 5.2, each on the PHP versions that branch supports, on both PostgreSQL and MariaDB. Both databases are tested because the plugin ships an XMLDB schema and engine differences bite. PHPUnit covers the engine, the repository, run lifecycle, completion, events, backup classes, privacy and reset. Behat covers the core journey: add an instance, pick a scope, play, answer wrong, see the result and the personal best.
Marketplace review
Submitted to the Moodle Marketplace under ticket MMR-208. The reviewer found no blockers and recommended the plugin for approval, and it is now published in the plugins directory for Moodle 4.5 to 5.2. The review checks coding standards, security, privacy compliance, language strings, documentation and version metadata; building to that standard is how I write every plugin, client work included.
Related: report_transcript
A second plugin, a verifiable learner transcript report, is published in the directory too. Read about report_transcript.
