Marmite 0.4.1 Release Notes
Wednesday, 29 July 2026 - ⧖ 5.0 min🗒️
- New Features
- Content Editor
- Development Toolbar
- Content Management API
- Smart directory auto-detection for
--newcommand - Offline support for editor and site features
- Bug Fixes
- AT Protocol: auto-sync state from PDS when local state is empty
- favicon.ico automatically served at site root
- Duplicate slug detection in
--newcommand - 404 pages return proper HTTP 404 status
- Link checker wikilink awareness
- Other Changes
New Features
Content Editor
Marmite now includes a full-featured content editor accessible from the toolbar. Click the Editor button in the toolbar header to open a three-panel editing environment with a CodeMirror 6 markdown editor, live preview, and metadata sidebar.
Key features:
- CodeMirror 6 editor with markdown syntax highlighting, 12 editor themes, and adjustable font size
- Autocomplete for wikilinks, shortcodes, media paths, and frontmatter keys/values
- Auto-save after 1.5 seconds of inactivity, with automatic preview refresh via WebSocket
- Insert menu for headings, bold, italic, links, images, code blocks, tables, and a visual media file picker
- Metadata sidebar with frontmatter editing, content actions (translate, clone, delete), project file tree, and markdown/shortcode help reference
- Config dialog with 9 tabs covering all marmite.yaml options, including raw YAML editing
- Raw file editing for fragments (
_hero.md), CSS, JS, YAML, and other non-content files without frontmatter handling - File tree navigation at
/__marmite__/editor/for browsing and opening project files - Save As for creating new content from the editor
enable_toolbarconfig option and--enable-toolbarCLI flag to disable toolbar injection
New API endpoints: GET/PUT /__marmite__/content/{slug}/body, GET/PUT /__marmite__/file/{path}, GET/PUT /__marmite__/config, GET /__marmite__/files.
See marmite-editor for full documentation.
Development Toolbar
Marmite now includes a floating development toolbar that appears when running with --serve. Click the gear icon at the top-left corner to open a sidebar panel with tabs for managing your site directly from the browser.
The toolbar provides:
- Info - view content metadata (title, slug, date, tags, stream, series, source path)
- Edit - edit frontmatter fields with autocomplete for tags, streams, series, authors, and languages. Includes native date picker, slug editing with auto-redirect, and image path fields
- Actions - add translations, clone content (full file copy), move/rename files, delete content
- Site - stats dashboard with clickable cards (posts, pages, tags, streams, authors, series, render time), and a content creation form with advanced options
- Layout - visual menu editor (add, remove, reorder items), section title editor, and display name management for streams, series, languages, and author profiles
- Config - edit general site configuration (name, tagline, URL, pagination, search, images, paths, extra)
- 404 "Create it!" button - when visiting a nonexistent page, a button appears to create it with one click
The toolbar state (open/closed, active tab) is saved in localStorage and persists across page reloads.
See marmite-toolbar for full documentation.
Content Management API
The built-in server now exposes a REST API under /__marmite__/ for programmatic content and configuration management:
POST /__marmite__/content- create new posts and pagesPATCH /__marmite__/content/{slug}- update frontmatter fieldsPOST /__marmite__/content/{slug}/clone- full-file clone with new title/slugPOST /__marmite__/content/{slug}/move- move or rename content filesDELETE /__marmite__/content/{slug}- delete contentPOST /__marmite__/config- create default configPATCH /__marmite__/config- update config fieldsGET /__marmite__/data- aggregated site data (tags, streams, series, authors, slugs, config, build stats)
See content-management-api for full documentation.
Smart directory auto-detection for --new command
The --new CLI command now automatically detects posts/ and pages/ subdirectories in structured projects and places content in the right location without requiring the -d flag.
$ marmite myblog --new "My Post"
# -> created in content/posts/ (if posts/ exists)
$ marmite myblog --new "About" -p
# -> created in content/pages/ (if pages/ exists)
The -d flag still works to override auto-detection. Flat projects without posts//pages/ subdirectories are unaffected.
Offline support for editor and site features
All JavaScript dependencies are now bundled locally and embedded in the binary, so both the content editor and generated site features work fully offline without any external network requests.
- CodeMirror 6 editor files (13 modules, 776 KB) are bundled from
esm.shCDN imports into embedded vendor files served at/__marmite__/vendor/* - Fuse.js 7.0.0 for search (previously loaded from cdnjs.cloudflare.com)
- Mermaid 11.3.0 for diagrams (previously loaded from cdnjs.cloudflare.com)
- MathJax 3 for math rendering (previously loaded from cdn.mathjax.org) - also upgraded from deprecated v2 to v3 with the SVG output renderer
Vendor files are stored in static/vendor/ and embedded in the binary via rust_embed, following the same pattern used for all other embedded assets.
Bug Fixes
AT Protocol: auto-sync state from PDS when local state is empty
When publishing to AT Protocol (Bluesky/PDS) with an empty or missing local state file, marmite now automatically syncs the existing state from the PDS before publishing. Previously, an empty state would cause all posts to be treated as new, resulting in duplicate records on the PDS.
On first publish with empty state, marmite fetches all existing site.standard.document records from the PDS (with full pagination support for large collections), rebuilds the local state from them, and then publishes only the content that has actually changed.
The --dry-run flag is now respected during the PDS sync phase as well.
Additionally, the path field in published records now correctly includes the .html extension, matching the actual file paths on the server.
favicon.ico automatically served at site root
Browsers request /favicon.ico from the root of a site automatically, in addition to following the <link rel="icon"> tag in <head>. Previously, marmite only placed the favicon at static/favicon.ico (correctly linked by the templates), meaning browsers that rely on the automatic root lookup would receive a 404 unless the user added a manual file_mapping entry.
Marmite now automatically copies favicon.ico to the site root during every build. No configuration is required. If a file_mapping already places a custom favicon.ico at the root, marmite will not overwrite it.
Duplicate slug detection in --new command
The --new command now detects duplicate slugs and uses clean filenames. Previously, creating content with a title that matched an existing slug could overwrite or conflict with existing content. Now it reports an error.
404 pages return proper HTTP 404 status
The built-in server was returning HTTP 200 for custom 404 pages. It now correctly returns HTTP 404 status, which is important for link checkers and SEO tools.
Link checker wikilink awareness
The link checker now properly handles wikilink title resolution, avoiding false positives when checking internal links that use wikilink syntax.
Other Changes
- Fixed Arch Linux installation instructions
- Added
installshortcode - CI: allow CLI overrides, fixed CI for fork PRs
- Updated hosting docs to match the latest GitHub Actions environment requirements
- Added tutorial for customizing the landing page (
_hero.md,_sidebar.mdfragments) - Dependency updates: tera 2.1, comrak 0.54, tungstenite 0.30, clap 4.6.4
Please consider giving a ☆ on Marmite Github repository, that helps a lot!