+Any tool that can pipe code through _Black_ using its stdio mode (just
+[use `-` as the file name](https://www.tldp.org/LDP/abs/html/special-chars.html#DASHREF2)).
+The formatted code will be returned on stdout (unless `--check` was passed). _Black_
+will still emit messages on stderr but that shouldn't affect your use case.
+
+This can be used for example with PyCharm's or IntelliJ's
+[File Watchers](https://www.jetbrains.com/help/pycharm/file-watchers.html).
+
+## blackd
+
+`blackd` is a small HTTP server that exposes _Black_'s functionality over a simple
+protocol. The main benefit of using it is to avoid paying the cost of starting up a new
+_Black_ process every time you want to blacken a file.
+
+### Usage
+
+`blackd` is not packaged alongside _Black_ by default because it has additional
+dependencies. You will need to do `pip install black[d]` to install it.
+
+You can start the server on the default port, binding only to the local interface by
+running `blackd`. You will see a single line mentioning the server's version, and the
+host and port it's listening on. `blackd` will then print an access log similar to most
+web servers on standard output, merged with any exception traces caused by invalid
+formatting requests.
+
+`blackd` provides even less options than _Black_. You can see them by running
+`blackd --help`:
+
+```text
+Usage: blackd [OPTIONS]
+
+Options:
+ --bind-host TEXT Address to bind the server to.
+ --bind-port INTEGER Port to listen on
+ --version Show the version and exit.
+ -h, --help Show this message and exit.
+```
+
+There is no official blackd client tool (yet!). You can test that blackd is working
+using `curl`:
+
+```
+blackd --bind-port 9090 & # or let blackd choose a port
+curl -s -XPOST "localhost:9090" -d "print('valid')"
+```
+
+### Protocol
+
+`blackd` only accepts `POST` requests at the `/` path. The body of the request should
+contain the python source code to be formatted, encoded according to the `charset` field
+in the `Content-Type` request header. If no `charset` is specified, `blackd` assumes
+`UTF-8`.
+
+There are a few HTTP headers that control how the source is formatted. These correspond
+to command line flags for _Black_. There is one exception to this: `X-Protocol-Version`
+which if present, should have the value `1`, otherwise the request is rejected with
+`HTTP 501` (Not Implemented).
+
+The headers controlling how code is formatted are:
+
+- `X-Line-Length`: corresponds to the `--line-length` command line flag.
+- `X-Skip-String-Normalization`: corresponds to the `--skip-string-normalization`
+ command line flag. If present and its value is not the empty string, no string
+ normalization will be performed.
+- `X-Fast-Or-Safe`: if set to `fast`, `blackd` will act as _Black_ does when passed the
+ `--fast` command line flag.
+- `X-Python-Variant`: if set to `pyi`, `blackd` will act as _Black_ does when passed the
+ `--pyi` command line flag. Otherwise, its value must correspond to a Python version or
+ a set of comma-separated Python versions, optionally prefixed with `py`. For example,
+ to request code that is compatible with Python 3.5 and 3.6, set the header to
+ `py3.5,py3.6`.
+
+If any of these headers are set to invalid values, `blackd` returns a `HTTP 400` error
+response, mentioning the name of the problematic header in the message body.
+
+Apart from the above, `blackd` can produce the following response codes:
+
+- `HTTP 204`: If the input is already well-formatted. The response body is empty.
+- `HTTP 200`: If formatting was needed on the input. The response body contains the
+ blackened Python code, and the `Content-Type` header is set accordingly.
+- `HTTP 400`: If the input contains a syntax error. Details of the error are returned in
+ the response body.
+- `HTTP 500`: If there was any kind of error while trying to format the input. The
+ response body contains a textual representation of the error.
+
+The response headers include a `X-Black-Version` header containing the version of
+_Black_.
+
+## Version control integration
+
+Use [pre-commit](https://pre-commit.com/). Once you
+[have it installed](https://pre-commit.com/#install), add this to the
+`.pre-commit-config.yaml` in your repository:
+
+```yaml
+repos:
+ - repo: https://github.com/psf/black
+ rev: stable
+ hooks:
+ - id: black
+ language_version: python3.6
+```
+
+Then run `pre-commit install` and you're ready to go.
+
+Avoid using `args` in the hook. Instead, store necessary configuration in
+`pyproject.toml` so that editors and command-line usage of Black all behave consistently
+for your project. See _Black_'s own [pyproject.toml](/pyproject.toml) for an example.
+
+If you're already using Python 3.7, switch the `language_version` accordingly. Finally,
+`stable` is a tag that is pinned to the latest release on PyPI. If you'd rather run on
+master, this is also an option.
+
+## Ignoring unmodified files
+
+_Black_ remembers files it has already formatted, unless the `--diff` flag is used or
+code is passed via standard input. This information is stored per-user. The exact
+location of the file depends on the _Black_ version and the system on which _Black_ is
+run. The file is non-portable. The standard location on common operating systems is:
+
+- Windows:
+ `C:\\Users\<username>\AppData\Local\black\black\Cache\<version>\cache.<line-length>.<file-mode>.pickle`
+- macOS:
+ `/Users/<username>/Library/Caches/black/<version>/cache.<line-length>.<file-mode>.pickle`
+- Linux:
+ `/home/<username>/.cache/black/<version>/cache.<line-length>.<file-mode>.pickle`
+
+`file-mode` is an int flag that determines whether the file was formatted as 3.6+ only,
+as .pyi, and whether string normalization was omitted.
+
+To override the location of these files on macOS or Linux, set the environment variable
+`XDG_CACHE_HOME` to your preferred location. For example, if you want to put the cache
+in the directory you're running _Black_ from, set `XDG_CACHE_HOME=.cache`. _Black_ will
+then write the above files to `.cache/black/<version>/`.
+
+## Used by
+
+The following notable open-source projects trust _Black_ with enforcing a consistent
+code style: pytest, tox, Pyramid, Django Channels, Hypothesis, attrs, SQLAlchemy,
+Poetry, PyPA applications (Warehouse, Pipenv, virtualenv), pandas, Pillow, every Datadog
+Agent Integration.
+
+Are we missing anyone? Let us know.