Local application development server


  • Basic compatibility with Google App Engine app.yaml files
  • Basic compatibility with Google App Engine dispatch.yaml files
  • Support for static files


To run an application defined in a app.yaml file:

$ railyard app.yaml

To run an application which uses a dispatch.yaml file:

$ railyard dispatch.yaml

Railyard will first search the folder it is run from for the service definition files, failing that, it will search folders matching the service names. For example, take the following dispatch.yaml:

  - url: "*/app1/*"
    service: app1

  - url: "*/app2/*"
    service: app2

Railyard will use files in the following order:

  • ./app1.yaml
  • ./app1/app1.yaml
  • ./app2.yaml
  • ./app2/app2.yaml

Supported variables

Only the following runtime variables are supported:

  • PORT - the port the service will listen at


-e, --entrypoint = ENTRYPOINT

Overrides the entrypoint defined in the input file(s) with the given ENTRYPOINT.

When input is a dispatch.yaml file, an ENTRYPOINT must be provided for each service defined in the dispatch.yaml file. The ENTRYPOINT overrides must be specified in the same order as the code:service definitions in dispatch.yaml file.



It is recommended to develop using a pipenv.

A development environment can be set up automatically:

$ pipenv install --dev

You can work directly inside the development environment:

$ pipenv shell

From inside the development environment, you can install the pre-commit hooks using pre-commit:

$ pre-commit install

To run the pre-commit hooks manually:

$ pre-commit run --all-files


To run the unit tests:

$ python -m unittest

The pre-commit tests are run using coverage. To see where the coverage tests are failing:

$ coverage report -m