This is not a manual. It holds the pipelines that build, deploy and delete
the manuals on docs.typo3.org, generate the Fluid ViewHelper reference, and
render api.typo3.org. There is no Documentation/, no Makefile, no reST, and
none of the writing conventions that apply in the manual repositories.
Almost every change here is a change to a GitHub Actions workflow that runs against production: the deployment host, the search index, and other repositories.
.github/workflows/ the pipelines, see below
Build/fluid-viewhelpers/<version>/composer.json slim TYPO3 setup per documented version
Build/Scripts/ helper scripts called by workflows
| Workflow | Trigger | What it does |
|---|---|---|
main-rendering.yml |
repository_dispatch: render |
renders one manual and deploys it to the docs host |
main-deletion.yml |
repository_dispatch: delete |
removes one manual and its search data |
redirects.yml |
dispatch | deploys the redirect configuration |
fluid-viewhelper.yml |
daily 01:00 UTC | generates the Fluid ViewHelper reference |
api-typo3-org.yml |
daily 01:00 UTC | renders api.typo3.org and its start page, for the versions in versions.json of the split t3docs-typo3-api |
reenable-inactive-workflows.yml |
weekly, Monday 05:00 UTC | switches workflows disabled by inactivity back on, organisation-wide |
The two repository_dispatch workflows are triggered by Intercept
(intercept.typo3.com), which sends the manual's repository, branch and
target path as client_payload.
client_payloadis untrusted input. Never interpolate a payload field into a shell command, anscptarget or agit clone. Pass it through the ssh-actionenvsinput and quote it at the point of use. Intercept's own validation is loose and is not a substitute.- Actions must stay SHA-pinned. The organisation enforces an allow-list of SHA-pinned actions. Never replace a pin with a tag.
- The reusable workflows are no longer in this repository. They live in
TYPO3-Documentation/.github, which documents them, and are referenced asTYPO3-Documentation/.github/.github/workflows/<name>@main. - GitHub disables a scheduled workflow after 60 days without a commit to
this repository, and does so silently — the runs stop and no failed run
appears. Both
fluid-viewhelper.ymlandapi-typo3-org.ymldied this way in August 2026 and nobody noticed for a month.reenable-inactive-workflows.ymlnow switches such workflows back on and commits its report on every run, which is what keeps this repository's own schedules alive. Do not remove that commit as noise. fluid-viewhelper.ymlis a matrix over TYPO3 versions, and each entry pins its own PHP version because TYPO3mainneeds a newer PHP than the released branches. Adding a version means adding bothBuild/fluid-viewhelpers/<version>/composer.jsonand a matrix entry.- That job pushes straight to
TYPO3CMS-Reference-ViewHelper— it opens no pull request — and its push step iscontinue-on-error, so a failure there leaves the run green. Absence of commits is the only symptom. - The secrets are production deployment credentials. The remote scripts
run
rm -Rfand the upload runs withrm: trueagainst paths built from a secret. An empty variable would delete far more than intended, so guard every one with: "${VAR:?not set}".
There is no test suite. Before proposing a workflow change:
actionlinton the changed files.- Confirm the YAML still parses and the job graph is what you intended.
- Where a workflow has
workflow_dispatch, a manual run is the only real test. For anything destructive, dispatch it first against a path that does not exist, so the guards are exercised without deleting anything.
Follow the TYPO3 documentation conventions, as in the manual repositories: https://docs.typo3.org/m/typo3/docs-how-to-document/main/en-us/Howto/EditLocal.html
- Prefix the subject line with
[TASK],[BUGFIX], or[FEATURE], followed by a short, imperative summary. - Explain why the change is needed in the body — the diff already shows what changed.
- End with a
Signed-off-by: Your Name <email>trailer. - If AI assistance went beyond basic spelling/grammar checks, add an
Assisted-by: <tool/model name> <contact>trailer, e.g.Assisted-by: Claude Sonnet 5 <noreply@anthropic.com>. - No
Releases:trailer. This repository has onlymain, so the backport conventions do not apply.
Part of the existing history uses conventional fix: subjects instead. That
is drift, not a second convention to follow.
- When a commit is the only commit in the PR, the PR title and body must match the commit's subject and body exactly.
- Never commit or push without being asked.