Skip to content
CAI
Software that uses CAICheck a score

nicoverbruggen/phpmon

59.8

Adequate · 30 September 2026

26.5k

lines of production code

Swift

primary language

2

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

PHP Monitor is a macOS menu bar application that manages local PHP development environments, primarily integrating with Laravel Valet and Homebrew. It provides capabilities for switching PHP versions, managing extensions, configuring Nginx, and monitoring service health, while also offering an onboarding wizard to automate initial setup. The system includes diagnostic tools like PHP Doctor to detect and fix configuration issues, alongside a command history tracker and customizable presets for environment state management.

How it got here

2019–2022 — Swift concurrency migration and UI overhaul

46 changes.

The project underwent a comprehensive architectural rewrite to replace the legacy Storyboard-based interface with a code-first SwiftUI design, while migrating the entire codebase to Swift concurrency for thread safety. This period focused on eliminating main-thread deadlocks by refactoring shell execution, file I/O, and PHP version switching into asynchronous, non-blocking operations. Concurrently, the application expanded its feature set with granular menu controls, robust error handling, and extensive unit and UI test coverage to support the new modular structure.

2023 — UI modernization and concurrency hardening

28 changes.

This period focused on modernizing the application's user interface by migrating components to SwiftUI and introducing comprehensive localization for multiple languages. Concurrently, the backend was refactored to improve robustness, featuring a rewrite of Homebrew integration with Swift concurrency, enhanced error handling, and new diagnostic tools like PHP Doctor.

2024–2026 — Onboarding overhaul and localization expansion

36 changes.

This period focused on replacing the legacy setup process with a comprehensive, declarative onboarding wizard that automates environment configuration and privileged command handling. Concurrently, the project significantly expanded internationalization support by adding full UI translations for multiple languages and introduced new features such as command history tracking and domain favorites.

Features

Add BusyStatus state model for UI feedback

A new BusyStatus class has been introduced in the Common/State module to manage application busy states. This model exposes published properties for busy status, title, and description, allowing the UI to display loading indicators or status messages to users. Static factory methods are provided to easily create not-busy and busy instances.

phpmon/Common/State · high confidence

Add Command History window with live duration tracking

A new Command History window has been added to the application, accessible via the menu, which displays a list of executed commands along with their status and duration. The view utilizes a dedicated window controller to present a scrollable list where active commands show a live-updating duration counter that only ticks while the row is visible on screen, optimizing performance. Completed commands display their final duration, and the list automatically scrolls to the bottom as new commands are recorded.

phpmon/Modules/Command History · high confidence

Add common Swift extensions for data, UI, and localization

This change introduces a suite of new Swift extensions in the Common/Extensions module to support core application functionality. It adds helpers for formatting and comparing version strings, chunking arrays, and pretty-printing JSON data. For the user interface, it provides utilities for resizing images, centering and shaking windows, and constructing NSMenu items with system or custom icons. It also implements a robust localization system that respects user language preferences and includes a dedicated alert handler for displaying standardized error messages.

phpmon/Common/Extensions · high confidence

Add shared utilities for timing measurements and system command execution

The phpmon-shared module now includes new Swift files providing core utility functions: a Measurement struct for tracking elapsed time in milliseconds, and system interaction helpers (system, system\_quiet, identity) for executing shell commands and retrieving the current user's username.

phpmon-shared · high confidence

Added Arabic, Bengali, and Hindi translations

PHP Monitor now includes localized user interface strings for Arabic (ar), Bengali (bn), and Hindi (hi), covering menus, configuration managers, version management, and domain list labels.

phpmon/ar.lproj, phpmon/bn.lproj, phpmon/hi.lproj · high confidence

Added Favorites feature for domain list

A new Favorites module has been introduced to the Domain List, allowing users to mark specific domains as favorites. This functionality is implemented via a new Favorites class that persists the list of favorite domains using UserDefaults, enabling users to toggle domains in and out of their favorites list.

phpmon/Modules/Domain List · high confidence

Added Indonesian language support

PHP Monitor now includes a complete Indonesian translation for its user interface, covering menus, configuration editors, version management, domain lists, and onboarding flows.

phpmon/id.lproj · high confidence

Added Internet Access Policy for macOS privacy transparency

PHP Monitor now includes an Internet Access Policy (IAP) configuration file to declare its network connections for macOS privacy transparency. This policy explicitly lists the domains the application contacts, including phpmon.app and api.phpmon.app for update checks and documentation, GitHub and the NPM registry via Homebrew for PHP formula information, and the Homebrew API for version detection. Users will see these declared purposes when the app first requests network permission, clarifying why connections to these hosts are necessary for features like version switching and update checking.

phpmon/IAP · high confidence

Added Italian and Turkish translations for PHP Monitor

PHP Monitor now includes localized user interface strings for Italian and Turkish, covering menus, configuration editors, domain lists, and health warnings. Users with these languages set in their system preferences will see the application interface translated accordingly.

phpmon/it.lproj · high confidence

Added RCFile parser for .valetrc configuration files

A new RCFile struct has been introduced in the common integration domain to parse .valetrc configuration files. This component reads the file contents, splits lines by newlines, and extracts key-value pairs separated by equals signs, while handling whitespace trimming and quote removal. This enables the application to correctly interpret .valetrc settings.

phpmon/Domain/Integrations/Common · high confidence

Added Simplified Chinese localization for PHP Monitor

The application now includes a complete Simplified Chinese (zh-Hans) translation for its user interface, covering menu items, configuration editors, PHP version management dialogs, domain lists, and onboarding flows.

phpmon/zh-Hans.lproj · high confidence

Added Spanish (es) localization for PHP Monitor

