TL;DR
Ghost 1.24.0 introduces Dynamic Routing Beta, a major architectural improvement that centralizes routing management and provides more flexibility for content organization. This release also fixes issues with short URLs in private blogs, improves error handling, and enhances the Koenig editor with drag & drop image uploads and new text formatting options. The update represents a significant step forward in Ghost's content management capabilities, though users of the undocumented channels feature should be cautious about upgrading.
Highlight of the Release
- Dynamic Routing Beta - a centralized system for managing content routes and URLs
- Fixed short URLs when private blogging is enabled
- Koenig editor improvements including drag & drop image uploads
- New text formatting options with superscript and subscript support
- Improved error handling and messaging
Migration Guide
for Dynamic Routing Beta
Important Note for Channels Users:
If you are currently using the undocumented config.channels.json feature, it's recommended to delay upgrading until Dynamic Routing exits beta, as it doesn't yet support the full feature set.
For Developers:
- If you've built custom code that interacts with Ghost's routing system, you may need to update it
- Replace usages of
urlService.utils.urlFor with urlService.getByResourceId for resources (posts, authors, tags)
- Be aware that URLs are now generated at bootstrap rather than runtime
- Review the new routing hierarchy if you have custom routes that might conflict with built-in functionality
For All Users:
- No specific action is required for standard installations
- The update maintains backward compatibility with existing permalink structures
- If you encounter 503 errors after upgrading, this may be because the URL service is still generating resource URLs - these should resolve once the process completes
Upgrade Recommendations
Standard Installations:
This update is recommended for most Ghost users as it includes important bug fixes and enhancements to the editor experience.
For Users with Custom Routing:
If you're using the standard Ghost installation without the undocumented channels feature, this update is safe to install.
For Channels Feature Users:
If you are using the undocumented config.channels.json feature, it's recommended to delay upgrading until Dynamic Routing exits beta.
Upgrade Process:
Follow the standard Ghost upgrade process. After upgrading, if you encounter any 503 errors, these should resolve once the URL service finishes generating resource URLs.
Bug Fixes
- Fixed short URLs when private blogging is enabled (#9628)
- Fixed broken scrolling and scroll bars in Code Injection inputs
- Fixed incorrect return value for
publicAPI from the configuration endpoint
- Fixed error handling when Ghost fails to start due to native errors
- Corrected documentation in content/settings/README.md regarding routing types
- Fixed single lodash import to use proper path notation (
lodash/get instead of dot notation)
New Features
Dynamic Routing Beta
The centerpiece of this release is the new Dynamic Routing system, which represents a significant architectural improvement:
- Centralizes routing management in
server/services/routing
- Introduces distinct router types for collections, static routes, taxonomies, RSS feeds, and post previews
- Provides a cleaner, more maintainable approach to URL generation
- Enables unmounting and refreshing routes without server restart
- Improves routing hierarchy with clear precedence rules (e.g., static pages take precedence over apps)
- Maintains backward compatibility with existing permalink structures
- Includes comprehensive YAML validation for route configuration
Koenig Editor Enhancements
The Koenig editor beta continues to improve with:
- Drag & drop image card creation with automatic upload
- New text formatting options:
^superscript^ text expansion support
~subscript~ text expansion support
Security Updates
No specific security fixes were mentioned in this release.
Performance Improvements
- Rewritten sitemaps service that no longer generates URLs at runtime
- Pre-fetches resources and emits URLs during bootstrap
- Maintains caching logic to only regenerate XML when changes occur
- Improved URL service with more efficient resource URL handling
- Updated dependencies for better performance and security:
Impact Summary
Ghost 1.24.0 represents a significant architectural advancement with the introduction of Dynamic Routing Beta. This new system centralizes and streamlines how Ghost handles URLs and content organization, providing a more flexible foundation for future features.
The update to the routing system is largely invisible to end users but provides developers with more powerful tools for customizing content organization. Content creators will appreciate the improvements to the Koenig editor, particularly the addition of drag & drop image uploads and new text formatting options.
Several important bug fixes are included, most notably addressing issues with short URLs in private blogs and fixing scrolling problems in the Code Injection interface. The codebase continues to modernize with ES6 improvements and removal of legacy code.
For most users, this is a worthwhile upgrade that improves both the editing experience and the underlying architecture. However, users of the undocumented channels feature should approach with caution as the new Dynamic Routing system is still in beta and doesn't yet support all previous functionality.
Full Release Notes
- ✨Dynamic Routing Beta (#9596)
- 🐛Fixed short urls when private blogging is enabled (#9628)
- 🐛Fixed broken scrolling/scroll bars in Code Injection inputs
Updates to the Koenig editor beta (release announcement):
- ✨ Koenig - Drag & drop image card creation + upload
- ✨ Koenig -
^superscript^ and ~subscript~ text expansion support
You can see the full change log for the details of every change included in this release.
ATTENTION: config.channels.json ❗️❗️
If you are using the undocumented channels feature (config.channels.json), it's not recommended to update your blog till Dynamic Routing is out of Beta, because it does not support the full feature set yet.