- Initial creation of MMPM package manager
-
Some code cleanup
-
renamed some function calls to be more idiomatic
-
Added doc-strings to functions
-
Added new method
check_for_mmpm_enhancementsto check for updates to MMPM, which will run intermittently, and prompt the user when one is found -
The user may also run
check_for_mmpm_enhancementsby specifying the-eflag -
Removed onus of installing required Python modules on user during
make installprocess by includingtryandexceptblocks inmmpm.py. Primary reason for this was based on odd segmentation faults when attempting to handle originalmake installfrom withincheck_for_mmpm_enhancements. This will be cleaned up later on, but since it seems to work, no reason to go overboard just yet. -
Still a lot more code cleanup can be done...like A LOT more.
-
Planning to break up MMPM into a module, and add functionality which will include scraping of the module pages to find any configs that can be placed into the main config,
config.jsautomatically for the user. This should be pretty doable considering it's just a JSON file, and it call be indexed into -
Next version will focus on more code cleanup, and presentation of module names. Rather than displaying everything in a large list, they will be shown in a table, that is more compact and readable.
-
Updated
display_modulesto display the output as a formatted table -
Version 0.3 will focus on performance improvements, and code cleanup
- Removed
pygit2from dependencies, and replaced withos.systemcall
- Minor change in font color when installing packages
- Fixed small bug where checking for updates could happen twice if the snapshot file needed to be updated. The enhancement command now will only run once at most in either case.
-
Accidentally created issue with
npm installby placing text color in front ofos.systemcommand -
Also, removed unused variables
- Tidying up some output messages, nothing important
- I'm done tidying up today
- forgot to remove debug statement
- cleanup
- Added new method
install_magicmirrorto handle installation/upgrades of MagicMirror itself - Can be called with
mmpm -Mormmpm --magicmirror
- Resolved major performance issue with
import pip. Changed logic to only import when needed to install packages - Reduced execution time by a lot, but there is still some issues that can be fixed to speed up more
- Still in need of more code cleanup
- Changed error handling and added user help for installing missing modules
- Planning to convert to module with setup.py file for easier installation
- Moved to setup.py format. Initial setup works, will add in system requirements later
- Adding in the makefile again because I didn't think long term about this and probably locked myself into the format of installing with a makefile...
- Small fix made to urllib import as well as fixed breaking bug in description collection
- Bug fixes to installatio
- Issue with checking for version number
- Added env variable to allow for non-traditional installation location of MagicMirror
- Bug with upgrading module
- Readme update and bug fix
- Added ability for user to configure external sources for modules
- Bug fixes
- Code cleanup
- Major code cleanup (added typing hinting, and docstrings)
- Added web interface, and daemons to run on system restart that will be accessible from any device in the users home network which allows user to perform maintenance on their MagicMirror packages
- Added better terminal output during installation process
- Added mypy and pylint configs
- Added logging for CLI
- Wrong wiki url
- integrated Travis-CI builds
- quickened installation process by retrieving artifacts from tagged builds
- Modified Makefile to reflect the changes
- Upping the tag number
- added tab for user to control Restart, Start, and Stop the MagicMirror, as well as Reboot and Power-off the RaspberryPi
- Merging into master
- Travis CI doesn't read 4 decimals on tag precision
- Prettified stdout messaging, and added upgrade option for MMPM from GUI
- Added installation rules for Arch Linux, and broke apart Makefile
- Updated url for MagicMirror installer script, (contributor: herostrat)
- Fixed installation by placing version lock on
shelljobmodule (contributor: herostrat)
- Bug fix. Changed method of loading requirements from requirements.txt within setup.py
- Bug fix. Added module name santizing, fixing installation issues with module names with slashes (contributor: herostrat)
- Bug fix. Confusing messaging when multiple modules are installed, making it unclear which modules failed to install properly
- Bug fix (#23). Added
electronto the list of processes to kill when stopping MagicMirror, and updated util functions to use pm2 for MagicMirror controls
- Enhancment (#26). Added command line option to display the MMPM web interface URL
- Enhancment (#27). Added command line option to display the currently enabled modules
- Bug fix (#29). Corrected log.info to log.logger.info in utils.py within the kill_magicmirror_processes function
- Bug fix (#no number). Fixed issue with update command, where git commands place stdout in stderr position
- Code cleanup. Split up files more appropriately
- Enhancment. Split up functionality of command line options into groups
- Enhancment. Added options for user to control MagicMirror from CLI (similar to GUI)
- Enhancment. Added ability for user to add new external module title, author, repo, and description from CLI without prompt required
- Enhancment. Added ability for user to open the MMPM GUI from terminal, and display the URL
- Enhancement. Added ability for user to view log files from CLI
- Enhancement. Reworked installation commands to handle conflicting names
- Enhancement. Reworked listing commands to display installed modules more accurately
- Bug fix (#29). Corrected
log.infotolog.logger.infoin utils.py within thekill_magicmirror_processesfunction
- Massive, massive, upgrades. Total CLI, and GUI redo. Far too many changes to list.
- added
--guided-setupoption on the CLI to assist users with setting up MMPM when first installing - cleaned up some error handling as well
- fixed small typos for the keyword
upgradeable
- Bug fix (#44): fixed screen rotation from GUI due to key in dictionary not being cast to int from string
- Bug fix (#49): added logic to skip package with containing a
<del>tag
- fixed location of custom.css
- fixed other references to custom.css
- Bug fix (#58) custom.css
- Added additional serialization to reduce loading package data bugs
- Fixes for bugs related to active modules and directories found in upgrade command
- security fixes and reorganized files (moved requirements.txt into deps folder and created dev-requirements.txt)
- updated dependency versions and fix for missing jinja module causing failed installation
- Removed
websshand terminal access in GUI - Moved from
eventlettogeventto avoid Python 3.10 issues - some code cleanup
- fixed missing leading slash of API URL
- upgraded dependencies for GUI
- fixed URL path causing duplicate static endpoints
- changed import path of gevent.monkey
patch_allcall - changed installation method of MagicMirror via
mmpm install --magicmirror
- hotfix to update parsing based on 3rd Party Modules page changes
- total rework of the entire application
- fix for opening UI url from CLI
- added guard on determining host IP address in
mmpm.constants.paths - added import guard for Python3.8 when using
importlib.resourcesinmmpm.ui - added check for MMPM being a docker image when self upgrading
- hotfix of conditional dependency
- hotfix of calling get on env vars
- removed extra log messages to reduce log pollution
- changed casing of function names in UI to conform to camelCasing
- using appropriate interpreter based on environment in ecosystem.json
- removed custom package directory extension to prevent naming issues in config.json
- removed multi-threading options from gunicorn servers
- Update
ui.pyto identify the correct location of gunicorn to resolve issues encountered when installing throughpipx
- pulled in changes from dependabot
- updated urls from PR
- Simple cleanup
-
corrected typo in
mmpm/magicmirror/magicmirror.pyinstructing user to use outdatedmmpm logcommand; now directing them to usemmpm logs -
Dropped support for Python<=3.8
-
Update dependencies
- moved to use of PDM package manager to Poetry and adjusted build scripts accordingly
- updated version of angular to mitigate vulnerabilities
- including pm2 logs in the
mmpm logs -zsubcommand - removed unnecessary print calls made in the package display method
- improved performance of displaying packages
- typo in package.py
- include assets recursively
- Replace wiki scraping with official JSON modules index (
modules.magicmirror.builders) - Remove
beautifulsoup4dependency - Improve test coverage with mocked HTTP requests
- Move
starsandlast_updatedfields from remote details to the base package fields
- Add backwards compatibility for
custom.cssandcustom.css.samplefiles based on upcoming release of MagicMirror
- Complete UI modernization: dark theme built on an oklch color system, redesigned application shell with a collapsible navigation rail, resizable right-side dock panel, and a persistent header
- Angular updated from 19 to 21; PrimeNG updated from 16 to 21; ESLint migrated to v9 flat config
- Added animated splash screen with a minimum 3-second display duration
- Added Mirror Preview panel: visually arrange MagicMirror modules across regions by drag-and-drop, with live read and write of
config.js - Marketplace: card and table views with sortable columns (title, category, author, status, stars) and resizable table columns in table view
- Marketplace: card sort controls always visible in the toolbar; per-package progress indicators during cart checkout
- Marketplace: packages flagged with INSTALLED and UPDATE badges; mmpm itself blocked from self-install
- Toggle Modules panel moved from a floating drawer into the dock alongside the cart and other panels, styled consistently with the rest of the design system
- Increased global font sizes for improved readability
- Dock resize capped to always preserve a minimum content area width
- View mode (cards/table) persisted in a cookie across sessions
MagicMirrorController.start()now detects the active display server at runtime and selects the appropriate npm start script:npm run start:x11,npm run start:wayland, ornpm run start:windows- Fixed latent bug where
ELECTRON_DISABLE_SANDBOX=1was passed as the first element of the command array, causingshutil.whichto look for it instead ofnpm - Flask now serves the Angular SPA directly, injecting
window.MMPM_CONFIGintoindex.htmlat request time; the pre-built wheel works behind a reverse proxy without rebuilding (resolves #190) - Added
MMPM_UI_API_BASE_URLandMMPM_UI_SOCKET_URLtoMMPMEnv/mmpm-env.json; set these to configure the API base URL and Socket.IO URL when running behind a reverse proxy
- Mirror Preview: fixed config.js save — brace scanning now blanks JS comments before parsing, so
{/}inside comments no longer produce phantom module blocks; newly-dragged modules are correctly appended on save - Fixed Angular template type cast in sort control binding to avoid pipe parser conflict
- Fixed fragile relative
environments/environmentimport path — replaced with@env/environmentalias defined intsconfig.json
- Added 167 new unit tests, raising coverage from 66% to 99%
- Added
TestDetectDisplayServerScriptcovering X11, Wayland (viaXDG_SESSION_TYPEandWAYLAND_DISPLAY), Windows, and the fallback path
- Added "Currently Installed" tab in the navigation rail showing all installed packages (marketplace and custom) with search, sort, card, and table views
- Mirror Preview: Config Editor save now automatically triggers a layout reset so the visual grid always reflects the saved
config.jswithout requiring a manual Reset click - Mirror Preview: persistent warning banner lists any modules referenced in
config.jsthat are not installed; clears automatically when the missing packages are installed - Config Editor: persistent warning banner below the toolbar lists the same uninstalled modules while
config.jsis active; updates live when packages are installed or the file is saved - Upgrades panel: replaced
p-listboxwith native-styled list matching the design system - Package details panel: "Upgrade now" button appears for installed packages that have an available upgrade
MagicMirrorPackage.upgrade()rewritten: usesgit stash/git stash popto preserve local changes before pulling, surfaces error text from git through to the API response and UI toasts, rolls back viagit reset --hard ORIG_HEADif dependency installation fails after a successful pullrun_cmd()gained an optionalcwdparameter;upgrade()passes it instead of using process-globalos.chdir()MMPMEnvpromoted from a per-instance__init__assignment to a class-level attribute across all 14 consumer classes, making the singleton relationship explicitmmpm list --categoriespackage count replaced O(n²) double-scan with a singleCounterpass
- Mirror Preview warning banner now fires on every code path including the localStorage cache early-return, not only when
config.jsis fetched from the API - Mirror Preview correctly picks up a
config.jssave made while the panel was off-screen (@if-destroyed), via aconfigJsDirtyflag checked on remount
- Fixed test suite after
MMPMEnvclass-level attribute refactor: replaced instance-attribute assignment (blocked by__slots__) withpatch.object(MagicMirrorPackage, "env", ...)+addCleanup - All 245 tests passing
- Fixed 404 errors on
/api/env,/api/packages, and/api/mmpm/version: themmpm.uiPM2 process now runs the Flask app (gunicorn) on port 7890 instead ofpython -m http.server, so the Angular SPA is served withwindow.MMPM_CONFIGinjection and relative/api/*calls resolve correctly - Log stream viewer: server-side replay buffer (last 500 entries) so logs accumulated while the panel was navigated away are shown immediately on return
- Log stream viewer: auto-follow scrolling rewritten using Monaco's
onDidChangeModelContentevent andsetScrollPosition— eliminates the timing race that caused follow mode to silently drop out after a few entries - Log stream viewer: "Follow" button appears in the toolbar when auto-scroll is paused; clicking it jumps to the bottom and re-enables following; scrolling back to the bottom re-enables it automatically
- Log stream viewer: level filter bar (DEBUG / INFO / WARNING / ERROR / CRITICAL) with per-level color coding; selected levels persisted as a cookie (
mmpm-log-level-filter) - Log stream viewer: configurable auto-clear window (1 h / 2 h / 4 h / 6 h default / 12 h / 24 h) with selection persisted as a cookie (
mmpm-log-max-age-h); old entries pruned every 2 minutes in the background - Database dropdown (update, upgrades) added to the "Installed" panel header, matching the Marketplace panel
- Category filter bars in Marketplace and Installed panels are now drag-scrollable with the mouse; cursor changes to a grab hand as a visual affordance
- PrimeNG toast notifications restyled to match the dark UI: dark
--bg-2base, per-severity colored borders and summary text (signal / warn / danger / accent-2), bright--fg-1detail text; achieved viadefinePresetdark token overrides anddarkModeSelector: ':root'
- Bumping version to 4.6.2 to trigger a new build
- Stale cache within CI/CD pipeline caused incorrect wheels to be built thus producing inconsistent builds
- Fixed working tree reset in
MagicMirrorPackage.upgrade()to usegit restore .instead of the deprecatedgit checkout .;git restoreis the correct modern command for discarding working tree changes
- Fixed
nix buildfailure caused by Angular attempting to inline Google Fonts over the network during the production build; disabledoptimization.fonts.inlinein the production configuration so fonts continue to load at runtime via<link>as intended - Fixed
postinstallscript bash quoting bug where[ -x $(command -v b2n) ]evaluated truthy whenb2nwas absent, causing a spurious "command not found" error in the Nix sandbox - Updated Python and UI dependencies
bun.nixno longer regenerates on everydirenv reload/ shell entry; the devshell now runsbun install --ignore-scriptsto skip lifecycle scripts during shell initialization, andlockexplicitly regeneratesbun.nixafterbun update- Added
sync:versionpre-commit hook that reads the version frompyproject.tomland keepsmmpm/__version__.pyandui/package.jsonin sync automatically on every commit - Removed unused
axiosdependency from the UI - Replaced
npm runwithnode --runin the MagicMirror start command and CI lint step (requires Node 22+)
- Available Upgrades panel: added a "Select All" row at the top of the upgrade list; clicking it selects all upgradable packages at once; the checkbox shows a tri-state appearance (checked / indeterminate / unchecked) reflecting the current selection
- Available Upgrades panel: upgrade operations now show immediate visual feedback — each item transitions to an amber spinner ("working"), then to a green check ("done") or red × ("failed") as results arrive; the "Upgrade selected" button displays "Upgrading…" with a spinning icon while the operation runs; items and the Select All row are disabled during execution to prevent accidental changes mid-run
- Shopping cart: upgradable packages selected from the Installed view are now correctly routed to
postUpgradePackagesrather thanpostRemovePackages; a dedicated "QUEUED · UPGRADE" section appears in the cart above installs and removals