cristianradulescu/staccato-bundle
A Symfony bundle by Cristian Radulescu that integrates the Staccato library into Symfony applications, handling service configuration and wiring so you can adopt Staccato with minimal setup. Install via Composer and enable the bundle to get started quickly.
staccato-bundle is a Symfony bundle (AbstractBundle, Twig templates, site:build Symfony console command). It will not drop into a Laravel app; adopting it means committing to (or already having) a Symfony runtime. Do not let "it's PHP, we're PHP" collapse this into a free swap.base_url path applied to every internal link and stylesheet) makes GitHub Pages project sites, S3/CloudFront, and Netlify-style targets viable. That's a real infra-cost line item, not a footnote.<html lang>, meta description (excerpt or site description), absolute canonicals for pages and paginated home pages, and an RSS alternate link. For a content-led growth roadmap, that means baseline SEO is a config exercise, not a backlog ticket — but also that anything beyond baseline (structured data, OG/Twitter cards, hreflang) is still your work.title, slug, date, excerpt, draft) with tolerant parsing (CRLF, BOM, trailing whitespace) and environment-aware drafts (dev includes, prod excludes) supports a "write in a PR, preview in dev, publish on merge" process. That's a decision about editorial tooling, not just code.include_default_styles / stylesheets / highlighter_css config, means launch quality is achievable with config alone and no designer in the critical path; per-template overrides live at the standard templates/bundles/StaccatoBundle/ path, so customization doesn't fork the vendor.--use-fixtures (Faker-based, optional dependency) generates demo content without committing real articles — useful for design review, sales demos, and stakeholder walkthroughs pre-launch.language value, no incremental builds, and index.md / slugs resolving to / are explicitly rejected because / is the generated homepage. If any of those are near-term roadmap items, budget for extension work or choose differently now.Adopt when all of these hold:
content/articles/, content/docs.md → /docs/).site:build with --clean / --no-clean).Look elsewhere when:
Practical evaluation step before committing: run bin/create-blog.sh, do one build, then deliberately break a front-matter field and one slug to confirm the failure mode preserves the prior output. That single test exercises the package's main differentiator (build safety) and its main constraint (strict path rules).
For executives (one paragraph): Staccato is a small open-source Symfony add-on that turns Markdown files in our repo into a complete static website — blog, docs, pagination, RSS, sitemap, 404, and basic SEO — with one command. It replaces custom glue code we would otherwise build and maintain, produces plain static files we can host cheaply (including on GitHub Pages sub-paths), and refuses to overwrite a working site if a build is broken. It is a v0.1.0, single-maintainer package and it is Symfony-only, not Laravel — so the recommendation is to pilot it on an internal docs site or microsite, not to standardize on it for revenue-critical properties until we've validated it in our own pipeline.
For engineering (the short version): Composer-installable Symfony bundle, validated staccato: config tree (12 keys: title, base_url, description, language, articles_per_page, footer_text, include_default_styles, stylesheets, highlighter_css, content_dir, build_dir, assets_dir). Markdown + YAML front matter via tempest/markdown, highlighting via tempest/highlight. Default templates under the @Staccato Twig namespace, individually overridable at templates/bundles/StaccatoBundle/<file>.twig — no forking. Helpers staccato_path(), staccato_url(), and a staccato config global. site:build with --clean / --no-clean / --use-fixtures; drafts included in dev, excluded in prod. Build validates config, content, duplicate output paths, and pagination conflicts before cleaning, so failed builds preserve prior output. Quality gate is real: PHP CS Fixer, PHPStan level 7, PHPUnit, composer qa.
For engineering (the caveats to state up front): Symfony only — no Laravel service provider, no Blade. Directory-style URLs; index.md and any slug resolving to / are rejected by design. No tags, search, or i18n. Full rebuilds only. Faker is an optional dependency and only needed for --use-fixtures. Pre-1.0 API: pin the version and expect config surface to move.
Ask: timebox a spike — scaffold with bin/create-blog.sh, build twice (success and induced failure), wire it into CI, and report on the override experience and upgrade risk. Decision gate: promote to a production-facing site only after the spike and after confirming no roadmap-adjacent need for search, tagging, or i18n within the next two quarters.
How can I help you explore Laravel packages today?