---
title: "Installation"
manual: "Render guides"
version: "0.44"
permalink: "https://docs.typo3.org/permalink/t3renderguides:installation"
source: "Installation/Index.rst"
rendered: "2026-09-23T14:52:35+00:00"
---

# Installation {#installation}

This project is not a TYPO3 extension, but a standalone application
used to render documentation. If you want to learn more about how to write
documentation, please check the
[Contributing Guide - How to Document](https://docs.typo3.org/m/typo3/docs-how-to-document/main/en-us/Howto/Contribute/Index.html#contribute).

Multiple methods are provided to install the project on your local machine.
You can choose whatever is easiest for you:

-   Using Docker natively, with a provided official container
-   Using Docker natively, with a locally-generated container
-   Using DDEV (utilizing Docker)
-   Using PHP

> [!NOTE]
> The Docker container is the recommended way to use this project for
> end-users. It will automatically set up all dependencies and will not interfere
> with your local PHP installation or project. The container can be
> used in any project (and in any GitHub action) without further dependencies.

> [!TIP]
> Did you know: Instead of the `docker` client you can also use
> the lightweight drop-in replacement [Podman](https://podman.io/) to run
> the mentioned containers by replacing all `docker` commands in the
> following steps with `podman`.

## Docker {#setup-docker}

The Docker image is available on GitHub packages. You can pull the image with
the following command.

```shell
docker pull ghcr.io/typo3-documentation/render-guides:latest
```

For all available tags, please check the [GitHub packages page](https://github.com/TYPO3-Documentation/render-guides/pkgs/container/render-guides).
Once you have pulled the image, you can run the image to render your project's
documentation.

> [!NOTE]
> The Docker container internally contains a tagged release version of
> this repository, and use that version as well to reference asset
> URIs of the theme on our CDN.

```shell
docker run --rm -v $(pwd):/project ghcr.io/typo3-documentation/render-guides:latest --progress --config ./Documentation
```

Unlike other Docker images, this image will detect the owner-user of the mounted
project. This means that the files created by the Docker image will have the
same owner as the files in your project. No more permission issues should occur,
when files are getting generated inside the image.

> [!NOTE]
> Note that the parameter `-v $(pwd):/project` always uses `project` as
> the directory name. You do not need to replace that directory name with
> anything else, because the container rendering depends on this.

If this fails, you can resort to specifying the user:

```shell
docker run --rm --user=$(id -u):$(id -g) -v $(pwd):/project ghcr.io/typo3-documentation/render-guides:latest --progress --config ./Documentation
```

The provided image allows you to also perform a few other actions:

```shell
# Convert Settings.cfg to guides.xml:
docker run --rm -v $(pwd):/project ghcr.io/typo3-documentation/render-guides:latest migrate ./Documentation

# Check guides.xml files for XML conformity
docker run --rm -v $(pwd):/project ghcr.io/typo3-documentation/render-guides:latest lint-guides-xml

# Adapt guides.xml programmatically (work in progress)
docker run --rm -v $(pwd):/project ghcr.io/typo3-documentation/render-guides:latest configure \
  --project-version="2.2" \
  --project-title="My project title" \
  --project-release="2023" \
  --project-copyright="2000-2023" ./Documentation
```

### The whole manual as one Markdown file {#installation-single-markdown}

Every page is rendered to Markdown beside its HTML, which is what tools reading
a single page want. A tool that wants to read the *whole* manual at once --
a local language model being the obvious case -- is better served by one file.

Pass `--single-markdown` to get it:

```shell
docker run --rm -v $(pwd):/project ghcr.io/typo3-documentation/render-guides:latest \
  --single-markdown ./Documentation
```

The result is a single `Documentation-GENERATED-temp/singlemd/Index.md`
containing every page, in the order of the table of contents, separated by
horizontal rules, under one YAML front matter block describing the project.

A link to another page of the same manual points inside the file, because that
page is in it. Markdown cannot give a heading an id, so the file writes an empty
HTML anchor before each target. Only anchors that identify one place are
written: a heading such as "Configuration" occurs in many pages of a large
manual, and a link to it would land on whichever came first. Those links, and
every link to another manual, stay permalinks to `docs.typo3.org` and keep
working wherever the file is copied.

> [!NOTE]
> The option renders *only* that file: no HTML, and no per-page Markdown.
> That is what makes it quick enough to re-run whenever the documentation
> changes. Images the manual references are copied next to it, because the
> Markdown points at them and would otherwise point at nothing.

This is deliberately a local tool. Nothing publishes the file, and
`docs.typo3.org` does not carry it -- the published manuals offer the
per-page Markdown instead, which is linked from every page as
`<link rel="alternate" type="text/markdown">`.

### The whole manual as one HTML page {#installation-single-html}

For reading or printing a manual in one piece, pass `--single-html`:

```shell
docker run --rm -v $(pwd):/project ghcr.io/typo3-documentation/render-guides:latest \
  --single-html ./Documentation
```

The result is `Documentation-GENERATED-temp/singlehtml/Index.html`,
every page of the manual in the order of the table of contents, styled like
the rendered manual.

Like `--single-markdown`, the option renders *only* that file. Passing
both renders both files in one run.

`docs.typo3.org` does not carry this page either: it is no longer rendered
with every manual, and the rendered pages no longer link to it.

In case of errors you can increase verbose output by prefixing any command with the argument
`verbose`:

```shell
# Execute verbose commands with inline setting
docker run --rm -v $(pwd):/project ghcr.io/typo3-documentation/render-guides:latest verbose (render|migrate|lint-guides-xml|configure) [arguments/options]

# Execute verbose commands with inline setting, useful for i.e. external actions
SHELL_VERBOSITY=3 docker run --rm -v $(pwd):/project ghcr.io/typo3-documentation/render-guides:latest (render|migrate|lint-guides-xml|configure) [arguments/options]
```

Another way to utilize Docker is to create your own image/container. This is aimed at people
who want to contribute to the underlying Documentation tool. Please see [Building](https://docs.typo3.org/permalink/t3renderguides:building)
for those steps.

## DDEV {#setup-ddev}

[DDEV](https://ddev.com/) is a utility layer on top of Docker. It allows to easily
build and maintain local development instances with specific environments.

This project also ships a `.ddev/` configuration directory, that allows
you to start a specific container in which you can render Documentation, and
have an environment where you can contribute to this repository without any
other requirement than Docker and DDEV.

To render the documentation you can run

```shell
ddev start
ddev composer install
ddev composer make docs
```

## PHP {#setup-php}

If your host environment already has a PHP binary and is able to run Composer,
as well as interpret Makefile syntax (i.e. through a `build-essential` package),
you can create documentation natively, without needing docker.

You can run these commands locally:

```shell
composer install
make docs
```

The provided Symfony Commands can be executed via:

```shell
./packages/typo3-guides-cli/bin/typo3-guides (migrate|lint-guides-xml|configure)
```
