pushword/static-generator
Pushword Static Generator exports your Pushword site as static HTML, letting you deploy fast, secure, cache-friendly pages without running PHP in production. Ideal for blogs, docs, and brochure sites that need simple, reliable hosting.
Architecture fit. Pushword is a Symfony CMS delivered as a monorepo of bundles, not a standalone library. The static generator is one surface of that CMS: it consumes the Page/Media entities, the Twig render pipeline, the PushwordEvents event system, and Doctrine-backed content. That makes it a strong fit if we are adopting Pushword as the content system, and a poor fit as a generic "export my existing site to HTML" utility. The README-level claim ("create, manage and maintain your websites — from the admin, from Git, or from your AI agent") describes an opinionated authoring model, so the integration cost is concentrated in content modeling and workflow, not in the generator itself.
Integration feasibility. Two paths, materially different in cost:
Note the brief describes this as a "Laravel/PHP package." It is Symfony. Any plan assuming Laravel service-provider drop-in should be discarded before estimation.
Technical risk. Ranked:
doctrine:schema:update --force. That is safe in dev and hostile in production unless we own snapshot/restore and a pre-deploy schema diff.var/cache/pushword-pools that is deliberately kept across deploys. Correctness therefore depends on cache-version discipline: a render-path change that does not bump MarkdownParser::CACHE_VERSION (or SplitContent::TOC_CACHE_VERSION for TOC) ships stale HTML silently. Any entropy in a render path — timestamps, random(), unstable ordering — turns the incremental cache into a full rebuild with no error.Key questions.
--format=agent?main?content/redirection.csv is referenced for doc slugs — is there an equivalent for site content)?upgrade/<version>.md)?Stack fit. Symfony-first, Doctrine-first, Twig-first. In a Laravel estate, treat Pushword as a build tool in CI, not an application dependency: a container runs bin/console commands, produces a static artifact, and the artifact is deployed independently of the Laravel app. Accept that content authoring then happens in Pushword's admin or in Git, not in Laravel's Eloquent models.
Migration path.
Page/Media entities, mapped deliberately — this is the largest single line item.redirection.csv mechanism is the pattern to replicate for site content.doctrine:schema:update --force, then a captured schema snapshot as the production baseline.Compatibility. Verify three axes before committing: PHP version against our platform images, Symfony version against anything else we run, and database engine. SQLite is the default and the dev-app path; production on PostgreSQL or MariaDB introduces engine-difference risk precisely because there are no migrations to normalize it. Run the build against the production engine in CI, not SQLite.
Sequencing.
Maintenance. Two obligations fall on us that a normal package would absorb: schema management (no migrations) and cache-version discipline (bumping the Markdown and TOC cache constants whenever rendered output changes). Both are small, both are easy to forget, both fail silently. Add a checklist item to the PR template for rendering changes.
Support. Zero dependents means no external backstop: no Stack Overflow corpus, no third-party tutorials, no ecosystem of plugins to lean on. MIT licensing is the mitigation — budget for the ability to fork and patch, and confirm the team can read the Symfony bundle wiring well enough to do so. The repo's AGENTS.md and shipped vendor/pushword/docs/AGENTS.md are genuinely useful for agent-assisted maintenance, but they encode their conventions (composer stan, composer rector, never vendor/bin/phpunit, scoped git commit --only). Those gates do not exist in our repo and must be built or explicitly waived.
Scaling. Serving scales trivially — static files on a CDN. Build time is the real constraint. The skip-unchanged cache is what makes large sites tractable, which means the shared fragment pool becomes a scaling dependency: it must persist between builds, and it must not be written by two concurrent builds. Serialize builds per site or shard the pool per branch.
Failure modes to instrument.
schema:update against production without a snapshot. Gate deploys on a schema diff check and a restore-tested backup.Ramp-up. Expect two to three weeks for a Symfony-competent engineer to be productive across the content model, the build pipeline, and the cache invariants; longer for anyone coming from Laravel, because the mental model (bundles, services, Doctrine entities, Twig inheritance) does not transfer. Assign a single named owner for the Pushword integration — with 0 dependents and one upstream, an unowned integration decays into an unupgradeable pinned fork within two release cycles.
Recommendation posture. Worth a timeboxed spike if we are prepared to adopt Pushword's content model and Symfony as a build-time runtime. Not worth pursuing as a bolt-on exporter for a Laravel application. The go/no-go gate is the determinism test in step 1, not the feature list.
How can I help you explore Laravel packages today?