A proactive email notification system for MacAdmins to ensure timely macOS updates across their fleet
As a MacAdmin, you know the challenge: users tend to ignore macOS update notifications that appear on their screens, but they actually read and respond to emails. The macOS Update Notifier bridges this gap by sending timely email notifications when macOS updates are released and installation deadlines are approaching.
- System notifications get dismissed or ignored
- Users postpone updates indefinitely
- Critical security updates are delayed
- Compliance requirements are missed
- Email notifications that users actually read
- Customizable installation deadlines per user/group
- Automated monitoring of macOS releases
- Professional email templates with clear instructions
- Multi-admin management with role-based access
- π Administrative Dashboard: Overview of subscribers, recent releases, and system statistics
- π₯ User Management: Super admin and regular admin roles with appropriate access controls
- π§ Bulk Import: Import subscribers via CSV upload or copy/paste from spreadsheets
- π Activity Tracking: Monitor subscriber actions and notification history
- π Automated Monitoring: Daily checks for new macOS releases from the SOFA feed
- π¬ Timely Notifications: Email alerts when updates are available and deadlines approach
- βοΈ Self-Service Options: Links to update preferences or unsubscribe
- π Clear Instructions: Step-by-step update installation guidance
- β° Deadline Awareness: Clear communication about installation deadlines
- π Secure Authentication: Magic link login system (no passwords to manage)
- π± Responsive Design: Modern glassmorphism UI that works on all devices
- ποΈ SQLite Database: No complex database setup required β but available when needed
- β‘ Background Jobs: Efficient processing of notifications and data fetching
- π§ͺ Comprehensive Testing: 190+ tests ensuring reliability
βββββββββββββββββββ ββββββββββββββββββββ ββββββββββββββββββββ
β SOFA Feed βββββΆβ Update Notifier βββββΆβ Email Server β
β (macOS Releases)β β (Laravel) β β (SMTP/SES) β
βββββββββββββββββββ ββββββββββββββββββββ ββββββββββββββββββββ
β² β
β βΌ
ββββββββββββββββββββ ββββββββββββββββββββ
β Mac Admins β β Subscribers β
β (Web Access) β β (Email client) β
ββββββββββββββββββββ ββββββββββββββββββββ
- Daily Monitoring: System fetches latest macOS releases from the SOFA feed
- Deadline Calculation: Calculates installation deadlines based on subscriber preferences
- Smart Notifications: Sends emails only when deadlines are approaching (configurable threshold)
- User Actions: Subscribers receive emails with clear instructions and self-service options
Before installing, ensure you have:
- Web Server: Apache, Nginx, or development server
- PHP 8.2+ with extensions:
- SQLite PDO (for database)
- cURL (for fetching releases)
- OpenSSL (for security)
- Mbstring (for email handling)
- Composer (PHP dependency manager)
- Email Service: SMTP server, AWS SES, or similar
- NPM: for frontend compilation
π‘ For Non-Developers: If these terms are unfamiliar, consider using a hosting service like Laravel Forge or DigitalOcean App Platform that handles the technical setup.
# 1. Download the project
git clone https://github.com/wycomco/macos-update-notifier.git
cd macos-update-notifier
# 2. Install dependencies
composer install
# 3. Setup environment
cp .env.example .env
php artisan key:generate
# 4. Create database
touch database/database.sqlite
php artisan migrate
# 5. Start the development server
php artisan serve
Visit http://localhost:8000
to access the application.
For production use, consider these hosting options:
- Sign up for Laravel Forge
- Connect your server (DigitalOcean, AWS, etc.)
- Deploy directly from your GitHub repository
- Forge handles SSL, database, and server configuration
- Configure your web server (Apache/Nginx)
- Set up SSL certificates
- Configure scheduled tasks (cron)
- Set up process monitoring (Supervisor)
π Detailed deployment guides are available in the Laravel documentation.
Edit your .env
file with these essential settings:
# Application
APP_NAME="macOS Update Notifier"
APP_URL=https://your-domain.com
# Database (SQLite - no setup required)
DB_CONNECTION=sqlite
# Email Configuration (REQUIRED)
MAIL_MAILER=smtp
MAIL_HOST=smtp.your-provider.com
MAIL_PORT=587
MAIL_USERNAME=[email protected]
MAIL_PASSWORD=your-app-password
MAIL_FROM_ADDRESS="[email protected]"
MAIL_FROM_NAME="macOS Update Team"
# macOS Notifier Settings
SOFA_FEED_URL=https://sofafeed.macadmins.io/v1/macos_data_feed.json
DEFAULT_DAYS_TO_INSTALL=30
NOTIFICATION_WARNING_DAYS=7
Choose your email provider:
MAIL_MAILER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=[email protected]
MAIL_PASSWORD=your-app-password # Use App Password, not regular password
MAIL_MAILER=smtp
MAIL_HOST=smtp.office365.com
MAIL_PORT=587
MAIL_USERNAME=[email protected]
MAIL_PASSWORD=your-password
MAIL_MAILER=ses
AWS_ACCESS_KEY_ID=your-access-key
AWS_SECRET_ACCESS_KEY=your-secret-key
AWS_DEFAULT_REGION=us-east-1
Create your first admin account:
php artisan tinker
use App\Models\User;
User::create([
'name' => 'Your Name',
'email' => '[email protected]',
'password' => bcrypt('temporary-password'),
'is_super_admin' => true
]);
For production, set up the Laravel scheduler:
# Add to your server's crontab
crontab -e
# Add this line:
* * * * * cd /path/to/your/project && php artisan schedule:run >> /dev/null 2>&1
For development/testing:
php artisan schedule:work
The application uses background jobs for email processing and other tasks. In production, you must run a queue worker:
Create a supervisor configuration file /etc/supervisor/conf.d/macos-notifier.conf
:
[program:macos-notifier-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /path/to/your/project/artisan queue:work --sleep=3 --tries=3 --max-time=3600
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
user=www-data
numprocs=1
redirect_stderr=true
stdout_logfile=/path/to/your/project/storage/logs/worker.log
stopwaitsecs=3600
Then start the supervisor service:
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start macos-notifier-worker:*
Create a systemd service file /etc/systemd/system/macos-notifier-queue.service
:
[Unit]
Description=macOS Update Notifier Queue Worker
After=network.target
[Service]
Type=simple
User=www-data
WorkingDirectory=/path/to/your/project
ExecStart=/usr/bin/php artisan queue:work --sleep=3 --tries=3 --max-time=3600
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
Enable and start the service:
sudo systemctl enable macos-notifier-queue
sudo systemctl start macos-notifier-queue
For development or testing environments, you can run the queue worker manually:
php artisan queue:work
β οΈ Important: Without a queue worker running, emails will not be sent and other background tasks will not execute. The application will appear to work but notifications will remain in the queue.
- Full System Access: Manage all users and subscribers
- User Management: Create, promote, demote, and delete admin accounts
- System Overview: View system-wide statistics and all subscriber data
- Settings Control: Configure system-wide settings
- Subscriber Management: Manage only their assigned subscribers
- Limited Dashboard: View only their subscriber statistics
- No User Access: Cannot manage other admin accounts
- Navigate to Subscribers β Add New
- Fill in subscriber details
- Select macOS versions to monitor
- Set installation deadline (days after release)
- Navigate to Subscribers β Bulk Import
- Choose your method:
- CSV Upload: Upload a properly formatted CSV file
- Copy/Paste: Paste data directly from Excel/Sheets
- Configure import settings:
- macOS Versions: Select which versions to monitor
- Days to Install: Set notification deadline (1-365 days)
- Language: Choose notification language (optional, defaults to English)
email,subscribed_versions,days_to_install
[email protected],"macOS 14,macOS 15",30
[email protected],"macOS 15",14
[email protected],"macOS 14,macOS 15",60
- English (en) - Default
- German (de) - Deutsch
- French (fr) - FranΓ§ais
- Spanish (es) - EspaΓ±ol
All imported subscribers will use the selected language for notifications. If no language is specified, English will be used as the default.
Emails are automatically sent when:
- New Release Available: A macOS update is published for subscribed versions
- Deadline Approaching: Installation deadline is within the warning period (default: 7 days)
- Critical Updates: Security updates with shorter installation windows
- Release Information: Version number, release date, and key features
- Personal Deadline: User's specific installation deadline
- Installation Instructions: Step-by-step update guide
- Self-Service Links: Update preferences or unsubscribe options
- Company Branding: Customizable sender name and styling
Administrators can modify:
- Notification Timing: Adjust warning periods in
.env
- Sender Information: Company name and email address
- Installation Deadlines: Per-subscriber customization
- System Overview: Total subscribers, active admins, recent releases
- User Performance: Admin activity and subscriber management stats
- Version Distribution: Breakdown of subscribers by macOS version
- Recent Activity: Latest system actions and notifications
- Subscriber Summary: Count and status of managed subscribers
- Version Breakdown: Distribution of subscribed macOS versions
- Recent Actions: Latest subscriber activity and notifications
- Quick Actions: Add subscribers, bulk import, view reports
- Notification History: Track what emails were sent and when
- Subscriber Activity: Monitor user interactions and preferences
- System Health: Database status, email queue, and error tracking
The system automatically handles:
- Release Monitoring: Checks SOFA feed for new macOS versions
- Notification Processing: Sends emails for approaching deadlines
- Database Cleanup: Removes old logs and temporary data
php artisan macos:check-updates
php artisan macos:check-updates [email protected]
php artisan macos:status
tail -f storage/logs/laravel.log
php artisan queue:status
Check if your queue worker is running:
# For supervisor
sudo supervisorctl status macos-notifier-worker:*
# For systemd
sudo systemctl status macos-notifier-queue
# View recent queue jobs
php artisan queue:failed
If emails aren't being sent, restart the queue worker:
# For supervisor
sudo supervisorctl restart macos-notifier-worker:*
# For systemd
sudo systemctl restart macos-notifier-queue
# Or manually restart
php artisan queue:restart
The system uses SQLite by default, requiring minimal maintenance. For high-volume deployments, consider migrating to PostgreSQL or MySQL.
- No releases found: Check the SOFA feed URL and internet connectivity
- Emails not sending:
- Verify mail configuration in
.env
- Check if queue worker is running (most common issue)
- Review queue logs for failed jobs
- Verify mail configuration in
- Scheduled tasks not running: Ensure
schedule:work
is running or cron is configured - Background jobs failing: Check queue worker logs and restart if necessary
If notifications aren't being sent:
-
Check queue worker status:
# View queue status php artisan queue:status # Check for failed jobs php artisan queue:failed
-
Test email sending manually:
# Send a test notification php artisan macos:check-updates [email protected]
-
Restart queue worker:
php artisan queue:restart
-
Check worker logs:
# Application logs tail -f storage/logs/laravel.log # Worker logs (if using supervisor) tail -f storage/logs/worker.log
Check application logs for detailed error information:
tail -f storage/logs/laravel.log
We welcome contributions from the MacAdmin community! Here's how you can help:
Found a bug? Please open an issue with:
- Clear description of the problem
- Steps to reproduce the issue
- Expected vs actual behavior
- Environment details (PHP version, server type, etc.)
Have ideas for improvements? We'd love to hear them:
- Smart Customization Options (Email templates?)
- Email notification enhancements (Slack, Teams, SMS integration)
- Advanced scheduling options (per-department deadlines)
- Reporting features (compliance reports, analytics)
- Integration capabilities (JAMF, Kandji, Munki, SimpleMDM)
- Email Template Improvements: Better mobile responsiveness
- MDM Integration: Sync the subscribed macOS versions with your MDM or inventory solution
- IDP Integration: Connect with identity providers for smart updating of subscribers
- Internationalization: Support for multiple languages
- Advanced Analytics: Better reporting and insights
- Testing: More test coverage for edge cases
# 1. Fork the repository
git clone https://github.com/wycomco/macos-update-notifier.git
# 2. Install development dependencies
composer install
npm install
# 3. Set up testing environment
cp .env.testing.example .env.testing
php artisan migrate --env=testing
# 4. Run tests
php artisan test
# 5. Start development server
npm run dev
php artisan serve
- Follow PSR-12 coding style
- Write tests for new features
- Update documentation for any changes
- Use meaningful commit messages
- User Guides: Help write installation instructions for different platforms
- Video Tutorials: Create setup walkthroughs for non-developers
- Translation: Help translate the interface to other languages
- π¬ MacAdmins Slack: Join
#macos-update-notifier
channel - π Documentation: Check our Wiki
- π GitHub Issues: Technical problems and bugs
- π Laravel Docs: Framework documentation
- π Secure Authentication: Magic link system eliminates password vulnerabilities
- π‘οΈ Data Protection: Minimal data collection, secure storage practices
- π Input Validation: All user inputs are sanitized and validated
- π Audit Logs: Track administrative actions for compliance
- Data Collection: Only email addresses and update preferences
- No Tracking: No user behavior analytics or tracking cookies
- Self-Hosted: Full control over your subscriber data
- GDPR Compliant: Built-in unsubscribe and data deletion features
Found a security vulnerability? Please email [email protected] directly rather than opening a public issue.
This project is open source software licensed under the MIT License.
- β Commercial Use: Use in your organization freely
- β Modification: Customize for your needs
- β Distribution: Share with other MacAdmins
- β Private Use: Use internally without restrictions
While not required, we appreciate attribution when you share or modify this project.
Special thanks to:
- MacAdmins Community: For inspiration and feedback
- SOFA Project: For the macOS release data feed
- Laravel Community: For the amazing framework
- Beta Testers: MacAdmins who helped test and improve the system
Made with β€οΈ for the MacAdmin community