A simple PHP based blogging platform.

Changelog

A note on Pure Blog's direction

Pure Blog does exactly what I want from a blogging platform, and I'm really happy with where it's landed. At this point, I consider it feature complete β€” which means I won't be accepting new feature requests.

If you've opened a feature request, thank you, but it's unlikely to be implemented.

What I will continue to accept:

Thanks for using Pure Blog. I hope it serves you as well as it serves me. πŸ™


Unreleased

Bug fixes

Added autocomplete="off" to all text inputs and textareas in the post and page editors to suppress browser input history suggestions.


v2.2.0 β€” 27 March 2026

Upgrading from v2.1.0? The in-app updater in v2.1.0 used an allowlist that didn't include all new files. Before running the update, manually replace admin/settings-updates.php with the v2.2.0 version β€” this ensures the updater can pull down everything correctly, including sitemap.php.

Translations

A large number of strings across admin were hardcoded in English and never passed through the translation system. The affected areas are: the 404 page heading and body; the Header Injects, Footer Injects, and Cache section titles in Site Settings (plus four inject field labels); all image upload and delete error messages; autosave JSON error responses; the post and page preview fallback title; all ~30 error and status messages in the updater (settings-updates.php); the admin footer credits and link labels; the language-file-missing warning in the admin header; and all 14 user-facing strings in the editor JavaScript (autosave status, restore banner, copy confirmation, upload prompts, and more). JavaScript strings are now serialised from PHP via window.PureblogEditorConfig.strings so they pass through the translation system at render time.

All eight language packs have been updated. A pre-existing key (admin.editor.error_empty_slug) was also missing from the German, Dutch, Portuguese, and Spanish packs and has been added. All new non-English translations were produced by AI β€” if you're a native speaker and spot anything that sounds unnatural, please open an issue or submit a PR.

Added

A sitemap.php is now included in the root of every Pure Blog install. It outputs a standard XML sitemap covering the homepage (priority 1.0), all published pages (0.8), and all published posts (0.9), each with a lastmod date. Requests to /sitemap.xml are automatically redirected to sitemap.php via .htaccess, so Google Search Console and other tools that expect a static URL work without any extra config. Thanks to @adegans for the suggestion.

OpenGraph meta tags are now more complete. Previously only og:image was output. Pages and posts now also emit og:type (article for posts, website for everything else), og:url, og:site_name, og:title, og:description, and og:locale (derived from the configured language). This improves link previews when sharing on Mastodon and other platforms. Thanks to @reederda for the suggestion.

The RSS feed now combines two layers of caching. Server-side: the generated XML is cached and reused across requests for the duration of the RSS TTL (Settings β†’ Site), avoiding redundant Markdown rendering. HTTP: Cache-Control, Last-Modified, Expires, and ETag headers are sent so RSS readers that respect them won't re-fetch the feed until it changes, saving bandwidth entirely. Clients that do re-request get a 304 Not Modified response if the feed hasn't changed. Thanks to @adegans for the suggestion.

Fixed

The admin nav menu was constrained to 60rem by a shared .mid rule, making the max-width on .admin-nav ineffective. The nav list now has its own max-width: 70rem so the menu can use more available width.

The updater could silently delete the root .htaccess file after an update. If reading the existing .htaccess failed quietly during the pre-update snapshot, it would be absent from the preserved-files list and then removed by the post-update cleanup pass. The cleanup now also skips any .htaccess inside the backup/ directory, which previously caused backup copies to be deleted and left rollbacks unable to restore the file.

The file picker button in the post and page editors now correctly filters for AVIF files in browsers that don't map image/avif to the image/* wildcard. Drag-and-drop was already working. Thanks to @msone for the report.


v2.1.0 β€” 26 March 2026

Added

The search page is now a manageable page in the dashboard. A default content/pages/search.md page ships with new installs and is added automatically on update. The search form and results render below any page content you add. The active search page can be changed (or disabled) from Settings β†’ Site, alongside the homepage and blog page selectors. The old search.php and search/ files are removed automatically on update.

Autosave no longer overwrites the live post. Changes are now written to a temporary file in content/autosaves/ and never touch the published content until you manually save. When you return to edit a post or page with pending autosaved changes, a banner appears offering to Restore or Discard them, with a View toggle to inspect the autosaved content before deciding. Thanks to @BumbleSusan for the report.

