Your first web app

The two rules every web app on Falix must follow — read the port from SERVER_PORT and bind 0.0.0.0 — plus where to find your public address and how to test it in a browser.

A web app is only useful if people outside your server can reach it. On Falix that comes down to two rules, and once your code follows them, every web tutorial on the internet works here unchanged. This guide is the one thing to read before any of the stack-specific web guides.

At a glance
You need Any app server that can run a web server — Node.js, Python, Bun, Go, PHP, and more all qualify
Plan Any (free runs while your session timer has time; premium runs 24/7)
Time Five minutes

The two rules

Your Falix server gets exactly one public port. The panel hands it to your app in an environment variable called SERVER_PORT, and that number changes between servers — so you never hard-code it.

  1. Read the port from SERVER_PORT. Don't pick 3000 or 8080 and hope; ask the environment for the real one.
  2. Bind the address 0.0.0.0. This means "accept connections on every network interface." The tempting default, localhost (a.k.a. 127.0.0.1), only accepts connections from inside the container — so from the outside your app looks completely dead even though it's running.

🎯 Good to know: Almost every "works on my PC, not on the server" web problem is one of these two mistakes.

The rules in your language

Each of these reads SERVER_PORT, falls back to 8080 for local testing, and binds 0.0.0.0.

Stack Bind pattern
Node.js (http) .listen(port, '0.0.0.0')
Node.js (Express) app.listen(port, '0.0.0.0')
Python (Flask) app.run(host="0.0.0.0", port=port)
Bun hostname: '0.0.0.0'
Go ":" + port (all interfaces already)

Node.js (built-in http):

const http = require('node:http');

const port = process.env.SERVER_PORT || 8080;

http.createServer((req, res) => {
  res.end('Hello from Falix');
}).listen(port, '0.0.0.0', () => {
  console.log(`Listening on port ${port}`);
});

Node.js (Express):

const port = process.env.SERVER_PORT || 8080;

app.listen(port, '0.0.0.0', () => {
  console.log(`Listening on port ${port}`);
});

Python (Flask):

import os

port = int(os.environ.get("SERVER_PORT", 8080))
app.run(host="0.0.0.0", port=port)

Bun:

const port = process.env.SERVER_PORT || 8080;

export default {
  port,
  hostname: '0.0.0.0',
  fetch(req) {
    return new Response('Hello from Falix');
  },
};

Go: binding to ":" + port already listens on every interface, so there's no separate 0.0.0.0 argument:

package main

import (
    "net/http"
    "os"
)

func main() {
    port := os.Getenv("SERVER_PORT")
    if port == "" {
        port = "8080"
    }
    http.ListenAndServe(":"+port, nil)
}

Find your public address

Open your server's Network page and look at the Ports tab. That's your public address — an IP or hostname plus the port number. Put them together as a URL: http://your-address:your-port. Paste that into a browser on any device — your laptop, or your phone on mobile data — and, if your app is up and following the two rules, your page loads. It's a genuine public URL, so anything with an internet connection reaches it, which makes it the easy way to check how your site looks on a real phone. No SSL and a port in the URL, but it works instantly with zero setup — perfect for a first test.

🎯 Good to know: One port is all an ordinary website needs, and SERVER_PORT is that port. If you genuinely need a second listener — a separate service on its own port — the Ports tab also lets you add extra ports (free plans allow around four allocations in total, premium around 21). Only the primary one arrives as SERVER_PORT; any extra port you bind by the exact number shown on that tab.

Watch the console for "online"

On the Console page, a Node.js app flips the panel's status to online the moment it prints a line containing the word Listening — which is exactly why the snippets above log Listening on port ….

💡 Tip: That Listening line is a status signal, not just decoration, so keep it. (Other runtimes have their own ready-detection, so don't rely on this exact word outside Node.)

If the browser test fails, the console is where the reason shows up — read it from the top, since the first error is usually the real one.


Where to go next

You now know the rules; pick the stack that fits what you're building:

And when the ugly address:port URL has served its purpose, put a real domain and automatic HTTPS in front of it: Domains and HTTPS.

When it won't load

Reachability problems almost always trace back to the two rules — wrong port, or bound to localhost. The full checklist is in I can't reach my app.

Was this guide helpful?