oCMS 0.31.0 is available. This release addresses two problems that get in the way of ordinary publishing: formatting disappearing after a save, and site search matching HTML markup instead of the words on a page. It also gives editors a warning when unsupported markup is removed.
For developers running this CMS written in Go with SQLite, the upgrade needs a few targeted checks. Existing content is queued for a new search index, and formatting lost during an earlier save still needs to be reapplied. The 0.29 and 0.30 production notes remain useful when updating an older installation.
// Formatting survives a save
With HTML sanitization enabled, older saves removed inline styles. Text could have the right alignment, color and font in TinyMCE, then lose that formatting after saving.
Version 0.31.0 keeps the supported styles produced by the editor: alignment, text and background colors, font family and size, line height, indentation, underline and strikethrough, and image and table layout. It also preserves the table border attribute. Styles are checked by element and value; positioning, URL-based styles, negative margins and out-of-range sizes remain excluded. TinyMCE receives the same allowed-style list as the sanitizer.
Links retain target="_blank", with rel="noopener" added. When a save or version restore removes unsupported markup, the editor reopens with a warning naming up to five removed items. The Event Log records the removal.
Previously stripped formatting does not come back automatically. Reapply it from an intact source and inspect the saved preview. Keep production sanitization enabled; the updated editor's guide covers the workflow.
// Search follows readable page text
Public search previously matched words found only in tags, attributes, classes, inline styles or link URLs. Excerpts could contain raw HTML. Search now indexes readable page text and returns plain-text excerpts with matched words highlighted. The change also applies to the MCP search_pages tool, and Post results retain their type instead of being labelled Pages.
A startup migration creates the new page_search full-text index and queues existing pages. Indexing runs automatically in batches of 100 during searches and in the background. No manual index command or SQL is required.
On a large site, early searches can miss pages still waiting in the queue. Check a known published page and allow indexing to progress before diagnosing missing content. The old pages_fts index remains for earlier-binary compatibility; retain the complete pre-upgrade backup as part of the recovery plan.
// Two useful admin fixes
- Draft previews: draft titles in Admin → Pages and the editor's Preview button open the saved draft again. Administrators and editors can view it; anonymous visitors still receive 404.
- Status Page URL: configure an absolute HTTP or HTTPS address in
/admin/config. The built-in Default, Developer and Starter themes add a footer link, and the admin header adds a status icon. An empty value hides it. Custom themes can render.StatusPageURLwith explicit template support. See configuration.
// What to check before the restart
- Back up the database, uploads, custom files and configuration with the matching installed binary. Preserve the existing session and MFA keys.
- Verify the release archive's checksum and rehearse the update on a restored copy. Follow the v0.31 upgrade walkthrough.
- Save a disposable draft with representative text formatting, images, tables and links. Reopen it, read any removal warning, and check the preview.
- Test search against known published text, allow the indexing queue to progress, and check draft access both signed in and anonymously. Verify any configured status link.
The release also includes HTML-parser security fixes affecting Markdown conversion. The Privacy module vendors upstream Klaro browser assets without changing consent behavior, and GitHub releases now have descriptive titles and cleaner paragraph formatting.
Get the current archives and checksums from Download. For the complete change list, read the v0.31.0 release notes and the project announcement.