NetSendo v2.7.1: Live Visitors and MCP Config Fixes for Docker
You open the Live Visitors page on your self-hosted NetSendo. On the server it works, but when a colleague opens it from their laptop, the real-time list stays empty. There's no error you can see and no visitors on screen. The browser is quietly trying to reach ws://localhost:8085, which on their machine points at nothing.
NetSendo v2.7.1 is a small fix release that solves this for Docker installs. It also fixes the same underlying bug in the MCP integration, so your MCP_API_KEY is found again. Below we explain what went wrong, how to upgrade and how to check your real-time setup.
VITE_REVERB_* settings in .env and sent browsers to localhost:8085 over plain http. The MCP status and php artisan mcp:test-connection could not find MCP_API_KEY either. Both now work. To upgrade, run docker compose pull && docker compose up -d. You don't need to change any config files or rebuild the frontend.
๐ What's New in v2.7.1
Live Visitors Connect Correctly
Browsers now receive the WebSocket address set in your .env instead of localhost.
MCP Key Detection
The panel's MCP status and the CLI connection test now read MCP_API_KEY.
Regression Guard
A new test fails if app code, routes or views call env() directly.
The Root Cause: env() and a Cached Config
NetSendo is built on Laravel. When the Docker entrypoint starts, it runs php artisan config:cache, which saves all configuration into one fast file. This is standard production practice, but it has a catch: once the config is cached, Laravel no longer loads .env. After that, env() returns nothing everywhere except inside the config files themselves.
Think of it like a printed restaurant menu. Once the menu is printed (cached), asking the kitchen's whiteboard (.env) for today's specials gets you no answer. You have to read the menu instead (config()).
The Live Visitors controller read VITE_REVERB_HOST, VITE_REVERB_PORT and VITE_REVERB_SCHEME directly with env(). With the cached config, all three came back empty, so the page fell back to its defaults: localhost, 8085 and http. That only worked if your browser ran on the server itself.
The Fix
These values now live in config/broadcasting.php under a browser key, and the page reads them with config(). Your existing .env entries keep working, for example:
VITE_REVERB_HOST=marketing.example.com
VITE_REVERB_PORT=443
VITE_REVERB_SCHEME=https
Because the values are passed to the page when the server renders it, they aren't built into the JavaScript bundle. After you change them, docker compose up -d applies them. You don't need to rebuild the frontend, which matters because npm run build can't run inside the production container anyway.
โน๏ธ Verified: The team tested this in the 2.7.0 image with a cached config. The old code sent the browser tolocalhost; the new code sends it to the address in.env.
MCP_API_KEY Is Found Again
The MCP status in the panel and the php artisan mcp:test-connection command had the same problem: they read MCP_API_KEY with env(). They also checked a services.mcp.api_key setting first, but that setting didn't exist. It now exists in config/services.php, so the key is picked up even with a cached config.
A Test to Stop It Coming Back
The new tests/Feature/RuntimeConfigTest.php does two things. It checks that the Live Visitors page uses the configured address, and it fails the build if app code, routes or views call env() directly. Future features can't bring this bug back by accident.
๐ผ Benefits & Use Cases
- Real-time visitor tracking works from any device, not just the server
-
.envchanges take effect after a container restart, with no rebuild - MCP integrations report their status correctly
- No config file changes since 2.7.0
E-commerce: Watching a Flash Sale Live
Your marketing team watches Live Visitors during a campaign launch to see traffic arrive from a newsletter. With v2.7.1, everyone on the team sees the same live list in their own browser, so you can:
- Confirm that campaign links bring in traffic within minutes
- Spot landing pages that get visits but no conversions
- Time follow-up sends, such as abandoned-cart reminders, based on real activity
SaaS: AI Assistants via MCP
If you connect AI tools to NetSendo through MCP to manage onboarding or churn-prevention campaigns, a false "key missing" status wastes debugging time. Now mcp:test-connection tells you whether your setup is really working.
Agencies: Many Instances Behind a Proxy
Agencies often run one NetSendo instance per client, each on its own domain behind a reverse proxy. Each instance can now have its own WebSocket host and scheme in .env. After a quick restart, the dashboards your clients open connect to the right address.
๐ ๏ธ Step-by-Step: Upgrading and Verifying
- Pull the new image
From your NetSendo directory, run:
docker compose pull && docker compose up -d - Check your Reverb values in .env
Set
VITE_REVERB_HOST,VITE_REVERB_PORTandVITE_REVERB_SCHEMEto the address browsers use to reach your WebSocket server. That is usually your public domain, notlocalhost. - Apply the changes
If you edited
.env, rundocker compose up -dagain. The entrypoint rebuilds the config cache with the new values. - Test from another computer
Open Live Visitors from a different device. In your browser's developer tools, go to the Network tab and filter by "WS". The connection should go to your domain, not
localhost:8085. - Test MCP (if you use it)
Inside the app container, run
php artisan mcp:test-connection(for example,docker compose exec <app-service> php artisan mcp:test-connection). Then check that the MCP status in the panel shows the key.
โ ๏ธ Common pitfall: If your panel loads over HTTPS, the browser will block a plainws://connection as mixed content. Behind a TLS proxy, setVITE_REVERB_SCHEME=httpsand use the proxy's public port, usually443.
๐ฏ Expert Tips
If you extend NetSendo or write your own Laravel code, add each new setting to a config file and read it with config(). The new test enforces this rule in NetSendo's own code.
If a .env change doesn't seem to apply, docker compose up -d --force-recreate makes sure the entrypoint runs again and rebuilds the config cache.
Make sure your reverse proxy passes the Upgrade and Connection headers to Reverb. Without them, the connection fails even when the address is correct.
Only the public host, port and scheme are sent to the browser. Keep MCP_API_KEY and other secrets in server-side config, which is where v2.7.1 now reads them from.
โ Conclusion
v2.7.1 is a small release with a real impact. In Docker installs, Live Visitors works for every user on every device again. The MCP integration correctly finds your API key. And a new test stops this kind of config bug from coming back. Upgrading takes one command and no config changes, and because you host NetSendo yourself, your visitor data stays on your own servers.
See the documentation for real-time and MCP setup details, browse the available integrations, or read the full release notes on GitHub.
Ready to Upgrade?
Get v2.7.1 running in under a minute. If NetSendo helps you, consider starring us on GitHub.