Users can now see the application interface in Spanish. This change adds the \es.lproj/Localizable.strings\ file, providing translations for all UI elements including the main menu, PHP version manager, extension manager, domain list, configuration editor, and various health warnings and tooltips.

phpmon/es.lproj · high confidence

Added SwiftUI helper utilities for environment detection and theming

A new SwiftUIHelper.swift file has been introduced to provide runtime environment checks and color definitions. It adds nonisolated properties to detect whether the app is running in test mode or SwiftUI previews, and extends the Color type with app-specific primary and debug colors, including a yellow debug color triggered by an environment variable.

phpmon/Domain/SwiftUI/Common · high confidence

Added Vietnamese and German localization for PHP Monitor

Users can now see the application interface in Vietnamese and German. This change adds the \vi.lproj\ and \de.lproj\ localization bundles, providing translated strings for the main menu, PHP version manager, extension manager, configuration editor, domain list, and onboarding flows.

phpmon/vi.lproj · high confidence

Added command tracking for testable shell and command execution

Introduced \TrackableTestableCommand\ and \TrackableTestableShell\ classes that wrap the existing testable execution components to record and monitor command activity. These new classes intercept synchronous and asynchronous shell operations (such as \sync\, \pipe\, and \attach\) as well as general command execution, using a \CommandTracker\ to log command descriptions and track their lifecycle from any thread. This enables visibility into which commands are being executed during testing scenarios without altering the underlying testable behavior.

phpmon/Common/Monitoring/Testable · high confidence

Added global keybind preference model

A new \GlobalKeybindPreference\ struct has been introduced to represent and manage global keyboard shortcuts within the application's preferences. This model handles the serialization of key combinations (including modifier keys like Command, Control, Option, Shift, and Function) into a human-readable format for display and persists the data to UserDefaults as JSON.

phpmon/Domain/Preferences/Keybinds · high confidence

Certificate expiry validation and security metadata for Valet sites

The Valet site integration now validates TLS certificates and exposes security metadata for each site. A new CertificateValidator checks whether a site's certificate exists and extracts its expiration date, issue date, and common name. ValetSite models now track certificate expiry and whether the certificate has expired, and the site determination process reads certificate, Nginx isolation config, composer.json, and .valetrc/.valetphprc files in a background snapshot to avoid blocking the main thread. This enables the UI to display certificate information and warn users when certificates have expired.

phpmon/Domain/Integrations/Valet/Sites · high confidence

Command execution history tracking

The application now records a history of executed commands, storing up to 200 entries with start and completion timestamps. This feature is implemented via new \CommandTracker\, \TrackedCommand\, and \TrackedShell\ components that wrap existing shell and command execution logic to automatically log activity, enabling users to view past command history and durations within the monitoring interface.

phpmon/Common/Monitoring · high confidence

Comprehensive English localization for PHP Monitor features

The application now includes a complete set of English translations for its core management interfaces, including the PHP Version Manager, Extension Manager, and Configuration Editor. Users will see localized strings for menu items, status messages, installation and upgrade workflows, diagnostic alerts, and configuration descriptions, ensuring a consistent and understandable experience across all PHP management and Valet integration features.

phpmon/en.lproj · high confidence

French localization for PHP Monitor interface

The application now includes a complete French translation for its user interface, covering menu items, configuration editors, PHP version management, extension management, domain lists, and onboarding flows.

phpmon/fr.lproj · high confidence

Initial Dutch localization for PHP Monitor

This update adds the first complete Dutch (nl) translation for the application, covering the main menu, PHP version manager, extension manager, domain list, and configuration presets. Users can now interact with the app in Dutch, including specific UI elements like the 'Actions' menu, search placeholders, and health warning messages.

phpmon/nl.lproj · high confidence

Introduce Homebrew data models and service representation

Added new Swift types to represent Homebrew package metadata and service states, enabling the application to decode and display Homebrew-related information such as package versions, aliases, and service status (running, loaded, PID).

phpmon/Common/PHP/Homebrew · high confidence

Introduce PHP Config Editor UI for managing memory and file size limits

The PHP Config Editor now includes a dedicated SwiftUI-based window that allows users to view and modify specific PHP configuration values, including memory\_limit, post\_max\_size, and upload\_max\_filesize. This new interface presents these byte-limit settings with editable text fields and unit pickers, supporting both fixed values and unlimited options, with automatic debounced saving to ensure changes are persisted without blocking the main thread.

phpmon/Modules/PHP Config Editor/UI · high confidence

Introduce PHP Doctor UI with automatic warning fixes

The PHP Doctor module now features a dedicated window that displays environment warnings and provides one-click automatic fixes. Users can refresh the environment check, view detailed warning descriptions, and trigger async fix actions directly from the interface, with visual feedback (progress indicators) while fixes are running. A separate 'No Warnings' view is shown when the environment is healthy.

phpmon/Modules/PHP Doctor/UI · high confidence

Introduce PHP Doctor environment diagnostics with automatic fixes

The PHP Doctor module now includes a new data layer that actively checks the user's environment for common configuration issues and offers automatic fixes. This includes verifying the existence of critical PHP configuration files (php.ini, php-fpm.conf), detecting missing or untrusted Homebrew taps, identifying invalid shell paths, and checking for expired Valet certificates. Users will see specific warnings for these conditions, such as helper binaries not being in the PATH or Xdebug configuration missing the mode setting, with the ability to apply one-click fixes where available (e.g., adding the bin path to zsh, trusting taps, or configuring xdebug.mode).

phpmon/Modules/PHP Doctor/Data · high confidence

Introduce PHP Extension Manager UI

Adds the user interface for managing PHP extensions, including a searchable list view, a picker to select the target PHP version, and controls to install or remove extensions. The interface displays extension status (installed, external, or installable), shows dependency information, and provides confirmation dialogs before removal, along with error handling for busy states and command failures.

