Member Library Platform releasesself-updates
Canonical WordPress plugin for the member learning platform (TSOL + Liberty Classroom): library content, auth bridge, notifications — one core, per-brand config
by Thrice Agency · github.com/betterbetterbetter/toms-member-learning-plugin · website
Install
The author publishes release zips, so WP-CLI can install straight from GitHub:
wp plugin install https://github.com/betterbetterbetter/toms-member-learning-plugin/releases/download/v0.13.0/member-library-plugin.zipShips its own WordPress updater (Plugin Update Checker), so new versions show up under Dashboard → Updates.
Readme
Member Library Platform
WordPress plugin providing the member Library back office and the authentication/entitlement/catalogue bridge consumed by the Next.js Library app. One canonical multi-brand core; brand differences are per-install configuration, not forks. It powers Tom's School of Life and Liberty Classroom (and future brands).
See the workspace consolidation record in
docs/plans/plugin-consolidation-plan.md and ADR
docs/decisions/0001-one-canonical-plugin-brand-via-config.md.
What this plugin is (and is not)
- Is: the Library content model (courses, series, items, speakers,
collections, and Course/Series purchase offers), the WordPress↔app OAuth
bridge (
library-auth), the catalogue projection + signed webhooks, native MemberPress access groups, member announcements, and the active Liberty LearnDash importer. - Is not: site-specific features. TSOL-only features (accountability
modal, cookie consent) and TSOL's legacy one-shot data migrations live in
the separate TSOL companion plugin (
tomschooloflife.com/plugin).
Brand configuration
Brand values resolve PHP constant → wp_option → default via
MemberLibrary_Brand. Defaults are deliberately brand-neutral: an
unconfigured install reads as a generic member library and ships no brand
artwork. A brand sets constants in wp-config.php or the equivalent lowercase
WordPress options:
TSOL_LIBRARY_BRAND_NAME,TSOL_LIBRARY_BRAND_LIBRARY_MENU_LABEL,TSOL_LIBRARY_BRAND_APP_NAMETSOL_LIBRARY_BRAND_LOGO_URL,TSOL_LIBRARY_BRAND_IMAGE_CSP_SRC(retained compatibility metadata; the generic 403 fallback does not render branding)TSOL_LIBRARY_BRAND_CLIENT_ID
The authentication fallback is deliberately outside the brand system: it is a plain, logo-free 403 page with no project or product name.
Machine identifiers are a frozen contract
The REST namespace tsol-library/v1, all lowercase tsol_* hooks/options/
meta/cron/admin-post actions, the tsol_library_* CPT and taxonomy slugs, the
tsol_library_catalogue_webhook_outbox table, the X-TSOL-* headers, and the
TSOL_LIBRARY_* wp-config constants are a cross-brand compatibility contract
consumed literally by the app and stored in every site's database. They are
not branding and are never renamed (see
library/docs/architecture/wordpress-plugin-contract.md). The plugin's
internal PHP symbols use the MemberLibrary_ prefix; the text domain is
member-library.
Optional Access SSO integration
Access Platform SSO is an optional upstream WordPress login source. The
Library authentication bridge still loads when it is absent. MemberPress, not
Access SSO, is the protected-content authorization authority. Recognized
basenames: wp-access-sso/access-platform-sso.php,
wp-access-sso-1.1.3/access-platform-sso.php,
access-platform-sso/access-platform-sso.php.
Structure
member-library-plugin.php— entrypoint: constants, file loading, activation.includes/class-plugin.php—Member_Library_Pluginloader + feature registration.includes/class-brand.php—MemberLibrary_Brandper-install brand config.includes/features/library-auth/— OAuth bridge, tokens, revocation, account security.includes/features/library-content/— content model, catalogue, webhook, access groups, environment migration.includes/features/library-notifications/— member announcements.includes/migrations/liberty-learndash-import/— Liberty LearnDash import (CLI, host-guarded).tests/— WP-CLI contract scripts (run viatools/run-contract-tests.sh).
Testing
The tests are WP-CLI contract scripts, not PHPUnit:
tools/run-contract-tests.sh --path=/absolute/path/to/wordpress
Each also runs standalone: wp eval-file tests/<name>.php --skip-themes.
Releases
See RELEASE.md. CI (.github/workflows/ci.yml) lints PHP on every push;
release.yml builds a versioned ZIP on a vX.Y.Z tag.
Read the full README on GitHub →
Releases
| Tag | Published | Asset | Downloads |
|---|---|---|---|
| v0.13.0 | Sep 3, 2026 | member-library-plugin.zip | 0 |
| v0.12.0 | Sep 3, 2026 | member-library-plugin.zip | 2 |
| v0.11.0 | Sep 3, 2026 | member-library-plugin.zip | 0 |
| v0.10.2 | Sep 3, 2026 | member-library-plugin.zip | 1 |
| v0.10.1 | Sep 3, 2026 | member-library-plugin.zip | 0 |
| v0.10.0 | Sep 3, 2026 | member-library-plugin.zip | 0 |
| v0.9.1 | Sep 3, 2026 | member-library-plugin.zip | 1 |
| v0.9.0 | Sep 3, 2026 | member-library-plugin.zip | 2 |
| v0.8.1 | Sep 2, 2026 | member-library-plugin.zip | 2 |
| v0.8.0 | Sep 2, 2026 | member-library-plugin.zip | 1 |
| v0.7.1 | Sep 2, 2026 | member-library-plugin.zip | 1 |
| v0.7.0 | Sep 1, 2026 | member-library-plugin.zip | 3 |
| v0.6.0 | Sep 1, 2026 | member-library-plugin.zip | 2 |