Indie Web Server

Screenshot of Indie Web Server in use

If only everything was as easy as setting up your own personal web server.

  1. Provision a Linux VPS and point your domain name to it (the hardest step).
  2. Connect to your VPS.
  3. Make a web page and start serving it over HTTPS.
    # Make a web page
    echo 'Hello, world.' > index.html
    # Install Indie Web Server
    wget -qO- | bash
    # Start your secure web site
    web-server enable

Hit your domain in a browser. It will take a few seconds to load on the first go as your Let’s Encrypt certificates are automatically provisioned for you.

That’s it!

You can close your terminal and your web server will continue to run. It will be restarted automatically should it crash or when the server reboots. Your TLS certificates will be automatically renewed for you as required.

Supported platforms

Linux and Linux-like operating systems are supported:

Note: the deployment server functionality requires systemd.


Copy and paste the following command into your Terminal. Before you pipe any script into your computer, always view the source code and make sure you understand what it does.

wget -qO- | bash


web-server uninstall


As a development server

You can also use Indie Web Server as a local development server with locally-trusted TLS certificates (no certificate warnings) on Linux, macOS, and Windows.

To start serving the current folder at https://localhost:


As a local proxy server

Say you’re running Hugo locally at its default location (http://localhost:1313) and you want to test it via TLS:

web-server proxy localhost:1313

Now you can view it at https://localhost and even your live reload will work as Indie Web Server in proxy mode also proxies WebSockets.

As a local development server with live sync of changes to your production server

web-server sync

Any changes in your current folder will be synced via rsync over ssh to You can customise all of those details via optional flags.

As a staging server

To give others access to your server without running as a deployment server (daemon):

web-server global

Then use, for example, ngrok (Pro+) to point a custom domain name to your temporary staging server. Make sure you set your hostname file (e.g., in /etc/hostname or via hostnamectl set-hostname <hostname> or the equivalent for your platform) to match your domain name. The first time you hit your server via your hostname it will take a little longer to load as your Let’s Encrypt certificates are being automatically provisioned by ACME TLS.

As a production server

web-server enable

Once your server is running, it will survive crashes and server restarts and you can use the following commands:


You can extend the server and create your own dynamic servers using Node.js:

npm i

Create your own dynamic web apps in Node.js using the API.

Learn more

web-server help

See the docs for full details, like using custom error pages and cascading archives and the 404→302 technique for an evergreen web.


Indie Web Server is Small Tech and an early artefact of the Hypha project.

Made with ♥ by

If you like our work, fund us.