phpmon/Modules/PHP Extension Manager/UI · high confidence

Introduce revertable PHP presets with rollback support

Users can now create and apply named presets that switch PHP versions, enable or disable extensions, and modify configuration values. Each preset includes a built-in rollback mechanism: applying a preset automatically saves the previous state to a JSON file, allowing users to revert changes via the 'AutomaticRevertSnapshot' preset. The system provides clear in-app alerts describing what will change before application and sends local notifications upon successful application or reversal of a preset.

phpmon/Domain/Presets · high confidence

Introduction of testable Web API with session tracking

The HTTP layer in phpmon/Common/Http now includes a WebApiProtocol, a RealWebApi implementation, and a TestableWebApi stub. The real implementation adds a randomized 'X-phpmon-session-uuid' header to API requests for better tracking, while the new testable variant allows injecting fake responses and simulating network delays, enabling more reliable and deterministic testing of API interactions.

phpmon/Common/Http · high confidence

Introduction of the Welcome Tour onboarding flow

The application now includes a new Welcome Tour window that appears to guide users through key features. This tour highlights the menu bar integration and, when Valet is installed, provides access to services, domains, and isolation settings. The window also includes a hint to the FAQ and automatically triggers a background check for application updates upon its first closure.

phpmon/Modules/WelcomeScreen · high confidence

Japanese localization for PHP Monitor interface

Added a new Japanese (ja.lproj) localization file containing 730 translated strings for the PHP Monitor application. This update provides Japanese translations for the main menu, PHP version manager, extension manager, configuration editor, domain list, and various system warnings and status messages, enabling Japanese-speaking users to interact with the application in their native language.

phpmon/ja.lproj · high confidence

New Markdown text view with styled inline code

The app now includes a dedicated MarkdownTextView component that renders simplified Markdown, specifically supporting inline code spans, bold, and italic text. Inline code is visually distinguished by a rounded background and monospaced font, and copying code spans preserves the backtick formatting while stripping internal layout characters.

phpmon/Domain/SwiftUI/Common/Markdown · high confidence

New PhpGuard class detects and alerts on PHP version mismatches

A new PhpGuard class has been introduced in the PHP domain to monitor the active PHP version. It compares the currently linked PHP version against the previously stored global version and, if they differ, displays an NVAlert dialog offering the user the option to switch back to the previous version or stay with the current one. The guard also handles cases where the version is unreadable by logging a warning and prevents the alert from appearing during tests or SwiftUI previews.

phpmon/Domain/PHP · high confidence

New common UI components for buttons and status views

This change introduces a set of reusable SwiftUI components to the application's common UI library. It adds custom button styles (including a standard 'custom' style with press/disabled states), a HelpButton for contextual assistance, and a SimpleButton for icon-text actions. Additionally, it provides views for handling user feedback states: BlockingOverlayView for displaying loading indicators during busy operations, ErrorView for showing error messages, and UnavailableContentView for displaying empty or unavailable states with optional action buttons.

phpmon/Domain/SwiftUI/Common/Buttons, phpmon/Domain/SwiftUI/Common/Views · high confidence

New developer tooling scripts for localization and Xcode project maintenance

Added a suite of helper scripts to streamline PHP Monitor development workflows. The new \scripts/translations/\ directory includes \find-missing.sh\ to report localization coverage gaps, \sync.py\ to backfill missing translations and remove stale keys from \Localizable.strings\ files based on a JSON payload, and \verify.sh\ to lint syntax. Additionally, \scripts/find-missing-xcode-files.py\ detects Swift files on disk that are not referenced in the Xcode project or build phases, and \scripts/generate-expired-valet-cert.sh\ creates expired Valet certificates for testing certificate-expiry warning flows.

scripts · high confidence

New startup alert modal with automatic fix support

The startup flow now presents a dedicated alert window when an environment check fails, allowing users to attempt an automatic repair. This new UI includes a view to display the fix command, a terminal-style output area (using NSTextView) to show real-time shell execution, and a button row that adapts to the fix status (idle, running, completed, or failed). The underlying ViewModel manages the asynchronous fix execution, re-runs the check after the command completes, and handles outcomes such as continuing to the next check, retrying all checks, or quitting the app.

phpmon/Domain/SwiftUI/Startup · high confidence

Nginx configuration file parsing for domain and proxy details

The application now includes a new \NginxConfigurationFile\ class that parses Nginx \.conf\ files to extract the domain name, top-level domain, proxy address, and isolated PHP version. This enables the tool to read and interpret Nginx configuration data directly from disk, supporting features like identifying which PHP version is isolated for a specific domain or determining the backend proxy target.

phpmon/Domain/Integrations/Nginx · high confidence

Onboarding wizard now handles developer tools, PATH, Homebrew, PHP/Composer, and Valet installation steps

The OnboardingStepRunner now orchestrates the full local environment setup for PHP development. It requests Apple Developer Tools installation and verifies completion, automatically updates the shell PATH (in .zshrc) for PHP Monitor, Composer, and Homebrew, and guides the user through installing Homebrew by copying the install command to the clipboard. It installs PHP and Composer via Homebrew, supporting conditional tap trust commands, and installs Laravel Valet with necessary temporary sudoers permissions, cleaning them up afterward. Each step provides streaming output and clear success/failure states.

phpmon/Modules/OnboardingWizard/Runner · high confidence

Packagist integration for checking and upgrading Valet

This change introduces a new Packagist integration module that enables the application to query the Packagist API for the latest stable version of PHP packages, specifically targeting Laravel Valet. The implementation includes a new \Packagist\ client that fetches version data via the v2 API with proper percent encoding, and a \ValetUpgrader\ component that reads the global Composer configuration to determine the current Valet constraint. It compares this against the latest available version and presents a user-facing alert offering an upgrade path, including options to proceed with the upgrade, cancel, or open the Composer folder if the version constraint does not match.

