# List of the Experimental Features

## Introduction

Starting with RR `v2023.3.4`, we introduced a new capability called **Experimental Features**. This allows you to try out features that are not yet ready for production use.

## How to enable experimental features

To enable experimental features, run RR with the `-e` (`--enable-experimental`) flag. For example:

```bash
./rr serve -e
```

Or:

```bash
./rr serve --enable-experimental
```

## List of experimental features

### Support for loading [`envfiles`](https://github.com/roadrunner-server/roadrunner/issues/1077) in the `.rr.yaml`: `[>= v2023.3.5]`

In `v2023.3.5`, we added experimental support for loading `envfiles` in the `.rr.yaml` configuration file. `.env` file should be in the same directory as the `.rr.yaml` file.

Sample `.rr.yaml` file:

{% code title=".rr.yaml" %}

```yaml
version: "3"
envfile: .env
```

{% endcode %}

### Support for the HTTP/3 server: `[>=2023.3.8]`

In `v2023.3.8`, we added experimental support for an HTTP/3 server. It can work with the ACME provider to generate certificates for the HTTP/3 server automatically.

Sample `.rr.yaml` file:

{% code title=".rr.yaml" %}

```yaml
version: "3"

server:
  command: "php worker.php"
  relay: pipes

http:
  address: 127.0.0.1:15389
  pool:
    num_workers: 2
  http3:
    address: 127.0.0.1:34555
    key: "localhost+2-key.pem"
    cert: "localhost+2.pem"
```

{% endcode %}

Or if you use an ACME provider:

{% code title=".rr.yaml" %}

```yaml
version: "3"

server:
  command: "php worker.php"
  relay: pipes

http:
  address: 127.0.0.1:15389
  pool:
    num_workers: 2
  http3:
    address: 127.0.0.1:34555
    key: "localhost+2-key.pem"
    cert: "localhost+2.pem"
  ssl:
    acme:
      certs_dir: rr_le_certs
      email: you-email-here@email
      alt_http_port: 80
      alt_tlsalpn_port: 443
      challenge_type: http-01
      use_production_endpoint: false
      domains:
        - your-cool-domains.here
```

{% endcode %}

You can also generate test certificates manually and use them in the configuration file. To do that, use [mkcert](https://github.com/FiloSottile/mkcert) or [certbot](https://certbot.eff.org/):

```bash
mkcert -install && mkcert -client localhost 127.0.0.1 ::1 && mkcert localhost 127.0.0.1 ::1
```

This command generates the client and server certificates for the `localhost` domain. You can use them in the configuration file:

{% code title=".rr.yaml" %}

```yaml
version: "3"

server:
  command: "php worker.php"
  relay: pipes

http:
  address: 127.0.0.1:15389
  pool:
    num_workers: 2
  http3:
    address: 127.0.0.1:34555
    key: "localhost+2-key.pem" # <- generated by mkcert: "localhost+2-key.pem"
    cert: "localhost+2.pem" # <- generated by mkcert: "localhost+2.pem"
```

{% endcode %}

You can use client certificates in your preferred HTTP/3 client. For example, use [curl3](https://curl.se/docs/http3.html) to test the HTTP/3 server:

```bash
curl3 --http3 -k --cert localhost+2.pem --key localhost+2-key.pem https://127.0.0.1:34555/
```