AVIF image uploads are now supported alongside JPG, PNG, GIF, and WebP. Thanks to @msone for the request.

Fixed

Post and page status labels ("Draft" / "Published") in the admin dashboard and pages list are now translated. Thanks to @justdaj for the report.

The Theme and CSS settings pages were almost entirely hardcoded in English. All labels, section headings, colour field names, reset buttons, and layout options are now fully translated across all eight language packs.

The German translation has been revised based on community feedback: "Website" is replaced with "Blog" throughout settings, the nav link is now "Blog ansehen", the last-published stat reads "JΓΌngster Beitrag", and font/colour/layout labels use more natural German terminology. Thanks to Michael for the feedback on both German translations, and broader gaps.

Changed

Admin notices now use a 2px coloured border with normal text and a light tinted background, rather than coloured text. Success notices are green-tinted, error notices are red-tinted, with appropriate dark mode variants.


v2.0.0 β€” 24 March 2026

Added

apply_filter() helper function and an on_filter_content hook. Defining on_filter_content(string $markdown): string in hooks.php or content/functions.php lets you transform post/page content after built-in shortcodes are processed but before Markdown conversion β€” enabling custom shortcodes, embeds, and other content transforms without touching core.

Search excerpt length is now configurable in site settings. Defaults to 2500 characters per post (up from 500), improving search accuracy without significantly increasing memory usage. Set to 0 to index full post content. Thanks to @werschreibt for the report.

The post and page editor now autosaves 10 seconds after the last change, but only once a post has been manually saved (i.e. a slug exists). A subtle "Autosaved HH:MM" indicator appears in the editor toolbar.

Internationalisation (i18n) support. UI strings are now loaded from per-language PHP array files in lang/ (e.g. lang/en.php, lang/de.php). The existing language config key selects the active language file. A t() helper function handles dot-notation key lookup and {placeholder} substitution throughout templates. Falls back gracefully to English if no matching lang file exists.

The tag field in the post editor now suggests existing tags as you type. Suggestions are sourced from content/tag-index.json and are filtered token-by-token after each comma, so multi-tag lists work without losing previous entries. Keyboard navigation (arrow keys, Enter, Tab, Escape) is supported.

Fixed

Contributors


1.9.7 β€” 21 March 2026

Fixed


1.9.6 β€” 19 March 2026

Fixed


1.9.5 β€” 18 March 2026

Improved


1.9.4 β€” 17 March 2026

Added

Fixed


1.9.3 β€” 16 March 2026

Added

Removed

Fixed

Thanks to @werschreibt for the issue submissions.


1.9.2 β€” 13 March 2026

Fixed


1.9.1 β€” 13 March 2026

Added


1.9.0 β€” 13 March 2026

Added

Changed


1.8.1 β€” 12 March 2026

Fixed


1.8.0 β€” 10 March 2026

Added


1.7.1 β€” 6 March 2026

Fixed


1.7.0 β€” 2 March 2026

Added

Fixed


1.6.5 β€” 28 February 2026

Fixed


1.6.4 β€” 26 February 2026

Added


1.6.3 β€” 25 February 2026

Fixed


1.6.2 β€” 16 February 2026

Added


1.6.1 β€” 16 February 2026

Fixed


1.6.0 β€” 14 February 2026

Added


1.5.8 β€” 14 February 2026

Fixed


1.5.7 β€” 13 February 2026

Fixed


1.5.6 β€” 13 February 2026

Fixed


1.5.5 β€” 13 February 2026

Fixed


1.5.4 β€” 13 February 2026

Added

Fixed


1.5.3 β€” 12 February 2026

Fixed


1.5.2 β€” 11 February 2026

Fixed


1.5.1 β€” 11 February 2026

Fixed


1.5.0 β€” 11 February 2026

Added


1.4.0 β€” 10 February 2026

Added

Changed


1.3.1 β€” 9 February 2026

Fixed


1.3.0 β€” 8 February 2026

Added

Fixed


1.2.0 β€” 8 February 2026

Added

Fixed


1.1.x and earlier β€” 6 February 2026

Initial development releases. Core flat-file blogging engine with Markdown posts and pages, admin panel, tag support, RSS feed, and search.