NetrunHome

Services and scripts

Where to host a dashboard so colleagues actually use it

· 5 min read

In short

For colleagues to use your dashboard, you need dashboard hosting with a public address: a localhost link only opens on your own machine, and nobody sets up a VPN or port forwarding just to look at a few charts. Dashboard hosting for Streamlit, Dash, Plotly or Gradio works like this: you upload the code to Netrun, the platform builds the project, starts it and gives you an HTTPS link you can paste into a work chat. The one requirement for your code is that the app must listen on the port from the PORT environment variable and on 0.0.0.0, not on values written into the code.

A dashboard usually reaches the "works on my machine" stage in a single evening, and that is where the annoying part begins. Dashboard hosting has nothing to do with the language or the charting library: a local address will not open for a colleague, sending screenshots into a chat gets old fast, and the usual workarounds all fall apart. Putting everyone on the corporate VPN, forwarding a port or leaving your laptop running either never gets past the security team or stops working the moment you close the lid.

Netrun makes the path shorter: you upload the folder with your code, the platform sees that this is an app with a web interface, installs the dependencies, starts it and gives you a public HTTPS link. The principle is the same for Streamlit, Dash and Plotly, Gradio, or a plain web app with charts that you wrote yourself. Only the files inside the project change.

  1. Remove the hard-coded port and address#

    The port your dashboard runs on is set by the platform through the PORT environment variable, so read it from there instead of writing a number into your code or a framework settings file. Listen on 0.0.0.0, not on localhost: an app bound to localhost is reachable only by itself, and the link stays blank. A port typed straight into the code is the number one reason a dashboard builds fine but never opens.

  2. Decide where the data comes from#

    A data file sitting next to your code ships to the server with the project and only changes on the next publish. That is fine for a reference table and useless for daily numbers. If the data has to be live, read it from a database or from an external source with a key, not from an export bundled into the archive. There is no managed database service here: you either run a database next to the dashboard with your own docker-compose file, where the app and the database are two services of one project, or connect an external one. The platform asks for the connection string during setup and keeps it in secrets.

  3. Write whatever the dashboard produces into the persistent folder#

    Cached heavy computations, exported reports and settings saved by a viewer all belong in the project persistent folder /data. Files created next to the code are recreated in their original state on the next publish, while the contents of /data survive both code updates and restarts. You can see that folder in your Netrun account on the Data tab and download, upload or delete a file. If your project has its own docker-compose, there is no /data: persistent storage there means the named volumes declared in your own file.

  4. Put a password check inside the app#

    The link is public: anyone who has it can open it, so do the access check inside the app itself, with a login form or a shared password before any content is shown. In most dashboard frameworks this is either a setting or a small add-on, and in a custom app a simple form is enough. Keep the password in secrets: during project setup Netrun asks for the values and passes them into environment variables encrypted, so they never sit in the archive or the repository.

  5. Upload the code and send the link to your team#

    Bring the project in as an archive (ZIP, RAR, 7z, tar) or by importing a GitHub repository, including a private one. Do not include installed dependencies such as venv or node_modules, because they are installed during the build. The platform then builds the project, starts it and gives you an HTTPS address. Logs and publish status stream into your Netrun account in real time, so an error shows up straight away instead of as a blank page.

  6. Match the plan to how you show the dashboard#

    The free plan gives you one project, and the dashboard in it sleeps when nobody uses it for a while, then wakes up on its own when someone opens the link. The first visit after a pause is a little slower than usual. For an internal report that people check a couple of times a week that is fine. If you present the dashboard live on a call, or it has to respond quickly at any moment, take the Pro plan, where the project runs around the clock without sleeping.

The result is an ordinary address you can drop into a work chat, bookmark or embed in an internal wiki. No VPN, no port forwarding and no laptop left running: the project lives on a server, restarts itself after a crash, and updating the report comes down to uploading a new version of the code while the link stays the same. Try Netrun.

Common questions

Does this work for Dash, Plotly or Gradio?

Yes. The platform is not tied to one framework: any app with a web interface works as long as it listens on the port from the PORT environment variable. The stack is detected from the project files, such as requirements.txt for Python or package.json for Node.js, and the right start command is chosen automatically.

How do I make the numbers on the dashboard refresh by themselves?

The refresh has to happen inside the app: the dashboard reads fresh data from a database or an external source on every load, rather than from a file shipped with the code. There is no separate scheduler on the platform, so periodic recalculation is written into the code itself, either as a loop with a pause or with a scheduling library such as schedule or APScheduler in Python and node-cron in Node.js. Store the result in /data or in a database so it survives the next publish.

Can I make the dashboard visible only to my team?

There is no separate user and permission system on the platform side, and the link is public: anyone who has it can open it. So do the access check inside the app, with a login form or a shared password before the content is shown. Keep passwords and keys in the project's secrets rather than in the code, because they are encrypted and never end up in the archive or the repository.

The dashboard built fine, so why does the link show nothing?

Most often the app is listening in the wrong place: a fixed port or localhost is still in the code instead of 0.0.0.0. Remove your own values and read the port from the PORT environment variable. The second most common cause is an error at startup, such as a missing library or data file, and that is visible in the live logs in your Netrun account.

Can I host a ready-made BI tool like Metabase or Superset?

Yes, if the project comes with its own Dockerfile or docker-compose. The platform uses them and can run up to five linked services in one project, for example the BI app plus a database next to it. In that kind of project persistent storage is described by named volumes in your own compose file, and there is no /data folder. Such a setup is noticeably heavier than a small Streamlit dashboard, so check the current plan limits in your Netrun account.

Do I need my own server or VPS?

No. Netrun deploys your project on its own servers. There is no VPS to rent, no systemd or nginx to configure and no certificates to renew — all of that runs for you.

Why does my website sometimes sleep?

On the free plan, websites sleep after being idle and wake up in a couple of seconds on the first request. On the Pro plan your project runs without sleeping.

Is my data kept when I update the code?

Yes, as long as your data lives in persistent storage. For a regular project that is the /data folder: anything your app saves there stays in place when you update the code or restart, and you can browse and download the files on the "Data" tab. If you described the services yourself in docker-compose, persistent storage means the named volumes from your file, and such a project has no /data folder. Files written outside persistent storage are created from scratch on the next deploy. Your project link stays the same either way.

Where do I set tokens and other secret values?

Every project has a Secrets tab where you set the values from your code — for example the token from BotFather. We store them encrypted: you can see the variable names, but the values are shown to no one, including you.

Get your own project online

Upload your code, answer a couple of questions and get a working link. There is a free plan

Try Netrun
All blog articles