statamic/ssg
Statamic SSG is a Laravel-powered addon that generates static HTML from your Statamic site for fast, secure, cache-friendly deployments anywhere. It supports incremental builds, multi-site setups, and familiar content workflows.
Architecture fit. statamic/ssg is a build-time compiler, not a runtime dependency. It executes inside an existing Laravel + Statamic application, crawls internal links, and emits a static HTML tree to disk. That single characteristic is what makes it a TPM-relevant decision rather than a developer convenience: it relocates operational risk out of the public request path (uptime, latency, autoscaling, attack surface) and into the build path (CI duration, artifact correctness, deploy orchestration). The package touches exactly three surfaces the adopting team already owns: an Artisan entry point (php please ssg:generate), a config file (config/ssg.php) that declares crawl scope, includes, excludes, and asset handling, and Laravel's filesystem for output. There is no API contract, no schema migration, no user-facing behaviour change, and no new vendor to procure. Coupling is low; the surrounding pipeline is the actual program of work, and a TPM should scope and staff it as such rather than as a package installation.
Integration feasibility. Two estimates must never be conflated in a status report, because stakeholders will anchor on the smaller one. Adopting the package is hours-to-a-day of Laravel-fluent engineering: composer require, publish config, enumerate routes, generate once, diff the output. Changing the delivery model is days to weeks: CI triggers, artifact storage, CDN configuration, cache invalidation, preview environments, rollback, staleness alerting — and much of that effort is not engineering time against this repository at all but platform, infra, and editorial-process work. Publishing a single "it's just a package install" number is the most common way this rollout gets mis-scheduled. The favorable side: the delivery target is host-agnostic (S3/CloudFront, Cloudflare Pages, Netlify, plain nginx), so the CDN decision can be evaluated on cost and operations independently rather than bundled into this adoption.
Technical risk. Low on the release itself, moderate one layer out. 4.1.0 contains exactly two changes: PHPUnit metadata migrated to attributes (test infrastructure only, zero runtime effect) and Laravel 13 support. No public API, config-schema, or generated-output changes versus 4.0, so the upgrade is non-breaking and low-ceremony. The real risk is version-matrix alignment: the widened illuminate/* constraints must co-resolve with the installed Statamic core major, and Laravel 13-era constraints typically move the PHP floor — which reaches CI images, build containers, and any preview host still pinned to an older runtime. Two secondary risks belong on the register from day one:
config/ssg.php is a hand-maintained route manifest with no compiler to catch omissions. A page missing from the manifest produces no build error; it simply isn't there. This is a permanent low-grade correctness risk.One ecosystem caveat worth naming to leadership: modest star count and effectively zero listed dependents means limited peer validation and no large body of community troubleshooting to lean on. Expertise must be built internally, not borrowed.
Key questions to answer before committing a date.
config/ssg.php as a reviewable artifact, and what process keeps it in sync with routing?Stack fit. Prerequisites are narrow and mechanically checkable: Laravel, Statamic installed, Composer 2, PHP at the floor implied by the new constraints, and a writable output directory. The generating environment needs nothing exotic — a standard CI runner is the natural execution target. The delivery target is host-agnostic, which is good procurement news: this package does not constrain the CDN decision, so hosting can be competitively evaluated on cost and operations rather than inherited from this rollout. Where Statamic is already in place, this is a low-incremental-cost path to static delivery versus re-platforming to Astro, Next.js, or Hugo; where it is not in place, adopting Statamic purely to get static generation is a coupling bet that warrants a spike, not a default.
Migration path — identify the lane explicitly, because effort differs by an order of magnitude and stakeholders will assume the cheapest one.
composer update. No config migration, no republished assets, no signature changes. One ticket. Do not inflate it into a release milestone.Compatibility — verify, don't infer. The release note says "supports Laravel 13"; it does not say what that does to our lockfile. Make verification a gate with a named owner and a date: run composer why-not statamic/ssg 4.1.0 on a branch, review the resolved lockfile diff, and confirm Statamic core, Laravel, and PHP all satisfy constraints simultaneously. Keep two decision tracks rigorously separate in the roadmap: the addon supporting Laravel 13 is not a mandate for the application to upgrade to Laravel 13. Merging those tracks manufactures an accidental forced migration out of a maintenance release — a classic TPM-visible schedule risk.
Sequencing — gates with exit criteria, because this is where the schedule actually lives.
Maintenance. Steady-state cost is genuinely small and concentrates in two places: the hand-curated route manifest and the deploy pipeline. Neither is self-healing. Assign a named owner for config/ssg.php and require manifest changes to be reviewed alongside routing changes — this is the control that prevents silent under-generation, and it is a process fix, not an engineering one. Budget a recurring half-day per quarter to re-verify the Composer matrix and re-run a clean generation, since addon and core majors move on different cadences and the static pipeline will otherwise drift out of the application's upgrade lane without anyone noticing.
Support. There is no vendor SLA and the ecosystem is thin — small star count, effectively no listed dependents. Troubleshooting knowledge must be built internally and captured in a runbook: how to reproduce a failed build locally, how to inspect an artifact, how to roll back, who to page. Treat the release notes as the primary source of truth and read them per release rather than assuming semantic-versioning safety; 4.1.0 happens to be genuinely non-breaking, but the same cannot be assumed for 4.2. Budget for one engineer to hold this as a secondary responsibility with documented coverage, so the pipeline is not a single-person bus factor.
Scaling. Scaling characteristics improve markedly and this is the strongest part of the business case. With no PHP or database in the request path, traffic scaling collapses to CDN egress, which is a commodity with predictable unit economics — useful for spiky or bursty properties like launch pages, event microsites, and docs portals. The constraint moves to build scaling: regeneration cost grows with page count and asset volume, and full rebuilds become the wrong tool once publish frequency rises or the site grows past the point where a rebuild is comfortably within CI budget. Watch for that inflection and flag it early; incremental generation is a different piece of work, not a config flag. Also note the read-heavy/write-light fit set — docs portals, marketing and brochure sites, blogs, event microsites — and treat any drift toward personalization or sub-minute freshness as a signal to revisit the architecture decision, not to patch around it.
Failure modes. Four are worth pre-mortem treatment, each with a detection control:
Ramp-up. Two distinct audiences with different curves. Engineering ramps quickly — Laravel-fluent developers are productive in a day, and the package's surface is small enough to read in an afternoon. Editors and content owners need a light but non-optional briefing on the changed mental model: publish is no longer instant, because content change now flows through build → deploy. Setting that expectation before launch prevents the most common post-launch complaint and the most common source of shadow workarounds. The organization as a whole needs a single owner for the build pipeline and a documented "is this page static-safe?" checklist used during rollout and at every subsequent content-archetype addition. Front-load that checklist into the spike; it is cheap to write and expensive to retrofit.
Recommendation. Treat the package as low-risk and adopt-worthy wherever Statamic is already in place, and gate the go/no-go decision on a short pipeline spike rather than on package capability — the package is not the variable, the pipeline is. Publish the two estimates separately (adopt the package: hours; change the delivery model: weeks), assign a named owner to the route manifest and another to the pipeline, and revisit the decision if content freshness, personalization, or traffic patterns shift toward genuinely dynamic needs.
How can I help you explore Laravel packages today?