Install Network Optimizer natively on macOS for maximum performance. Native installation is recommended over Docker Desktop, which limits network throughput to ~1.8 Gbps.
git clone https://github.com/Ozark-Connect/NetworkOptimizer.git
cd NetworkOptimizer
./scripts/install-macos-native.shThe script will:
- Install prerequisites via Homebrew (iperf3, nginx, .NET SDK)
- Build the application from source
- Sign binaries for macOS
- Set up OpenSpeedTest with nginx for browser-based speed testing
- Create a launchd service for auto-start
After installation, edit ~/network-optimizer/start.sh to configure environment variables:
# Timezone
export TZ="America/Chicago"
# Optional: Set admin password (auto-generated on first run if not set)
# export APP_PASSWORD="your-secure-password"Additional environment variables can be added to start.sh - see docker/.env.example for all available options including:
HOST_NAME- Hostname for canonical URL enforcementREVERSE_PROXIED_HOST_NAME- Hostname when behind a reverse proxy (enables HTTPS)OPENSPEEDTEST_HTTPS- Enable HTTPS for speed tests (required for geolocation)Logging__LogLevel__NetworkOptimizer/Logging__LogLevel__Default- Logging verbosity (see Enable Debug Logging)
Note: The app auto-detects its IP address, so HOST_IP is not required for native installations.
After editing, restart the service:
launchctl unload ~/Library/LaunchAgents/net.ozarkconnect.networkoptimizer.plist
launchctl load ~/Library/LaunchAgents/net.ozarkconnect.networkoptimizer.plist- Web UI: http://localhost:8042 or http://<your-mac-ip>:8042
- SpeedTest: http://localhost:3005 or http://<your-mac-ip>:3005
On first run, check the logs for the built-in admin account's auto-generated password, then sign in as admin:
grep -A5 'AUTO-GENERATED' ~/network-optimizer/logs/stdout.log# Stop
launchctl unload ~/Library/LaunchAgents/net.ozarkconnect.networkoptimizer.plist
# Start
launchctl load ~/Library/LaunchAgents/net.ozarkconnect.networkoptimizer.plist
# View logs
tail -f ~/network-optimizer/logs/stdout.logTo upgrade to a newer version:
cd NetworkOptimizer
git pull
./scripts/install-macos-native.shThe install script preserves your database, encryption keys, and start.sh configuration by backing them up before reinstalling.
The macOS native build uses a self-contained .NET runtime bundled with the app. The version you get depends on the .NET SDK installed via Homebrew at build time. Periodically update your SDK to pick up runtime stability and security fixes:
brew upgrade dotnetThen re-run the install script to rebuild with the updated runtime.
Application logs are in ~/network-optimizer/logs/:
# Follow live logs
tail -f ~/network-optimizer/logs/stdout.log
# View errors
tail -f ~/network-optimizer/logs/stderr.log
# Search for specific events
grep "UniFi" ~/network-optimizer/logs/stdout.log | tail -20For more detailed logs, edit ~/network-optimizer/start.sh and add:
# Debug logging for Network Optimizer application code only (recommended):
export Logging__LogLevel__NetworkOptimizer=Debug
# Or debug everything (verbose - includes framework/EF Core noise):
export Logging__LogLevel__Default=DebugThen restart the service:
launchctl unload ~/Library/LaunchAgents/net.ozarkconnect.networkoptimizer.plist
launchctl load ~/Library/LaunchAgents/net.ozarkconnect.networkoptimizer.plistRemember to set it back to Information when done - debug logging is verbose.
Logs are not rotated automatically. To clear them:
# Truncate without restarting
: > ~/network-optimizer/logs/stdout.log
: > ~/network-optimizer/logs/stderr.logIf you previously ran the install script with sudo, files and processes end up owned by root, which breaks future installs and upgrades. The install script detects this automatically and offers to fix it. Just run the script normally (without sudo):
./scripts/install-macos-native.shIt will prompt for your password once to clean up root-owned files and kill root-owned processes, then continue the installation as your regular user.
Never run the install script with sudo. Everything installs to your home directory and does not need root access.
If you forget the admin password, use the reset script:
curl -fsSL https://raw.githubusercontent.com/Ozark-Connect/NetworkOptimizer/main/scripts/reset-password.sh | bashThe script auto-detects the macOS native installation, clears the password, restarts the service, and displays the new temporary password.
Manual fallback:
# Stop the service
launchctl unload ~/Library/LaunchAgents/net.ozarkconnect.networkoptimizer.plist
# Clear the password
sqlite3 ~/Library/Application\ Support/NetworkOptimizer/network_optimizer.db \
"UPDATE AdminSettings SET Password = NULL, Enabled = 0;"
# Restart
launchctl load ~/Library/LaunchAgents/net.ozarkconnect.networkoptimizer.plist
# View the new password
grep "Password:" ~/network-optimizer/logs/stdout.log | tail -1# Stop and remove the service
launchctl unload ~/Library/LaunchAgents/net.ozarkconnect.networkoptimizer.plist
rm ~/Library/LaunchAgents/net.ozarkconnect.networkoptimizer.plist
# Remove application files
rm -rf ~/network-optimizer
# Remove data (database, keys) - optional
rm -rf ~/Library/Application\ Support/NetworkOptimizer