.. SPDX-License-Identifier: CC-BY-4.0
.. SPDX-FileCopyrightText: Netresearch DTT GmbH
.. include:: /Includes.rst.txt
.. _changelog:
=========
Changelog
=========
All notable changes to Content Repurpose (``nr_repurpose``) are documented here.
The format follows `Keep a Changelog `_ and the
project adheres to `Semantic Versioning `_. This page
lists the main points of each release; the full entries, with the reasoning
behind each change, are in the repository's
`CHANGELOG.md `__.
.. _version-0-9-0:
Version 0.9.0 (2026-09-30)
==========================
Security
--------
- A source URL can no longer reach the host or the internal network: only
``http`` and ``https`` are fetched, and a host that resolves to a
loopback, private, link-local or reserved address is refused.
- A remote source is limited to 5 MiB and 30 seconds (a PDF to 50 MiB and
120 seconds), and redirects are not followed. The time limit covers the
whole transfer only with the PHP extension ``curl``; without it, it
applies to each read. See :ref:`troubleshooting-source-limits`.
- Job and artifact errors no longer show the text model's messages, server
paths, SQL, process output or webhook URLs; those go to the TYPO3 log. A
source URL in an error, a label or a prompt is shown without user name,
password, query and fragment.
- HTML renders run without JavaScript and without network access.
- Vision OCR of a PDF needs the ``nrrepurpose:generate_vision`` permission.
Added
-----
- A developer chapter, a troubleshooting page and a usage chapter with
screenshots of the backend module.
- ``LICENSE`` with the GPL-2.0 text, and README instructions for verifying
a release.
Changed
-------
- **Requires nr-vault 1.1** (``^1.1``, was ``^0.16``) and therefore nr-llm
0.38.2 or later. nr-vault 1.x refuses a provider host that DNS does not
resolve: a host reached through :file:`/etc/hosts` or a container
runtime's resolver needs an entry in
``$GLOBALS['TYPO3_CONF_VARS']['HTTP']['allowed_hosts']``.
- The Netresearch-theme Schaubild, story slides, slide deck and handout
carry the [n] logo and a linked company footer; the extension icon is the
[n] symbol.
- Record forms, permission options and extension settings are translated
(English and German).
- ``composer.json`` carries the extension version and
``providesPackages``; ``typo3/cms-install`` moves to ``require-dev``.
- The renderer passes the Chromium path to ``render.cjs`` itself; the
worker no longer needs to export ``CHROMIUM_PATH``. See
:ref:`configuration-rendering`.
- **Breaking for custom PHP code:** the pipeline passes a typed
``JobSnapshot`` instead of the raw job row
(``SourceIngestionServiceInterface::ingest()``,
``DocumentAnalyzerInterface::analyze()``, ``PdfFileResolver::resolve()``,
``GenerationContext``), and ``ProcessRunnerInterface::run()`` takes an
optional ``$env`` argument. Code that implements or calls these has to
follow.
Fixed
-----
- A failed job names how many formats failed, instead of showing an empty
error, and its artifact count matches its artifacts.
- A ``pdf_fal`` job reads the PDF attached to it, not the file whose uid
equals the number of attachments.
- Story headlines no longer run off the slide, and the footer and copy stay
legible over a KI background.
- A podcast no longer fails on a numeric persona name or a nested value in
the dialogue script.
- Slide renders and most temp files of a run are removed.
- The job list is paged, draws its progress bar and fits the module; error
text on cards and table rows is readable in the dark scheme.
- Source downloads work under Guzzle 8.
- ``ext_emconf.php`` states the same dependency ranges as
``composer.json``.
.. _version-0-8-2:
Version 0.8.2 (2026-09-27)
==========================
Fixed
-----
- The *Create & queue* button gives its feedback again: its script is now an
ES module instead of an inline script the backend Content Security Policy
refused, so a double click can no longer queue a job twice.
- An alt-text generator listening to FAL events no longer fails every PNG
artifact: files are written with their bytes in place before FAL indexes
them. The podcast subtitles (``vtt``) are added to ``textfile_ext``.
.. _version-0-8-1:
Version 0.8.1 (2026-09-27)
==========================
Changed
-------
- Accepts nr-llm 0.38 (``^0.35 || ^0.36 || ^0.37 || ^0.38``).
.. _version-0-8-0:
Version 0.8.0 (2026-09-27)
==========================
Added
-----
- **Story video**: the finished story slides can also become one silent
1080×1920 MP4 (option *Also as video*).
- **Approval step** for every artifact, gated by the custom permission
``nrrepurpose:approve_artifacts``. See :ref:`adr-007`.
- **Social planning**: approved social posts are scheduled and sent to a
webhook by the command ``nr_repurpose:publish-due``. See
:ref:`configuration-social`.
- **Two documents as PDF**: a 16:9 slide deck and an A4 handout, printed by
the headless Chromium. See :ref:`adr-006`.
- The PDF carries the AI label in its document information and XMP
metadata.
New database columns: run the database analyzer after the update.
.. _version-0-7-0:
Version 0.7.0 (2026-09-26)
==========================
Added
-----
- **Every artifact is labelled as AI-generated**, machine-readable in each
stored file and in the artifact metadata; the visible labels are
controlled by ``aiLabelImages`` and ``aiLabelTexts``. See
:ref:`configuration-ai-label` and :ref:`adr-005`.
.. _version-0-6-0:
Version 0.6.0 (2026-09-25)
==========================
Security
--------
- Source text can no longer pose as an instruction in the text completions
(document analysis, podcast, Schaubild, story, text formats): the source
material reaches the model only as one block marked as untrusted data
(CWE-1427). Image-generation prompts and the PDF vision OCR are not
covered; see :ref:`adr-004`.
Added
-----
- **Four text formats**: executive summary, FAQ, social posts and
newsletter text, each one schema-validated nr-llm call, off by default.
See :ref:`adr-004`.
New database columns: run the database analyzer after the update.
.. _version-0-5-3:
Version 0.5.3 (2026-09-24)
==========================
Changed
-------
- Accepts nr-llm 0.37 (``^0.35 || ^0.36 || ^0.37``).
.. _version-0-5-2:
Version 0.5.2 (2026-09-23)
==========================
Changed
-------
- Accepts nr-llm 0.36 (``^0.35 || ^0.36``).
Fixed
-----
- The permissions ``generate_audio`` and ``generate_vision`` are enforced.
Editors whose groups do not carry them no longer get podcast audio and AI
imagery. See :ref:`configuration-permissions` and :ref:`adr-008`.
.. _version-0-5-1:
Version 0.5.1 (2026-09-17)
==========================
Fixed
-----
- :path:`ext_emconf.php` declares ``nr_llm 0.35.0-0.35.99``, matching
:path:`composer.json`.
.. _version-0-5-0:
Version 0.5.0 (2026-09-17)
==========================
Changed
-------
- Requires nr-llm ``^0.35``.
Fixed
-----
- The ``nr_repurpose_text`` preset is declared once; the duplicate made
nr-llm's Configurations module answer with an error.
- Resolving the ``nr_repurpose_text`` configuration passes the value object
nr-llm 0.35 expects; a string raised a ``TypeError`` that would have
bypassed the fallback to the instance-default configuration.
.. _version-0-4-9:
Version 0.4.9 (2026-09-03)
==========================
Fixed
-----
- The ``nr_repurpose_text`` preset asks only for the ``chat`` capability,
so it can be imported.
- :path:`ext_emconf.php` declares ``nr_vault``.
.. _version-0-4-8:
Version 0.4.8 (2026-09-03)
==========================
Added
-----
- The **Content Repurpose Starter** use-case pack. See
:ref:`configuration-starter-pack`.
Changed
-------
- Requires nr-llm ``^0.34``.
.. _version-0-4-7:
Version 0.4.7 (2026-08-21)
==========================
Changed
-------
- Requires nr-llm ``^0.33``.
.. _version-0-4-6:
Version 0.4.6 (2026-08-21)
==========================
Added
-----
- Every nr-llm call names this extension and its pipeline step, so nr-llm's
analytics attribute usage and cost to ``nr_repurpose``.
Changed
-------
- Requires nr-llm ``^0.32``.
.. _version-0-4-5:
Version 0.4.5 (2026-08-20)
==========================
Changed
-------
- Requires nr-llm ``^0.31``.
.. _version-0-4-4:
Version 0.4.4 (2026-08-19)
==========================
Changed
-------
- Requires nr-llm ``^0.30``.
.. _version-0-4-3:
Version 0.4.3 (2026-08-13)
==========================
Changed
-------
- Accepts nr-llm 0.29 alongside 0.28.
.. _version-0-4-2:
Version 0.4.2 (2026-08-11)
==========================
Added
-----
- The extension setting :confval:`technicalBeUserUid `.
Fixed
-----
- Generation jobs no longer fail in the analysis step with a denied
nr-vault read, once a technical backend user is configured.
Changed
-------
- Requires nr-vault ``^0.15``.
.. _version-0-4-1:
Version 0.4.1 (2026-08-10)
==========================
Changed
-------
- Requires nr-llm ``^0.28``.
.. _version-0-4-0:
Version 0.4.0 (2026-08-07)
==========================
Changed
-------
- Requires nr-llm ``^0.26``.
Removed
-------
- The public alias for nr-llm's capability permission service, which
nr-llm 0.26 removed.
.. _version-0-3-1:
Version 0.3.1 (2026-07-31)
==========================
Changed
-------
- Accepts nr-vault 0.12 (``^0.10.0 || ^0.11.0 || ^0.12.0``).
Fixed
-----
- :path:`Documentation/guides.xml` states the released version.
.. _version-0-3-0:
Version 0.3.0 (2026-07-24)
==========================
Changed
-------
- Requires nr-llm ``^0.25``.
.. _version-0-2-3:
Version 0.2.3 (2026-07-22)
==========================
Changed
-------
- Accepts Symfony 8 for ``symfony/process`` and ``symfony/messenger``.
Fixed
-----
- Composer resolves the latest tag: the explicit ``version`` field is removed
from :path:`composer.json`.
.. _version-0-2-2:
Version 0.2.2 (2026-07-22)
==========================
Added
-----
- nr-llm 0.23 support (``completeStructured()``), and a documentation render
job in CI.
Fixed
-----
- The documentation renders again (repaired :path:`guides.xml`).
.. _version-0-2-1:
Version 0.2.1 (2026-07-21)
==========================
Changed
-------
- Backend icons in the TYPO3 v14 style, and a record icon for artifacts.
- Accepts nr-vault 0.11.
Fixed
-----
- Borders in the job detail view follow the dark scheme.
.. _version-0-2-0:
Version 0.2.0 (2026-07-18)
==========================
Added
-----
- **One-click nr-llm configuration presets** for ``nr_repurpose_text``,
``nr_repurpose_image`` and ``nr_repurpose_tts``.
- Text generation routes through the ``nr_repurpose_text`` configuration.
Changed
-------
- Requires nr-llm ``^0.22.0``.
.. _version-0-1-0:
Version 0.1.0 (2026-06-12)
==========================
Initial alpha release.
Added
-----
- **Three artifact generators.** From one source (URL or PDF) the pipeline
derives a single :php:`ContentBrief` via nr-llm and generates a
persona-aware podcast with one to three speakers (TTS + ffmpeg stitch +
WebVTT subtitles), a Schaubild diagram in
three variants (HTML, HTML-with-AI-background, full AI image), and a
multi-slide 9:16 Instagram story carousel.
- **Prompt-snippet steering.** Persona, tone, audience, image-style and
layout selectors in the job form, backed by nr-llm's prompt-snippet
library; layout snippets carry an ``imageSize`` metadata key that drives
gpt-image-2 output dimensions per channel.
- **Live progress and prompt transparency.** The job detail view shows
fine-grained per-step progress with auto-refresh while a job runs and,
for every artifact, the complete creation parameters: the exact system,
user and image prompts, models, image sizes and voices.
- **Central usage and cost tracking.** Image and speech models resolve
through nr-llm Configuration records (``nr_repurpose_image``,
``nr_repurpose_tts``), so every call is attributed per model and per
configuration in the nr-llm analytics module.
- **Ingestion.** URL fetch with deterministic DOM main-content extraction, and
a tiered PDF reader (embedded text → Vision OCR for sparse pages → poppler
layout extraction for tabular pages), selectable per job via ``pdf_mode``.
- **Asynchronous generation.** Job submission dispatches a
:php:`GenerateArtifactsMessage` onto a Symfony Messenger transport; a
long-running worker consumes it and runs the orchestrator. See
:ref:`adr-001`.
- **Node + Playwright renderer.** A bundled CommonJS script
(``render.cjs``) drives the apt ``chromium`` binary through
``playwright-core`` to turn branded Fluid HTML into PNGs. See :ref:`adr-002`.
- **Backend module.** *Repurpose* (``web_nrrepurpose``) with a job list,
a submission form, and a result view that plays the podcast and shows every
generated image.
- **CLI command.** ``nr_repurpose:generate `` runs the full pipeline
synchronously for ops and debugging.
- **Vault-backed OpenAI key.** The OpenAI key is stored in nr-vault and read
by identifier (``nr_repurpose_openai``) by nr-llm. See :ref:`adr-003`.