phpmon/Domain/Integrations/Packagist · high confidence

Portuguese (Portugal) localization added

The application now includes a complete Portuguese (Portugal) translation for its user interface, covering all major features such as the PHP version manager, extension manager, domain list, configuration editor, and Laravel Valet integration.

phpmon/pt-PT.lproj · high confidence

Support for editing PHP memory and size limits with automatic menu refresh

The PHP Config Editor now allows users to modify PHP configuration entries that represent byte limits (such as memory\_limit), parsing values with units (KB, MB, GB) and persisting changes directly to the php.ini file. When a limit is updated, the application automatically reloads the main menu to reflect the new configuration values, ensuring the UI stays in sync with the underlying PHP settings.

phpmon/Modules/PHP Config Editor/Data · high confidence

Xdebug mode selection via menu items

The application now provides a dedicated menu for selecting Xdebug modes. A new Xdebug extension class reads the current 'xdebug.mode' configuration from the PHP environment and dynamically generates menu items for available modes (develop, coverage, debug, gcstats, profile, trace). Each menu item reflects the current state (on/off) and allows users to toggle the specific mode, with changes handled by the main menu's toggle action.

phpmon/Common/PHP/Extensions · high confidence

Removals

Removed legacy workspace configuration file

The file contents.xcworkspacedata, which previously defined the workspace reference to the phpmon.xcodeproj project, has been deleted. This change removes the explicit workspace configuration for the project.

phpmon.xcodeproj/project.xcworkspace · high confidence

Xcode project file removed

The \phpmon.xcodeproj/project.pbxproj\ file has been deleted, removing the Xcode project configuration that previously defined the build settings, source files (such as \AppDelegate.swift\, \Shell.swift\, and \ViewController.swift\), and resource bundles for the phpmon application.

phpmon.xcodeproj · high confidence

Architecture

Project structure reorganized into modular targets with self-updater

The Xcode project has been restructured to support a modular architecture, introducing a dedicated 'PHP Monitor Self-Updater' target alongside the main app, unit tests, and UI tests. This change integrates the NVAppUpdater framework for update management and the CrashReporter framework for diagnostics, while organizing source code into synchronized root groups (phpmon, phpmon-shared, phpmon-updater) to streamline development and maintenance.

PHP Monitor.xcodeproj · high confidence

Behavioural changes

1 commit (0 fixes) modifying integrations

A change to existing behaviour in integrations — 1 commit, 1 file.

integrations · low confidence · unverified

13 commits (0 fixes) modifying assets/affinity

A change to existing behaviour in assets/affinity — 13 commits, 4 files.

assets/affinity · medium confidence · unverified

Async PHP version switching with Valet configuration fixes

The PHP version switcher now operates asynchronously using Swift concurrency, unlinking all existing versions and linking the new one in parallel to improve responsiveness. When Laravel Valet is installed, the switcher automatically ensures configuration validity by disabling the default \www.conf\ PHP-FPM pool file (renaming it to \.disabled-by-phpmon\) and generating necessary configuration files like \valet-fpm.conf\ and \error\_log.ini\ with correct user and path replacements. The switch also handles isolated site PHP versions and restarts nginx to apply changes.

phpmon/Common/PHP/Switcher · high confidence

Automated repair of Homebrew PHP folder ownership

PHP Monitor now automatically detects and fixes ownership issues in Homebrew's PHP installation directories (specifically /bin and /sbin folders) that can cause permission errors. When broken permissions are detected, the tool runs an administrative script to stop affected PHP services and recursively restore correct ownership to the user, ensuring smooth operation of PHP versions managed via Homebrew.

phpmon/Domain/Integrations/Homebrew/Behaviors · high confidence

Automatic PHP-FPM restart and cleanup after extension changes

When installing or removing PHP extensions, the application now automatically restarts the PHP-FPM service to ensure the changes take effect immediately. Additionally, removing an extension triggers cleanup logic that either deletes the extension's default configuration file or disables it if it resides in a non-default location, preventing stale configurations from persisting.

phpmon/Domain/Integrations/Homebrew/Commands/PHP Extensions · high confidence

Enhanced Composer project detection and global update handling

The Composer integration now reads composer.json to determine PHP version constraints and identify notable dependencies, enabling detection of additional frameworks such as Tempest, Bedrock, CakePHP, Craft, Flarum, Jigsaw, Joomla, Katana, Kirby, OctoberCMS, Sculpin, Statamic, Zend, and Slim. The Composer window logic has been refactored to use the modern Swift Task API for asynchronous global updates, ensuring UI updates occur on the main thread and providing clearer success/failure feedback via local notifications and progress windows.

phpmon/Domain/Integrations/Composer · high confidence

Filesystem operations are now non-blocking and concurrency-safe

The filesystem abstraction has been refactored to support Swift 6 concurrency by marking the \FileSystemProtocol\, \RealFileSystem\, and \TestableFileSystem\ as \nonisolated\ and \Sendable\. This ensures that synchronous, blocking file I/O operations are explicitly performed off the main actor, preventing UI hangs and main-thread blocking warnings. The \RealFileSystem\ implementation now explicitly depends on a \Container\ for path resolution (such as tilde expansion) and shell commands, while the \TestableFileSystem\ uses a serial access queue to guarantee thread-safe access to its internal state during tests.

phpmon/Common/Filesystem · high confidence

Homebrew integration refactored with new service detection and tap trust support

