nowo-tech / blog-kit-bundle
Reusable Symfony blog kit: multilingual articles, tags, comments, settings, LinkedIn hashtags, and a secured admin CRUD UI.
Package info
github.com/nowo-tech/BlogKitBundle
Type:symfony-bundle
pkg:composer/nowo-tech/blog-kit-bundle
Fund package maintenance!
Requires
- php: >=8.4 <8.6
- doctrine/doctrine-bundle: ^2.10 || ^3.0
- doctrine/orm: ^3.7
- nowo-tech/audit-kit-bundle: ^1.1
- nowo-tech/form-kit-bundle: ^2.13
- nowo-tech/routing-kit-bundle: ^1.4
- nowo-tech/ui-kit-bundle: ^2.15.3
- psr/clock: ^1.0
- psr/log: ^1 || ^2 || ^3
- symfony/clock: ^7.4 || ^8.0
- symfony/config: ^7.4 || ^8.0
- symfony/dependency-injection: ^7.4 || ^8.0
- symfony/deprecation-contracts: ^2.5 || ^3.0
- symfony/event-dispatcher: ^7.4 || ^8.0
- symfony/form: ^7.4 || ^8.0
- symfony/framework-bundle: ^7.4 || ^8.0
- symfony/http-foundation: ^7.4 || ^8.0
- symfony/http-kernel: ^7.4 || ^8.0
- symfony/routing: ^7.4 || ^8.0
- symfony/security-bundle: ^7.4 || ^8.0
- symfony/security-core: ^7.4 || ^8.0
- symfony/security-csrf: ^7.4 || ^8.0
- symfony/translation: ^7.4 || ^8.0
- symfony/twig-bundle: ^7.4 || ^8.0
- symfony/validator: ^7.4 || ^8.0
- symfony/yaml: ^7.4 || ^8.0
- twig/extra-bundle: ^3.12
- twig/string-extra: ^3.12
- twig/twig: ^3.8
Requires (Dev)
- dg/bypass-finals: ^1.11
- friendsofphp/php-cs-fixer: ^3.0
- igor-php/igor-php: ^0.10.1
- nowo-tech/phpstan-frankenphp: ^1.0
- phpstan/extension-installer: ^1.4
- phpstan/phpstan: ^2.0
- phpstan/phpstan-phpunit: ^2.0
- phpstan/phpstan-symfony: ^2.0
- phpunit/phpunit: ^13.4
- rector/rector: ^2.0
- vincentlanglet/twig-cs-fixer: ^4.0
Suggests
- nowo-tech/ckeditor5-editor-bundle: Rich text body editor in admin article forms.
- nowo-tech/pwa-bundle: Listen to BlogArticlePublishedEvent to send Web Push.
- symfony/flex: Automatic Flex recipe installation
Provides
None
Conflicts
None
Replaces
None
This package is auto-updated.
Last update: 2026-11-09 17:14:12 UTC
README
⭐ Found this useful? Give it a star on GitHub! It helps us maintain and improve the project.
Reusable Symfony blog kit for multilingual articles, tags, moderated comments, professional listing settings, LinkedIn hashtag sync, and a secured admin CRUD UI composed with UiKit and FormKit.
Compatible with Symfony 7.4+ and 8.x on PHP 8.4+
This bundle is FrankenPHP worker mode friendly, including the strict case where the kernel is not reset between requests (reset_kernel=false / no services_resetter). See FrankenPHP worker audit.
Public blog index |
Article detail |
Admin articles |
What is this?
Blog Kit Bundle gives Symfony applications a reusable blog domain backed by Doctrine. Editors manage articles, tags, and settings in a secured admin UI. Visitors browse a public index and article pages, search and filter by tag, and submit comments that wait for moderation. Hosts can hook BlogArticlePublishedEvent (for example Web Push) and sync trailing LinkedIn hashtags into tags.
Features
- Multilingual articles and tags with locale fallback (
es,enby default) - Public index and article routes at
/blogand/blog/{slug} - Moderated comments with staff replies, configurable rate limits, and CAPTCHA strategies
- Optional article HTML sanitizer (
none,strip,allowlist, or a host service) - Admin CRUD for articles, tags, comments, and singleton blog settings
- Paginated or infinite-scroll listing, configurable asides, and card options
- LinkedIn hashtag formatting command
nowo:blog:sync-hashtags BlogArticlePublishedEventafter an article becomes published- Configurable access:
access_roles, manage / moderate / configure roles, customaccess_checker, and object-level publication rules (security.object_access:none/owner/ hostservice) viaBlogKitAccessDenied - UiKit page contract (REQ-UI-003): admin pages on the UiKit list / form / settings scaffolds, public pages on the guest layout; one host layout pair and theme (
nowo_ui_kit.layouts,nowo_ui_kit.theme) for every bundle, no page forks - Twig namespace
NowoBlogKitBundlewith host override precedence - Symfony Flex recipe and FrankenPHP demo in
demo/symfony8
Quick start
composer require nowo-tech/blog-kit-bundle composer require twig/extra-bundle twig/string-extra
# config/packages/nowo_blog_kit.yaml nowo_blog_kit: user_class: App\Entity\User default_locale: es locales: [es, en] security: access_roles: [ROLE_ADMIN] roles: manage: [ROLE_EDITOR] moderate: [ROLE_MODERATOR] configure: [ROLE_ADMIN] allow_unauthenticated: false # object_access: # strategy: owner # config/packages/nowo_ui_kit.yaml — layouts and CSS stack shared by every nowo-tech bundle (REQ-UI-003) nowo_ui_kit: css_framework: bootstrap5 icon_set: bootstrap-icons layouts: admin: layouts/admin.html.twig guest: layouts/guest.html.twig
# config/routes/nowo_blog_kit.yaml nowo_blog_kit: resource: '@NowoBlogKitBundle/Resources/config/routing.yaml'
php bin/console doctrine:migrations:diff php bin/console doctrine:migrations:migrate
Public blog: /blog. Admin: /admin/blog, /admin/blog/tags, /admin/blog/comments, /admin/blog/settings.
Development
make up make test make phpstan make igor make -C demo/symfony8 up make -C demo/symfony8 demo-screenshots # refreshes docs/images/demo/*.webp make demo-smoke
Demo default URL: http://localhost:8105.
Documentation
- Installation
- Configuration
- Usage
- Contributing
- Code of Conduct
- Changelog
- Upgrading
- Release
- Security
- Engram
- Spec-driven development
- GitHub Spec Kit
Additional documentation
- PSR evaluation (REQ-CS-007)
- GitHub Actions CI requirements
- Demo with FrankenPHP
- FrankenPHP worker audit
Tests and coverage
| Area | Status | Command |
|---|---|---|
PHP src/ coverage target |
100% | make test-coverage-100 |
TS/JS src/Resources/assets |
≥90% | make test-ts |
| Unit and bundle QA | Enabled | make test |
| Full release checks | Enabled | make release-check |
- PHP: 100%
- TS/JS: 100%
- Python: N/A
make test
make test-coverage
make test-coverage-100
make test-ts
make assets
make release-check
License
MIT — see LICENSE.



