Upgrade to 1.0.4

Concerns: pushword/admin, pushword/admin-block-editor, pushword/core, pushword/dev-app, pushword/new, pushword/page-scanner, pushword/repurpose, pushword/static-generator

PHP 8.5 required

Pushword now requires PHP 8.5 because Markdown rendering uses Tempest. Sites running PHP 8.4: upgrade the PHP runtime before updating Pushword. If you copied the Dockerfile, update its FrankenPHP base images to the PHP 8.5 variants.

PHP strict types

Pushword PHP files now declare strict types, and the shared PHP-CS-Fixer rules preserve existing declarations. Sites with custom PHP extensions: run your tests and correct scalar type mismatches in overrides, callbacks, and service integrations. If you use the provided Rector configuration, copy vendor/pushword/dev-app/rector.php into your project, preserving local customizations, to enable strict-type declarations.

Optional native HTML minification

Static generation can use an experimental Rust minifier; PHP remains the default and requires no new tool. Sites opting into Rust: build the executable, set static_generator.native_html_minifier to its trusted path, then clear the Symfony container cache in the generation environment. See native acceleration for installation, fallback and measured limits.

Optional native content analysis

Content splitting can use Rust while retaining PHP fallback and existing block markers; PHP remains the default. Sites opting into Rust: build vendor/pushword/core/rust, deploy pushword-content-analyzer, set pushword.native_content_analyzer to its trusted path, then clear the Symfony container cache. See native acceleration for the supported HTML boundary and checks.

Optional native Markdown conversion

Markdown can use the same Rust analyzer for eligible blocks, with PHP fallback; PHP remains the default. Sites opting into experimental Rust Markdown: set pushword.native_markdown_renderer to the deployed pushword-content-analyzer path, then clear the Symfony container cache. See native acceleration for the measured conversion boundary and compatibility limits.

Markdown HTML serialization

Tempest now renders block and inline Markdown without CommonMark delegation. Attribute order, entity spelling, table tag spacing and malformed emphasis can change while links, attributes, IDs, code content and raw HTML remain compatible. Sites with custom Markdown syntax should test it before updating: unsupported syntax now raises a render error instead of delegating to CommonMark.

Optional native page-scan extraction

Page scans can prepare rendered link and responsive-image candidates, including obfuscated URLs and crawlability, and extract missing-alt labels, same-page anchors and unresolved date shortcodes with Rust; PHP remains the default. Sites opting into Rust: build vendor/pushword/page-scanner/rust, deploy pushword-page-facts, set pushword_page_scanner.native_page_facts to its path, then clear the Symfony container cache. Sites already using Rust page scans: rebuild and deploy the worker with this release; an older worker lacks the prepared-link fields and the scanner falls back to PHP. See native acceleration for the supported scope and measurement limits.

Contact markup

Obfuscated links, encoded e-mails and telephone links now use Pushword’s core component templates. Sites overriding `component/link_js.html.twig`, `component/encoded_mail.html.twig` or `component/phone_number.html.twig`: move styling to the class argument or site CSS; those template overrides are no longer used.

Editor links accept relative, HTTP(S), mailto and tel URLs; inline admin modals load only same-origin HTTP(S) URLs. Sites with custom link schemes or cross-origin inline-edit URLs: update those links or provide a same-origin admin route.

MariaDB transaction isolation

Pushword connections to MariaDB now use READ COMMITTED isolation so concurrent page and media writes can complete without stale-snapshot foreign-key errors. No action is needed.