The Homebrew integration layer has been restructured to improve reliability and expand capabilities. A new automatic service detection system now identifies and manages common Homebrew services like PostgreSQL, MySQL, Redis, and Mailhog. The app also supports the \brew trust\ command, allowing it to automatically trust required PHP taps on compatible Homebrew installations. Under the hood, PHP version and extension management has been rewritten using new data models (BrewPhpFormula, BrewPhpExtension) and a dedicated handler, while Cask file parsing now utilizes a Web API for remote fetching. These changes provide a more robust foundation for managing PHP environments and Homebrew dependencies.

phpmon/Domain/Integrations/Homebrew · high confidence

Introduce ValetInteractor abstraction for domain management

The application now uses a new \ValetInteractor\ class to handle all interactions with Laravel Valet, such as linking, unlinking, proxying, securing, and isolating sites. This change introduces a dedicated interface (\ValetListable\) and a concrete implementation that executes the necessary shell commands, along with a \FakeValetInteractor\ to support testing and simulation of these operations without affecting the actual system.

phpmon/Domain/Integrations/Valet/Domains · high confidence

Introduce command execution protocol and implementations

The application now uses a new \CommandProtocol\ to manage external command execution, providing a \RealCommand\ implementation for live subprocess handling and a \TestableCommand\ for controlled testing. This change ensures commands run safely off the main thread with proper Sendable conformance for Swift 6 concurrency, while also adding logic to detect and handle subprocess crashes (uncaught signals) and standard error output capture.

phpmon/Common/Command · high confidence

Introduce structured error handling with alertable error protocol

The Errors module now defines an AlertableError protocol to standardize how user-facing errors are identified for alert messages, alongside specific error types like AdminPrivilegeError (which maps to localized alert keys) and VersionParseError. These error structs are marked as nonisolated to ensure they can be safely thrown and compared across actor isolation boundaries without violating Swift concurrency rules.

phpmon/Common/Errors · high confidence

Introduce structured onboarding wizard with automated environment setup

The onboarding experience is now driven by a declarative wizard flow that automatically detects and installs required tooling, including Apple Command Line Tools, Homebrew, PHP, Composer, and Valet. The wizard guides users through each step, automatically fixing the system PATH for zsh users and handling Valet sudoers configuration, while providing real-time terminal output and status banners to keep users informed during the setup process.

phpmon/Modules/OnboardingWizard/Data · high confidence

The application's menu bar and status item are now constructed programmatically via the new \AppMenu\, \MainMenu\, and \StatusMenu\ classes, replacing the previous \Main.storyboard\-based approach. This change introduces granular preference controls that allow users to toggle the visibility of specific menu sections, including the global PHP version switcher, services manager, Valet integration, PHP configuration finder, Composer toolkit, limits widget, extensions, presets, and miscellaneous first-aid items. The new structure also adds dedicated menu items for displaying the active driver (Valet or Standalone Mode) and supports dynamic UI updates based on the current PHP environment and user settings.

phpmon/Domain/Menu · high confidence

Migrate configuration to custom JSON file and introduce granular UI preferences

The application now loads user settings from a new custom configuration file at \~/.config/phpmon/config.json, automatically migrating any legacy \~/.phpmon.conf.json file to the new location. This change supports advanced customization via JSON keys for scan\_apps, presets, services, and environment variables (export). Additionally, the preferences system has been expanded to include granular UI controls, allowing users to toggle the visibility of specific menu bar items (such as the global version switcher, services manager, integrations, and presets) and manage notification behaviors for version changes, PHP-FPM restarts, and secure toggles.

phpmon/Domain/Preferences · high confidence

New Onboarding Wizard UI with sidebar navigation and step tracking

The application now features a redesigned onboarding wizard with a dedicated sidebar that displays a timeline of setup steps (such as Command Line Tools, Homebrew, PHP, and Valet) and their current status. The main content area dynamically switches between an introduction checklist and individual step details, which can include command blocks, progress indicators, and status banners. The wizard also introduces specific skip options for the Valet installation step and hides the main application menu during the process to focus the user's attention.

phpmon/Modules/OnboardingWizard/UI · high confidence

New Xcode schemes for EAP, Self-Updater, and test separation

The project now includes dedicated Xcode schemes to support different build and testing workflows. A new 'PHP Monitor EAP' scheme is added for Early Access Program builds, featuring specific command-line arguments and environment variables like EXTREME\_DOCTOR\_MODE. A 'PHP Monitor Self-Updater' scheme is introduced to build and run the self-updater component separately. The main 'PHP Monitor' scheme has been updated to skip Unit Tests by default while enabling UI Tests, and a standalone 'Unit Tests' scheme is provided to run unit tests with the main thread checker disabled, allowing for more controlled test execution.

PHP Monitor.xcodeproj/xcshareddata · high confidence

New helper utilities for alerts, app detection, and concurrency safety

The Common/Helpers module introduces several new components to improve user experience and stability. A centralized Alert helper now provides a consistent, main-thread-safe way to present modal confirmations. Application detection has been refactored into a dedicated class that scans for preset editors, IDEs, and terminals, with improved shell command handling to prevent crashes. To support macOS 13+, a LoginItemManager enables the app to manage its own startup login status. Concurrency and stability are enhanced via a RunBlocking utility for safe off-main-thread execution of synchronous tasks, a MainThreadGuard to catch UI-hanging bugs in debug builds, and a VersionExtractor for robust version string parsing.

phpmon/Common/Helpers · high confidence

New privileged command approval UI and isolation for fake environments

Privileged commands now require explicit user approval via a new modal alert window (PrivilegedCommandAlertWindowController) featuring an approval/deny interface (PrivilegedCommandApprovalView). This change isolates privileged command execution in fake/test environments by introducing a DisabledPrivilegedCommandRunner that throws an error unless a test explicitly supplies an approval runner, preventing accidental execution of admin scripts during testing.

