A blog extension for TYPO3 built entirely on core concepts — pages as posts, content elements for article bodies, and categories/tags for organization. If you know TYPO3, you already know how to use this blog.
Upgrading a sitepackage from a previous version? The
renderPluginsection in the shipped templates moved tott_content.{listType}.20for TYPO3 v14 workspace safety. See Development: Template migration notes for the rationale and the one-line template change.
| Blog Extension | TYPO3 | PHP |
|---|---|---|
| 15.x | 14.3-14.x | 8.2-8.4 |
- Pages as blog posts — Blog entries are pages with a dedicated page type (doktype 137). Create and manage them in the page module like any other page.
- All content elements — Use every content element and backend layout you already have. No proprietary content model.
- Categories and tags — Organize posts with TYPO3 system categories and custom tags. Filter and list by category, tag, author, or date.
- Authors — Multi-author support with avatars (Gravatar or uploaded image), social links, bio, and dedicated author pages.
- Comments — Built-in comment system with moderation workflow (pending/approved/declined/deleted), optional Google reCAPTCHA, optional Disqus, and email notifications.
- Workspace support — Full TYPO3 Workspaces integration. Stage blog posts, tags, and authors before publishing. Comments remain live-editable.
- 20 Extbase plugins — 14 editor-selectable content elements plus 6 widget/feed renderers for sidebars and RSS feeds.
- 3 backend modules — Dedicated modules for post overview, comment management, and blog setup wizard.
- Site sets and customizable templates — Use the
blog/standalone,blog/integration, orblog/bootstrap-53site sets. Override any Fluid template in your sitepackage. - RSS feeds — Built-in feed support with featured images.
- Routing — Ships route enhancers for posts, categories, tags, authors, archive, pagination, and feed URLs.
- SEO — Sets page titles plus description, Open Graph, and Twitter description/title tags for archive, category, author, and tag listings.
composer require t3g/blogThen add a Blog site set to your site configuration:
blog/standalonefor a generated standalone blog page treeblog/integrationfor integration into an existing siteblog/bootstrap-53when you want the shipped Bootstrap 5.3 frontend templates
For detailed setup instructions, see the documentation. For local contribution and testing, see the development guide.
- Install via Composer
- Go to Blog > Setup in the TYPO3 backend
- Use the Setup Wizard to create a fully configured blog instance
- Start writing posts
For manual integration into an existing site, see the Manual Setup guide.
The extension supports TYPO3 Workspaces for editorial staging workflows:
| Table | Behavior |
|---|---|
| Blog posts (pages) | Fully versioned |
| Tags | Fully versioned |
| Authors | Fully versioned |
| Comments | Always live-editable |
| Categories | Fully versioned (core) |
See the Workspace documentation for details.
- Include
EXT:blog/Configuration/Routes/Default.yamlin your site configuration when you set up a blog manually. The setup wizard writes this import for generated standalone blogs. - The
blog/standaloneset loads Bootstrap 5.3 from jsDelivr with SRI attributes. Self-host those assets or adapt your CSP whendefault-src 'self'is enforced. - Gravatar proxying is disabled by default. Enable
enableGravatarProxyin extension configuration if avatars should be fetched by TYPO3 and served fromtypo3temp.
The repository no longer ships a tracked DDEV setup. Use any local TYPO3 v14 environment with PHP 8.2-8.4, MySQL or MariaDB, Composer, and Node.js/npm.
# Install dependencies
composer update
npm ci
# Build frontend assets
npm run build
# Run PHP test suites
composer test:php:lint
composer test:php:unit
composer test:php:functional
# Static analysis
composer phpstan
# Code style
composer cgl
composer cgl:fix
# CI-equivalent dispatcher
Build/Scripts/runTests.sh -s allThe functional test runner defaults to SQLite via pdo_sqlite, so local runs
do not need a running database server. It also defaults TYPO3_PATH_APP to
.build and TYPO3_PATH_ROOT to .build/public.
Set any typo3Database* variable to use a database server instead. Missing
database variables then fall back to the local MySQL or MariaDB defaults
127.0.0.1:3306, database t3func, and credentials root / root:
export typo3DatabaseHost=127.0.0.1
export typo3DatabasePort=3306
export typo3DatabaseName=t3func
export typo3DatabaseUsername=root
export typo3DatabasePassword=root
export typo3DatabaseDriver=mysqli
composer test:php:functionalPlaywright smoke tests target any running TYPO3 instance and are not tied to a specific local stack:
export BLOG_BASE_URL=https://example.test
export BLOG_LIST_PATH=/blog1/
export BLOG_POST_PATH=/blog1/first-blog-post
npm run playwright:install
npm run test:e2e- Report bugs and request features on GitHub
- Join
#t3g-ext-blogon TYPO3 Slack - Pull requests welcome — fork, branch, and submit
GPL-2.0-or-later. See LICENSE for details.