Skip to content
The modular HTTP2 web server for productive full-stack development
Branch: master
Clone or download
Latest commit cd9d5ed Dec 27, 2018

npm (tag) npm module downloads Build Status Coverage Status dependencies Status js-standard-style Join the chat at

Requires node v7.6 or above. Upgraders, please read the release notes.


The modular web server for productive full-stack development.

Use this tool to:

  • Build any flavour of web application (static site, dynamic site with client or server-rendered content, Single Page App, Progessive Web App, Angular or React app etc.)
  • Prototype any CORS-enabled back-end service (e.g. RESTful HTTP API or Microservice using websockets, Server Sent Events etc.)
  • Monitor activity, analyse performance, experiment with caching strategies etc.
  • Build your own, personalised CLI web server tool


  • Modular, extensible and easy to personalise. Create, share and consume only plugins which match your requirements.
  • Powerful, extensible command-line interface (add your own commands and options)
  • HTTP, HTTPS and HTTP2 support (HTTP2 requires node v8.4.0 or above)
  • URL Rewriting to local or remote destinations
  • Single Page Application support
  • Response mocking
  • Configurable access log
  • Route blacklisting
  • HTTP Conditional and Range request support
  • Gzip response compression, HTTP Basic Authentication and much more


This package installs the ws command-line tool (take a look at the usage guide).

Static web site

The most simple use case is to run ws without any arguments - this will host the current directory as a static web site. Navigating to the server will render a directory listing or your index.html, if that file exists.

$ ws
Serving at http://mbp.local:8000,,

Single Page Application

Serving a Single Page Application (an app with client-side routing, e.g. a React or Angular app) is as trivial as specifying the name of your single page:

$ ws --spa index.html
Serving at http://mbp.local:8000,,

By default, requests for typical SPA paths (e.g. /user/1, /login) return 404 Not Found as a file at that location does not exist. By marking index.html as the SPA you create this rule:

If a static file is requested (e.g. /css/style.css) then serve it, if not (e.g. /login) then serve the specified SPA and handle the route client-side.

Read more.

URL rewriting and proxied requests

Another common use case is to re-route certain requests to a remote server if, for example, you'd like to use data from a different environment. The following command would proxy requests with a URL beginning with to https://internal-service.local/api/:

$ ws --rewrite '/api/* -> https://internal-service.local/api/$1'
Serving at http://mbp.local:8000,,


Launching a secure server is as simple as setting the --https flag. See the wiki for further configuration options and a guide on how to get the "green padlock" in your browser.

$ ws --https
Serving at https://mbp.local:8000,,


Uses node's built-in HTTP2 support. HTTP2 servers are always secure using local-web-server's built-in SSL certificates (by default) or those supplied by --cert, --key or --pfx. See the wiki for further info about HTTPS options and a guide on how to get the "green padlock" in your browser.

$ ws --http2
Serving at https://mbp.local:8000,,

Mock responses

Imagine the network is down or you're working offline, proxied requests to https://internal-service.local/api/users/1 would fail. In this case, Mock Responses can fill the gap. Mocks are defined in a module which can be reused between projects.

Trivial example - respond to a request for /rivers with some JSON. Save the following Javascript in a file named example-mocks.js.

module.exports = MockBase => class MockRivers extends MockBase {
  mocks () {
    return {
      route: '/rivers',
      responses: [
          response: {
            type: 'json',
            body: [
              { name: 'Volga', drainsInto: 'Caspian Sea' },
              { name: 'Danube', drainsInto: 'Black Sea' },
              { name: 'Ural', drainsInto: 'Caspian Sea' },
              { name: 'Dnieper', drainsInto: 'Black Sea' }

Launch ws passing in your mocks module.

$ ws --mocks example-mocks.js
Serving at http://mbp.local:8000,,

GET your rivers.

$ curl
    "name": "Volga",
    "drainsInto": "Caspian Sea"
    "name": "Danube",
    "drainsInto": "Black Sea"
    "name": "Ural",
    "drainsInto": "Caspian Sea"
    "name": "Dnieper",
    "drainsInto": "Black Sea"

See the tutorials for more information and examples about mock responses.

Further Documentation

See the wiki for plenty more documentation and tutorials.


Requires node v7.6 or above. Install the previous release for node >= v4.0.0.

$ npm install -g local-web-server

© 2013-18 Lloyd Brookes Documented by jsdoc-to-markdown.

You can’t perform that action at this time.