Easy local domains and reverse proxy with HTTPS support

https, localhost, hosts, ngrok, vhosts
npm install @portless/cli@0.4.7



Easy local domains with superpowers

  • Create virtual local hosts (with https)
  • Expose public hosts with ngrok
  • Automatic certificates with Let's Encrypt for public hosts
  • Automatic URL rewriting in resources sent over the network
  • Automatic Cookie rewriting
  • Background deamon


npm i -g @portless/cli

# OR

yarn global add @portless/cli


Create a portless.config.js file in your project root:

const pkg = require('./package.json')

module.exports = {
  // Project name
  projectName: pkg.name,

  // Define your domains here
  domains: [
      id: 'app',
      public: 'app.ngrok.acme.com',
      local: 'app.acme.local',
      target: 'localhost:4000',
      id: 'graphql',
      public: 'graphql.ngrok.acme.com',
      local: 'graphql.acme.local',
      target: 'localhost:4100',

  // Corporate proxy (optional)
  targetProxy: 'http://acme.com/proxy',

  // Enable Let's Encrypt automatic certificates (optional)
  greenlock: {
    configDir: './config/greenlock',
    packageAgent: `${pkg.name}/${pkg.version}`,
    maintainerEmail: 'tom@acme.com',
    // Use Let's Encrypt staging servers
    staging: true,

  // Enable ngrok (optional)
  ngrok: {
    authtoken: '...',
    region: 'eu',

Start the deamon (it will auto-start on login):

portless start

Register your project (current folder):

portless add

Refresh your project if you changed the configuration:

portless refresh

Stop and uninstall the deamon:

portless stop

URL rewriting

You application should be setup to use your typical localhost URLs. Portless will take care of modifying them automatically on any resource sent via the network.

For example, if you expose your webpack dev server on http://localhost:8080, with the following domain in the config file:

  id: 'webpack',
  public: 'webpack.local.acme.com',
  local: 'webpack.acme.local',
  target: 'localhost:8080'

Portless will automatically rewrite the URLs to either webpack.local.acme.com or webpack.acme.local depending on the request host.

Special syntax

You can also use http://graphql.portless (with you domain id and the .portless extension) in your source code:


With the following domain configuration:

  id: 'graphql',
  public: 'graphql.local.acme.com',
  local: 'graphql.acme.local',
  target: 'localhost:4000'

Portless will automatically rewrite it too! If the request is coming from webpack.local.acme.com, it will transform your code to:


And if the request comes from webpack.acme.local, it will rewrite it to:


HTTPS rewriting

Portless will also make sure all your referenced URLs are either all in http or all in https depending on the request host.

For example, if the request is made from https://webpack.acme.local, it will rewrite your code with an https: