What might land in mpd. Order is rough; nothing here is a hard commit. Items move from Parked to Queued when a real use case justifies the work.
Concrete shape, a use case driving it.
-
mdl-backup/mdl-restore(Moodle) — one tar bundle per project (dataroot + DB dump + config snapshot), pulled via the fileaccess SSH endpoint. Moodle-only because the dataroot ↔ DB coupling makes "snapshot the project" a real, named unit; other project types keep state ingit. -
mpd ps <project>— single-screen project status. Runtime + PHP version + DB engine/version + active sidecars + URLs + xdebug mode, all in one view. Pattern borrowed from Laravel'sphp artisan about(familiar to Moodle devs increasingly working in both ecosystems). All data already exists inMpd.Project.show/ state files — this is presentation, not new logic. -
mpd env <project>— print the resolved layered env for a project (runtime defaults → type defaults → vm overrides → project mpd.env), showing which layer set eachMPD_*key. Pattern borrowed from Laravel'sphp artisan config:show. Especially useful when the four-layer cascade lands a value you didn't expect. Implementation: invokesource-mpd-env.shwith verbose tracing, or re-implement the resolver in Swift for cleaner output.
Real possibilities, not committed work.
-
Alternate repo/branch for VM provisioning — an env var (e.g.
MPD_REPO,MPD_BRANCH) thatcreate-vm.ps1/create-vm.shpass to cloud-init so the VM clones a feature branch or a fork instead of the defaultmain. Useful during development of mpd itself: test a branch end-to-end without changing the scripts permanently. Needs a matching override inconfigure-client.ps1so the self-update and branch-awareness story is consistent. -
Self-update — after the first stable release, long-lived VMs will need a way to upgrade mpd without re-provisioning. Shape TBD (standalone tool,
mpd --self-update, or something else). -
Runtime SSH banner — install a branded
/etc/motdinside each runtime container (php, node, util) so users see a welcome message and tool hints when they SSH into<rt>.runtime.mpd.test. Common content inassets/runtime-base/motd(installed bybootstrap.sh), runtime-specific additions inassets/runtimes/<rt>/motd(appended bybuild.sh). Written directly to/etc/motd— no PAM/update-motd.d needed in containers. -
mpd purgevsmpd deletesplit —deleteremoves containers, DB, and mpd state (today's behavior);purgeadditionally wipes the source checkout at/srv/projects/<project>/. Useful when a demo or experiment is fully thrown away and disk space matters. -
Pre-built runtime images — publish versioned OCI images for the php, node, and util runtimes to a registry (GitHub Container Registry or similar) so
mpd --runtime-createpulls instead of builds. Cuts the first-run wait from several minutes to seconds.demobecomes near-instant after the image pull.make imagesbuilds and pushes all runtime images; CI runs it on release tags. Local--runtime-buildflag kept for dev iteration. -
mpd --gc— sweep unreferenced DB containers, orphaned data dirs, dnsmasq records for deleted projects. Open question: destructive default or interactive plan +--yes? -
Cloudflare Zero Trust integration for cftunnel — the v1 cftunnel flow exposes projects publicly (or behind whatever the user manually configures in the CF dashboard). A future iteration could codify the Zero-Trust-protected workflow: a sibling project- type (or a flag on
cftunnel) that targets the per-app CF wizard, pre-fills the internal hostname / port, and produces a 1:1 Access-protected app per target. Naming convention to consider:<target>-cftunnel(per-target, ZT-gated) vs barecftunnel(shared connector, public-or-manually-protected). Also: a per- moodleMPD_PHP_MOODLE_CFTUNNEL_HOST=<custom>override so the wwwroot detection works when the public hostname diverges from<projectname><domain>. Parked until a real use case drives the shape. -
Newbie-onboarding docs — for Moodle-curious folks who don't already know what a plugin is.
-
AI-driven demo provisioning — agent running inside mpd VM's Gnome desktop drives Firefox through Moodle's first-time install wizard, installs a set of plugins, populates the site with sample course content and activity data, hands you a fully-populated demo site. Useful for workshop prep, training environments, "what does this plugin actually look like" pitches. The data-generator side has prior work to build on; the new piece is the agent-driven first-install / plugin-install flow.
-
Composer-based Moodle installation + plugin management — Moodle is moving toward
composer create-project moodle/moodleas the production install path, with plugins managed via composer.json too (no more zip-and-drop). This is the future shape of Moodle deployments, but not yet fully stable, and gated on the new Moodle marketplace landing (which may or may not go smoothly). When it does stabilize, mpd's moodle project type gets acomposerinstall mode alongside the currentgit-clonemode, and the layered env grows a way to declare plugins declaratively. Wait-and-see; no work scheduled until upstream settles. -
mpd quickstartdriven by composer-based Moodle install — once composer-based Moodle install is stable (item above), the one-shot quickstart flow gets rebuilt on top of it instead of the currentgit clone moodle/moodlepath. The win is plugin management:composer require moodle-local/<plugin>becomes a first-class part of project setup, sompd quickstart moodle52 --plugins=local_foo,mod_barprovisions a Moodle install with those plugins already wired in. The currentdemo moodle v5.2.0one-liner stays as the simple-case shortcut. Blocked on the composer install item above.