PHPackages                             adamjenkins/moodle-local\_oerexchange - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. adamjenkins/moodle-local\_oerexchange

ActiveMoodle-local

adamjenkins/moodle-local\_oerexchange
=====================================

Central catalogue and API for the OER Exchange platform: publish, browse, structure preview, licensing, reviews, moderation, sandbox integration.

00PHPCI failing

Since Jul 27Pushed 2d agoCompare

[ Source](https://github.com/adamjenkins/moodle-local_oerexchange)[ Packagist](https://packagist.org/packages/adamjenkins/moodle-local_oerexchange)[ RSS](/packages/adamjenkins-moodle-local-oerexchange/feed)WikiDiscussions main Synced today

READMEChangelogDependenciesVersions (1)Used By (0)

local\_oerexchange
==================

[](#local_oerexchange)

The central catalogue and API plugin for the **OER Exchange** platform — an open-educational-resources sharing platform built on Moodle. Runs on the dedicated Exchange site; teachers share and import through the companion [`local_oerclient`](https://github.com/adamjenkins/moodle-local_oerclient)plugin installed on their own Moodle sites.

What it does
------------

[](#what-it-does)

- **Catalogue**: publish, browse, search, structure-preview courses/activities shared from client sites, before anyone imports them.
- **Identity**: site registration (with admin approval) for client sites, plus a personal account-linking handshake so shares/reviews are attributed to a real Exchange account.
- **Licensing**: Creative Commons via core's `license_manager`.
- **Community**: adaptation-story reviews, reports, and a moderation queue. A moderator's takedown is a state of its own that the author cannot lift, and the queue can restore it.
- **Author control**: authors hide, show, delete, and replace the file of their own resources, and may decline sandbox availability with a reason. The Exchange serves exactly one version per resource — an update supersedes the previous one, keeping the catalogue entry, its link and its reviews.
- **Sharing affordances**: share buttons on resource and profile pages, with admin-configurable destinations, each showing its network's logo from Moodle's own bundled FontAwesome (nothing is bundled into the plugin). Every target is a plain link — no third-party script is loaded onto a catalogue page.
- **Abandoned courseware** (off by default): a nightly check warns the author of any published resource unmaintained past a configurable threshold (default 2 years). The author can update it or press a one-click "Still fresh" button; if neither happens within a configurable grace period (default 60 days), the resource is removed from the catalogue — into the moderation queue's restorable list, never irreversibly. Resources whose author is unreachable are left for human moderators.
- **Educator profiles**: a shareable profile page per educator (`/local_oerexchange/u/{slug}`, bio/expertise/badges/portfolio links/metrics/ resource grid), auto-created on first published resource. Author attribution and a creator/moderator-editable thumbnail on every resource, Open Graph social-preview tags via the Hooks API, a nightly badge-computation task, and a full-deletion-with-tombstone GDPR path (a departing user's shared courseware is genuinely deleted, not just anonymized, while existing links degrade gracefully instead of breaking). See `classes/local/profile_manager.php`, `classes/local/badge_manager.php`, and `classes/route/controller/`.
- **Sandbox integration**: builds Moodle Playground (in-browser, WASM) trial launch URLs — no server-side trial execution. A trial boots in the language the visitor is reading the catalogue in, where that is not English. See `classes/local/sandbox/`.

Web services
------------

[](#web-services)

Custom service `local_oerexchange` (`db/services.php`):

FunctionAuthPurpose`local_oerexchange_search`site tokenBrowse/search the catalogue`local_oerexchange_get_resource`site tokenFull detail + structure preview`local_oerexchange_publish_resource`personal tokenPublish a share`local_oerexchange_record_import`site tokenRecord a completed import`local_oerexchange_get_share_status`personal tokenLive state of one's own published resource`local_oerexchange_get_config`site tokenAdvertised limitsTwo bootstrap steps have no token yet, so they are plain public endpoints rather than WS functions: `register.php` (site registration) and `link_consume.php` (exchange a one-time code for the freshly minted personal token, from the `connect.php` account-linking handshake).

A "site key" issued on approval **is a real core web service token**, minted against a dedicated, non-interactive Moodle account created for that site (`local_oerexchange\local\site_manager`) — not a custom auth scheme.

Requirements
------------

[](#requirements)

- Moodle 5.0–5.2 (`$plugin->supported`).
- PHP as required by the target Moodle version.

Installation
------------

[](#installation)

```
git clone https://github.com/adamjenkins/moodle-local_oerexchange.git local/oerexchange
php admin/cli/upgrade.php
```

Acknowledgments
---------------

[](#acknowledgments)

This plugin's sandbox integration (`classes/local/sandbox/`) builds launch URLs for **[Moodle Playground](https://github.com/ateeducacion/moodle-playground)**— all of the actual work of running Moodle in a browser (WASM boot, blueprint provisioning, service-worker/bundle machinery) is that project's, not ours; this plugin only constructs a URL for it. Moodle Playground itself runs on **[WordPress Playground](https://github.com/WordPress/wordpress-playground)**'s `@php-wasm/web` PHP-in-WebAssembly runtime, the foundational piece that makes any of this possible in a browser tab. Deployment of the actual sandbox (building and serving the static bundles) lives in the companion `oer-sandbox`repo, whose README carries the fuller acknowledgment.

License
-------

[](#license)

GPL-3.0-or-later, see [LICENSE](LICENSE).

###  Health Score

20

—

LowBetter than 12% of packages

Maintenance65

Regular maintenance activity

Popularity0

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity11

Early-stage or recently created project

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

### Community

Maintainers

![](https://www.gravatar.com/avatar/c85ec09253e9a275a2586a0551aeea7e319d9560b0fcc4b7b41357b50e847e15?d=identicon)[wisecat](/maintainers/wisecat)

---

Top Contributors

[![adamjenkins](https://avatars.githubusercontent.com/u/11323818?v=4)](https://github.com/adamjenkins "adamjenkins (77 commits)")

### Embed Badge

![Health badge](/badges/adamjenkins-moodle-local-oerexchange/health.svg)

```
[![Health](https://phpackages.com/badges/adamjenkins-moodle-local-oerexchange/health.svg)](https://phpackages.com/packages/adamjenkins-moodle-local-oerexchange)
```

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