phpmon/Domain/PrivilegedCommand · high confidence

New sidebar filters and improved domain list organization

The Domains window now features a sidebar that lets you quickly filter the domain list by status and type, including Favorites, HTTP/HTTPS, Linked/Parked/Proxy, and Global/Isolated PHP versions. Each filter displays a live count of matching domains, and the list preserves your row selection when switching filters or performing actions like toggling favorites or securing sites. The sidebar layout is customizable (collapsible) and persists its state across app launches.

phpmon/Modules/Domain List/UI · high confidence

PHP Monitor app architecture and behavior overhaul

The application has been restructured to run without a storyboard, with the menu bar and main menu now built entirely in code. The app now supports an accessory (toolbar) mode that activates when no windows are open, and it includes a new self-updater with automatic crash reporting. A global hotkey system has been added to open the menu, and the app can now detect installed applications for domain source directories. URL scheme handling (phpmon://) has been reworked to prompt users for integration permissions. The startup sequence has been improved with better environment checks, and the app now supports Early Access Program (EAP) builds with distinct menu indicators.

phpmon/Domain/App · high confidence

PHP Monitor app credits page and structural cleanup

The app now includes a dedicated Credits page (Credits.html) that thanks GitHub sponsors, lists localization contributors, and provides links to the privacy policy, FAQ, and social media channels. Additionally, the project has removed several legacy source files (AppDelegate, ImageGenerator, Shell, ViewController, and the Main storyboard) and cleaned up the Info.plist and entitlements, reflecting a shift away from the previous storyboard-based menu and manual status bar image generation.

phpmon · high confidence

PHP Version Manager UI restructured with new status indicators and upgrade controls

The PHP Version Manager window now displays distinct visual status icons for each PHP formula—showing a blue arrow for available upgrades, a green checkmark for installed versions, and a dashed square for missing ones—along with a dedicated 'Upgrade All' button to update multiple versions at once. The interface also includes improved error handling that refreshes PHP health after failed operations and warns users about unsupported Homebrew versions or missing taps on launch.

phpmon/Modules/PHP Version Manager/UI · high confidence

PHP extension data is now loaded asynchronously via a dedicated observable

The PHP Extension Manager now uses a new \BrewExtensionsObservable\ class to manage extension data. This change introduces asynchronous loading of available PHP extensions from the \shivammathur/homebrew-extensions\ Homebrew tap, ensuring that file operations and data fetching do not block the main UI thread. The observable automatically reloads extension data whenever the selected PHP version changes.

phpmon/Modules/PHP Extension Manager/Data · high confidence

The PHP Monitor helper generation logic has been refactored to correctly resolve Homebrew's \opt\ symlinks (e.g., \php@8.4\), ensuring that helper scripts point to the actual binary locations rather than broken or indirect paths. Additionally, the system now detects the user's shell (zsh, bash, or fish) to generate appropriate PATH-mutation scripts and includes a safeguard that prevents overwriting existing files in the helper directory that were not originally generated by PHP Monitor, protecting user customizations.

phpmon/Common/PHP/PHP Helper · high confidence

Redesigned domain list cells with new status indicators and interactive controls

The domain list table cells have been completely rewritten to provide richer visual feedback and interaction. The Name cell now supports a favorite state, displaying a star icon for favorited sites. The PHP cell includes a button to switch PHP versions for isolated sites and an icon indicating whether a site is isolated or global. The TLS cell displays a lock icon that changes color based on certificate status (green for secure, red for insecure, orange for expired) and opens a popover with certificate details when clicked. The Type cell shows the detected driver (e.g., Laravel with version) and PHP version, with an info button that opens a popover for PHP version compatibility details and suggestions.

phpmon/Modules/Domain List/UI/Cells · high confidence

Redesigned domain management and PHP version selection UI

The domain creation workflow has been restructured into a multi-step process: users now first choose between creating a linked site or a proxy via SelectDomainTypeView, followed by dedicated AddSiteView and AddProxyView forms that include real-time validation and preview. Additionally, the VersionPopoverView has been updated to present PHP version suggestions, distinguishing between global switching and site-specific isolation based on user preferences, while SecurePopoverView now provides detailed certificate status and renewal options.

phpmon/Domain/SwiftUI/Domains · high confidence

Redesigned macOS menu bar interface with new service controls and stats view

The macOS menu bar experience has been completely overhauled with new SwiftUI components. The Services section now displays services in a compact grid layout, allowing users to toggle individual services directly from the menu with visual feedback (checkmarks, error indicators, and progress spinners) and alerts for missing or errored services. A new Stats view presents PHP configuration limits (memory, post size, upload size) in a consolidated row with a direct link to the configuration GUI, replacing the previous layout.

phpmon/Domain/SwiftUI/Menu · high confidence

Refactored Homebrew command execution with improved progress tracking and concurrency safety

The Homebrew integration now uses a dedicated \BrewCommand\ protocol and implementation to manage shell operations, introducing more granular progress reporting for installation steps (fetching, downloading, installing, pouring) and better handling of command timeouts and termination statuses. This change ensures that output parsing and progress updates are performed safely on background threads using \OSAllocatedUnfairLock\ to prevent data races, while also supporting conditional execution of \brew trust\ commands based on system capabilities.

phpmon/Domain/Integrations/Homebrew/Commands · high confidence

Refactored PHP installation detection and configuration management

The PHP monitoring logic has been restructured to improve reliability and concurrency. Detection of the active and installed PHP versions now uses a 'Probe' pattern that performs all blocking I/O (such as running \php-config\ and reading \.ini\ files) on background threads, preventing main-thread deadlocks. Configuration file handling is now thread-safe, with atomic writes and reloads to prevent race conditions when editing settings. Additionally, the system now robustly handles edge cases, such as missing PHP binaries, unparseable version strings, and unreadable configuration files, ensuring the application remains stable even with incomplete or corrupted PHP installations.

phpmon/Common/PHP · high confidence

Refactored PHP version detection and constraint matching

The PHP version management logic has been restructured to improve robustness and concurrency safety. The new \PhpEnvironments\ class centralizes PHP installation tracking, using thread-safe locking to prevent race conditions during version detection and switching. Version comparison now relies on a new \VersionNumber\ model that supports strict and non-strict matching modes, allowing the app to correctly handle Homebrew's imprecise version reporting versus installed patch versions. Additionally, the system now supports Composer-style wildcard constraints (e.g., \^7.0\, \\~8.1\) for filtering available PHP versions, ensuring that extension compatibility checks align with user-defined requirements.

phpmon/Common/PHP/PHP Version · high confidence

Refactored PHP version management commands for concurrency and reliability

The PHP version management commands (ModifyPhpVersionCommand and RemovePhpVersionCommand) have been rewritten to use Swift concurrency, ensuring the UI remains responsive during Homebrew operations. The modification process now explicitly handles major version upgrades that might break existing installations by reinstalling and relinking the previous version, and it automatically repairs unhealthy PHP installations after changes. Removal operations now include a 5-minute timeout to prevent hanging, verify the command's success status, and automatically switch the active PHP version back to the one that was active before the removal.

phpmon/Domain/Integrations/Homebrew/Commands/PHP Versions · high confidence

Refactored dependency injection container with dedicated test fakes

The application's dependency injection container has been restructured to separate production and test configurations. A new \Container+Fake\ extension provides a \fake()\ factory method that allows unit tests to inject mock shells, file systems, commands, and web API responses without affecting the host system. The core \Container\ now uses explicit \bind()\ and \overrideFake()\ methods to manage service initialization, ensuring that test environments are isolated from real OS interactions while maintaining the same service interface for production code.

phpmon/Container · high confidence

Refactored file watchers with debouncing and suspension support

The file-watching logic in phpmon/Domain/Watcher has been restructured to improve reliability and performance. A new Debouncer actor prevents rapid, repeated events from triggering excessive processing by waiting for a specified interval before executing actions. The FSNotifier actor now supports suspension, allowing the HomebrewWatchManager to temporarily pause monitoring of /homebrew/bin during package installations or updates to avoid duplicate work. Additionally, the ConfigWatchManager has been introduced to manage PHP configuration file changes with similar debouncing, ensuring the menu updates smoothly without redundant reloads.

phpmon/Domain/Watcher · high confidence

Replaced legacy shell execution with a new, concurrency-safe command orchestration system

The application's core shell interaction has been completely rewritten to support Swift concurrency and improve reliability. A new \Actions\ class now centralizes service management (linking PHP, restarting Nginx/PHP-FPM/DNSMasq) and configuration folder opening, while a new \AppleScript\ helper executes privileged commands via a subprocess to avoid main-thread deadlocks. Command building is now declarative using \ConditionalCommand\, allowing sequences to be filtered by condition, and the \Paths\ class has been refactored to use a \Sendable\ architecture with thread-safe binary detection. This change also introduces a new \Log\ class with granular verbosity levels and a \Constants\ struct that updates the supported PHP version matrix to include PHP 8.5 and 8.6, and adjusts the Valet support matrix for version 4.

phpmon/Common/Core · high confidence

Secure and robust PATH configuration in .zshrc

The provisioning system now uses a new ZshRunCommand class to manage PATH entries in .zshrc, ensuring that Homebrew, Composer, and PHP Monitor binaries are added safely. This change prevents shell injection by escaping single quotes in user-provided paths and avoids duplicate entries by checking for existing paths using normalized path comparison. Additionally, file operations are performed asynchronously to prevent blocking the main actor, improving app responsiveness during onboarding and configuration.

phpmon/Domain/Provision · high confidence

Self-updater now displays progress for long-running updates

The PHP Monitor self-updater (phpmon-updater) now shows a progress window when an update takes longer than 5 seconds, improving visibility during lengthy installations. This change is implemented by configuring the NVAppUpdater library with a \.whenUpdatingTakesLongerThan(5.0)\ display mode in the application's main entry point.

phpmon-updater · high confidence

Services manager now reports error status and provides troubleshooting alerts

The services management layer has been refactored to distinguish between active, inactive, missing, and error states for Homebrew services. When a service fails to start or stops unexpectedly, the application now displays a specific error status in the menu bar and presents a troubleshooting alert to the user. If the service provides an error log path, the alert includes a button to open the log file directly; otherwise, it shows a simplified message. This change improves visibility into service health and helps users resolve issues without leaving the application.

phpmon/Domain/App/Services · high confidence

Settings window migrated to SwiftUI with improved shortcut recording scope

The Settings window UI has been rebuilt using SwiftUI, replacing the previous storyboard/XIB implementation while preserving the original layout metrics, toolbar-style tabs, and row behaviors. This migration includes a fix for global shortcut recording: the hotkey listener is now scoped to the Settings window only, preventing unintended key capture from other application windows.

phpmon/Modules/Settings · high confidence

Shell PATH resolution now includes a timeout and fallback

The application now resolves the user's PATH with a 3-second timeout and a fallback to the system PATH if the interactive shell hangs or fails. This change prevents startup deadlocks and excessive delays on constrained systems by ensuring that PATH retrieval does not block indefinitely, while also improving thread safety and concurrency handling in the shell execution layer.

phpmon/Common/Shell · high confidence

Terminal progress panel rewritten in SwiftUI

The terminal progress panel, which displays live console output during background operations, has been migrated from the legacy Storyboard-based implementation to a new SwiftUI architecture. This change introduces a dedicated \ProgressPanelView\ and \ProgressPanelModel\ to manage the UI state, replacing the previous \ProgressWindow.storyboard\. The visual layout, including the icon, title, description, and the black-on-white Menlo console text, has been preserved to ensure a consistent user experience while modernizing the underlying framework.

phpmon/Domain/Terminal Alert · high confidence

Unified Valet domain scanning with concurrency-safe implementation

The Valet integration now uses a unified \DomainScanner\ protocol to resolve sites and proxies, replacing previous ad-hoc scanning logic. The new \ValetDomainScanner\ performs blocking filesystem operations (directory listings, certificate reads) off the main actor to prevent UI deadlocks and improve responsiveness on constrained systems, while safely handling invalid paths and missing directories without crashing. A \FakeDomainScanner\ is provided for testing, allowing deterministic resolution of mock sites and proxies.

phpmon/Domain/Integrations/Valet/Scanners · high confidence

Valet integration alerts and configuration loading

The Valet integration now proactively alerts users about common configuration issues, including non-standard TLDs, outdated Valet versions, and broken PHP-FPM setups. It also defers loading the Valet configuration file until after initial app checks pass to prevent crashes from invalid JSON.

phpmon/Domain/Integrations/Valet · high confidence

Valet proxy certificate expiry detection and expiration warnings

The application now checks the expiration date of TLS certificates for Valet proxies and warns users when a certificate has expired. This is implemented by adding a \certificateExpiryDate\ property and an \isCertificateExpired\ computed property to the \ValetProxy\ class, along with logic in \apply(certificate:)\ to log a warning if the certificate is found to be expired. The \determine()\ and \refreshSecuredStatus()\ methods now validate the certificate and update the proxy's secured status and expiry date accordingly.

phpmon/Domain/Integrations/Valet/Proxies · high confidence

Test coverage

Added fake data handler for PHP version management; Added integration tests for concurrency, Homebrew compatibility, and privileged command isolation; Added test double for BrewCommand to support Swift 6 concurrency; Added test fixtures for Homebrew 7 service label compatibility; Added test plan configuration for PHP Monitor; Added test utilities for environment condition checks; Added tests for Logger thread safety and RunBlocking behavior; Added unit test fixtures for Valet configuration and Nginx stubs; Added unit tests for FSNotifier debouncing and lifecycle; Added unit tests for PHP Monitor parser components; Added unit tests for PHP version detection and environment management; Added unit tests for RealFileSystem and TestableFileSystem; Added unit tests for RealShell and TestableShell implementations; Added unit tests for Valet domain list, sidebar, and concurrency safety; Added unit tests for WarningManager trust diagnostics; Added unit tests for command execution, PHP health recovery, and shell configuration; Added unit tests for configuration handling and system context; Added unit tests for core PHP monitor logic; Added unit tests for the Web API integration; Added unit tests for the onboarding wizard and privileged command execution; Expanded UI test coverage for core application features; New TestableConfiguration for deterministic PHP environment simulation; Test infrastructure modernization and shared test utilities.

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

How this codebase got here

Score

  • CAI 60 → 60 (-0.5)
  • Rubric changed (rubric-2026.09.11 → rubric-2026.09.18) — scores are not directly comparable.

Lenses

  • Code Health 95 → 95 (-0.1)
  • Architecture 96 → 95 (-1.2)
  • Maturity 63 → 63 (+0.0)
  • Readiness 62 → 59 (-3.0)
  • Security 80 → 80 (+0.0)
  • Accessibility 51 → 51 (+0.0)

Resolved (7)

  • Change coupling: Actions.swift ↔ HomebrewDecodable.swift (phpmon/Common/Core/Actions.swift)
  • Change coupling: HomebrewDecodable.swift ↔ Startup.swift (phpmon/Common/PHP/Homebrew/HomebrewDecodable.swift)
  • Documentation: no installation or build instructions (README.md)
  • Documentation: no usage examples (README.md)
  • Hotspot: phpmon/Domain/App/Services/ValetServicesDataManager.swift (phpmon/Domain/App/Services/ValetServicesDataManager.swift)
  • Hotspot: phpmon/Domain/Menu/StatusMenu.swift (phpmon/Domain/Menu/StatusMenu.swift)
  • Members sharing a duplicated core (4 members, 50+ identical tokens) (phpmon/Domain/App/AppDelegate+InterApp.swift)

New (6)

  • Duplicated block (15 lines × 2) (phpmon/Modules/PHP Extension Manager/UI/PhpExtensionManagerView.swift)
  • Duplicated block (39 lines × 2) (phpmon/Domain/SwiftUI/Domains/AddProxyView.swift)
  • Duplicated block (7 lines × 3) (phpmon/Modules/PHP Doctor/UI/PhpDoctorView.swift)
  • Duplicated block (8 lines × 2) (phpmon/Modules/PHP Config Editor/UI/ConfigManagerView.swift)
  • Low cohesion: String (LCOM4 5) (phpmon/Common/Extensions/StringExtension.swift)
  • Members sharing a duplicated core (4 members, 50+ identical tokens) (phpmon/Domain/App/AppDelegate+InterApp.swift)

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

Survey your own repository

nicoverbruggen/phpmon was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.

About this page

  • The score is its most recent published measurement, taken on 30 September 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
  • Measured at commit 0460627259141095738af968f8dff64f2da849cf — the exact code this score is about.
  • Scored under rubric-2026.09.18 — the same rubric and the same method as every other entry in this index.
  • Measured by watchdog.canine.dev using codehealth-analyzer preprod-cb25ca4feafa.