Wagtail SEO Toolkit
A comprehensive SEO auditing and optimization plugin for Wagtail CMS that helps you identify and fix SEO issues across your website.
📋 Table of Contents
- 🚀 Features
- 📸 Screenshots
- 🛠 Installation
- ⚙️ Configuration
- 🚀 Usage
- 🔧 Advanced Configuration
- 🛠 Development
- 📊 Performance Considerations
- 📝 Changelog
- 📄 License
- 🙏 Acknowledgments
🚀 Features
🔍 SEO Best Practices Checks
- Title & Meta Tags: Check for missing, duplicate, or suboptimal meta tags
- Content Analysis: Analyze content length, readability, and structure
- Header Structure: Validate H1-H6 hierarchy and usage
- Image Optimization: Check for missing alt text, proper sizing, and optimization
- Schema Markup: Validate structured data implementation
- Mobile Optimization: Ensure mobile-friendly design and viewport settings
- Internal Linking: Analyze internal link structure and distribution
- Content Freshness: Track content publication and modification dates
⚡ PageSpeed Insights Checks (Optional)
- Performance Metrics: Get Core Web Vitals and performance scores
- Accessibility Checks: Identify accessibility issues
- Best Practices: Check for security and modern web standards
- SEO Performance: Analyze technical SEO factors
- Per-Page-Type Optimization: Efficiently audit multiple pages of the same type
🎯 Smart Issue Management
- Issues Export: Export list of issues to Excel/CSV
- Developer vs Content Issues: Clear distinction between technical and content fixes
🔧 Flexible Configuration
- PageSpeed Settings: Control API usage and optimization
- Button Visibility: Control audit button visibility in admin
- Dev Fix Filtering: Show only content-editable issues
🤩 [PRO] Bulk meta editor
- Multi-Page Editing: Edit SEO titles and meta descriptions for hundreds of pages at once instead of manually editing each one
- Smart Templates: Use placeholders like
{title} | {site_name}or{introduction[:100]}to create consistent metadata patterns across your site - Issue-Based Filtering: Jump directly to pages with specific SEO issues from the dashboard for quick fixes
- Live Validation: Real-time character counting and validation ensures your metadata meets SEO best practices
- Automatic Template Integration: Enable middleware to automatically apply bulk editor changes to rendered meta tags without modifying your existing template tags across multiple pages
📸 Screenshots
SEO Dashboard
Comprehensive overview of your site's SEO health with actionable insights
Issues Report
Detailed view of all SEO issues with filtering and management options
Page Sidebar
Bulk editor
🛠 Installation
Prerequisites
- Wagtail 6.4+
Install via pip
pip install wagtail-seotoolkit
Add to your Django settings
# settings.py
INSTALLED_APPS = [
# ... other apps
'wagtail_seotoolkit',
]
Run migrations
python manage.py migrate
(Optional) Enable middleware
MIDDLEWARE = [
...
# SEO Toolkit Middleware - Must be after Wagtail's middleware
"wagtail_seotoolkit.middleware.SEOMetadataMiddleware",
]
How the bulk editor works with middleware:
The bulk editor works on the basic page fields seo_title and search_description. When the middleware is enabled, it will replace the rendered meta tags in your HTML output with the new versions applied from the bulk editor. This enables you to start using bulk editor features without modifying all of the template tags across multiple pages - the middleware automatically intercepts and updates the meta tags at render time.
Placeholder Processing Modes:
You can control how placeholders (like {title}, {site_name}, etc.) are processed using the WAGTAIL_SEOTOOLKIT_PROCESS_PLACEHOLDERS setting:
-
True(default, recommended): Placeholders are stored in the database and processed at runtime by the middleware. This means your SEO metadata stays dynamic - if a page title changes, the SEO title automatically updates. Requires middleware to be enabled. -
False: Placeholders are processed immediately when saving and the final values are stored in the database. This creates static metadata that won't update if page content changes. Use this if you don't want to use the middleware or need static values.
⚙️ Configuration
All Settings
# settings.py
# SEO Toolkit Configuration
WAGTAIL_SEOTOOLKIT_SHOW_AUDIT_BUTTON = True # Show audit button in admin (default: False)
WAGTAIL_SEOTOOLKIT_INCLUDE_DEV_FIXES = True # Include developer-required fixes (default: True)
# Bulk Editor / Middleware Configuration
WAGTAIL_SEOTOOLKIT_PROCESS_PLACEHOLDERS = True # Process placeholders at runtime via middleware (default: True)
# If False, placeholders are processed once when saving
# PageSpeed Insights Configuration (Optional - must be manually enabled)
# Note: PageSpeed checks are disabled by default and must be manually enabled
WAGTAIL_SEOTOOLKIT_PAGESPEED_API_KEY = "your-api-key-here" # Get from Google
WAGTAIL_SEOTOOLKIT_PAGESPEED_ENABLED = True # Enable PageSpeed checks
WAGTAIL_SEOTOOLKIT_PAGESPEED_DRY_RUN = False # Use real API calls
WAGTAIL_SEOTOOLKIT_PAGESPEED_PER_PAGE_TYPE = True # Optimize API usage
Getting a PageSpeed API Key
- Visit Google PageSpeed Insights API
- Create a new project or select existing one
- Enable the PageSpeed Insights API
- Create credentials (API key)
- Add the key to your settings
🚀 Usage
Running Audits
This plugin exposes 2 management commands seoaudit and run_scheduled_audits those commands needs to be executed by some process. Smiliarly to publish_scheduled.
Option 1: User-Requested Audits (Recommended)
To allow users to request audits through the admin interface:
-
Enable the audit button:
# settings.py WAGTAIL_SEOTOOLKIT_SHOW_AUDIT_BUTTON = True
-
Set up periodic task to process scheduled audits:
python manage.py run_scheduled_audits
WARNING: First audit needs to be started manually with seoaudit command.
Option 2: Automated Audits
Set up a scheduled task to run audits automatically:
python manage.py seoaudit
🔧 Advanced Configuration
Filtering Dev Fixes
For content editors who shouldn't see technical issues:
# settings.py
WAGTAIL_SEOTOOLKIT_INCLUDE_DEV_FIXES = False
This will hide all issues that require developer intervention, showing only content-related issues.
PageSpeed Optimization
The WAGTAIL_SEOTOOLKIT_PAGESPEED_PER_PAGE_TYPE setting optimizes PageSpeed API usage for sites with many pages of the same type:
# settings.py
WAGTAIL_SEOTOOLKIT_PAGESPEED_PER_PAGE_TYPE = True # Enable optimization (default: False)
How it works:
- When
True: Tests PageSpeed on only one page per page type (e.g., one BlogPage, one ProductPage) - When
False: Tests PageSpeed on every individual page - Result propagation: PageSpeed issues found on the test page are applied to all pages of that same type
Example:
- Site has 50 BlogPage instances and 30 ProductPage instances
- With optimization: 2 PageSpeed API calls (1 for BlogPage + 1 for ProductPage)
- Without optimization: 80 PageSpeed API calls (1 for each page)
Benefits:
- Cost savings: Dramatically reduces Google PageSpeed API usage
- Faster audits: Significantly faster completion times
- Same accuracy: PageSpeed issues are typically consistent across pages of the same type
When to use:
- Sites with many pages of the same type
- When PageSpeed API costs are a concern
- For faster audit execution
🛠 Development
Setting up Development Environment
You can start developing with this plugin using the bakerydemo project that includes this plugin enabled:
# Clone the repository
git clone https://github.com/your-org/wagtail-seotoolkit.git
cd wagtail-seotoolkit
# Start the development environment with Docker
docker-compose up
# The plugin will be available at http://localhost:8000/admin/
# Login with: admin / changeme
📊 Performance Considerations
PageSpeed API Limits
- Google PageSpeed Insights API has rate limits
- Use
WAGTAIL_SEOTOOLKIT_PAGESPEED_PER_PAGE_TYPE = Truefor large sites - Consider running audits during off-peak hours
🗺️ Roadmap
We are in the Phase 2 - free tier showing you what's broken and first pro feature Bulk editor.
Coming Very Soon (Phase 2 Further development - Pro Tier)
- JSON-LD Editor - Visual editor for structured data
- Daily Monitoring - Automated audits with email alerts when issues are detected
- Historical Tracking - See how your SEO health improves over time
Coming Also Quite Soon (Phase 3 - AI)
- AI-Powered Optimization - GPT-generated meta descriptions optimized for search
- Smart Internal Linking - Automatic suggestions for related content
- Content Scoring - AI analysis for search visibility and user engagement
- Competitive Analysis - See how your pages compare to competitors
Interested in Pro features? Let us know what would be most valuable → GitHub Discussions
🤝 Contributing
This is an early release and we want your feedback!
Found a bug? Open an issue
Have a suggestion? Start a discussion
What We're Looking For Feedback On:
- Are the checks finding real, actionable issues?
- What SEO checks are we missing?
- Does the bulk fixing is worth paying for?
- How's the performance on large sites (1000+ pages)?
💬 Support
- Issues: GitHub Issues
- Discussions: GitHub Discussions
- Email: hello@wayfdigital.com
📝 Changelog
Version 0.1.1
- Initial release
- Comprehensive SEO auditing
- PageSpeed Insights integration
- Wagtail admin integration
- Configurable settings
Version 0.1.2
- Fix CSRF bug
Version 0.1.3
- Further improvements to CSRF fixes
Version 0.2.0
- First pro feature - Bulk editor!
- Subscription management from the plugin
- License update
Version 0.2.1
- README update
Version 0.2.2
- Bulk editor fixes
Version 0.2.3
- Fix checks bypassing the middleware processing resulting in false positives
📄 License
This project uses dual licensing:
Core Features (MIT License)
The following features are licensed under the MIT License and are free and open source:
- ✅ SEO audit engine and all checkers (title, meta, content, headers, images, schema, mobile, links, freshness, PageSpeed)
- ✅ Management commands (
seoaudit,run_scheduled_audits) - ✅ SEO audit models and data structures
- ✅ Dashboard and issues reporting (read-only views)
- ✅ Side panels showing SEO checks on page editor
License: See LICENSE-MIT for full MIT license text.
Pro Features (WAYF Proprietary License)
The following features require a paid subscription and are licensed under the WAYF Proprietary License:
- 🔒 Bulk Metadata Editor - Edit SEO titles and meta descriptions for hundreds of pages at once
- 🔒 SEO Templates - Create reusable metadata templates with placeholders
- 🔒 Metadata Middleware - Automatically apply bulk editor changes to rendered pages
- 🔒 Subscription Management - License verification and instance management
- 🔒 Advanced Placeholder System - Dynamic field placeholders for metadata templates
License: See LICENSE-PROPRIETARY for full proprietary license terms.
Source Available: The source code for pro features is available for reference, security review, and transparency, but modification and redistribution are prohibited without permission from WAYF.
Usage Rights
- ✅ Core features: Free to use, modify, and redistribute under MIT license
- ✅ Pro features: Free to use with a valid subscription, but modification and redistribution are restricted
- ✅ Commercial use: Both core and pro features can be used in commercial projects
- ✅ Contributions: Welcome for core features; pro feature contributions require WAYF approval (see CONTRIBUTING.md)
Getting a Pro License
Pro features require an active subscription. You can obtain the pro license directly from the plugin UI after installation.
Author: WAYF
Copyright: ©2025 WAYF DIGITAL SP. Z O.O.
🙏 Acknowledgments
- Built for the Wagtail CMS community
- Inspired by modern SEO best practices
- Special thanks to early testers and contributors
- Special thanks to all the contributors to the bakerydemo
- Bakery demo is used only for the development environment for this project, it's not redistributed with the package
⭐ If this tool saves you time, please star the repo and share it with other Wagtail users!
Made with ❤️ by WAYF
About WAYF: We build tools for modern web development. Check out our other projects at wayfdigital.com
Metadata
Release files for wagtail-seotoolkit 0.2.3
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| wagtail_seotoolkit-0.2.3.tar.gz | 112.1 kB | With provenance | Details for wagtail_seotoolkit-0.2.3.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| wagtail_seotoolkit-0.2.3-py3-none-any.whl | Python 3 | none | any | Details for wagtail_seotoolkit-0.2.3-py3-none-any.whl |
Total release size: 266.0 kB
Release files / wagtail_seotoolkit-0.2.3.tar.gz
| Download URL | wagtail_seotoolkit-0.2.3.tar.gz |
|---|---|
| Size | 112.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
e45feb9d3fb8a44ff6dc7bcc45bb2accb2c89789efef554570e78d5efb7c72df
|
|
BLAKE2b-256 checksum How to use checksums |
32b3dd87b1ddcc886ee457d7cfffd7f3e41867a10be5f66b6feb5780c29cdf57
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 7, 2025.
Transparency logRelease files / wagtail_seotoolkit-0.2.3-py3-none-any.whl
| Download URL | wagtail_seotoolkit-0.2.3-py3-none-any.whl |
|---|---|
| Size | 153.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
7f2f361315cd1d54783b047c63bb1e1cf405e749b78b862d527a19a01ea3ae83
|
|
BLAKE2b-256 checksum How to use checksums |
cca33f41473e548f5e8dcbcc04375ec0c86bd8c8f62283ef029d7ed73fdc29ac
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 7, 2025.
Transparency logSecurity for wagtail-seotoolkit 0.2.3
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
Both files in this release have been uploaded with provenance metadata.
Attestation for wagtail_seotoolkit-0.2.3.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 7, 2025.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.