{
  "version": "https://jsonfeed.org/version/1",
  "title": "Marmite 0.4.1",
  "home_page_url": "https://marmite.blog",
  "feed_url": "https://marmite.blog/tag-toolbar.json",
  "description": "Static Site Generator <br> <small>for blogs</small> <br> <small>made with ❤️ and 🦀</small>",
  "items": [
    {
      "id": "https://marmite.blog/marmite-editor.html",
      "url": "https://marmite.blog/marmite-editor.html",
      "title": "Marmite Editor",
      "content_html": "<p>The marmite editor is a three-panel content editor that runs inside the built-in dev server. It provides a CodeMirror 6 markdown editor with autocomplete, a live preview iframe, and a sidebar for metadata and file management.</p>\n<div class=\"markdown-alert markdown-alert-note\">\n<p class=\"markdown-alert-title\">Note</p>\n<p>The editor is only available when serving with <code>--serve</code>. It does not appear on your deployed site.</p>\n</div>\n<h2 id=\"opening-the-editor\">Opening the editor<a href=\"#opening-the-editor\" aria-label=\"Link to heading 'Opening the editor'\" data-heading-content=\"Opening the editor\" class=\"anchor\"></a></h2>\n<p>Start your site with the built-in server:</p>\n<pre class=\"marmite-code\"><code class=\"marmite-code-inner language-console\">$ marmite myblog --serve --watch\n</code></pre>\n<p>Open the toolbar (gear icon at top-left) and click the <strong>Editor</strong> button in the header. On content pages, this opens the editor for that specific post or page. On non-content pages (index, tag listings), it opens the editor with a file tree for navigation.</p>\n<p>You can also navigate directly to <code>http://localhost:8000/__marmite__/editor/my-post</code> to edit a specific slug, or <code>http://localhost:8000/__marmite__/editor/</code> for the file browser.</p>\n<h2 id=\"editor-layout\">Editor layout<a href=\"#editor-layout\" aria-label=\"Link to heading 'Editor layout'\" data-heading-content=\"Editor layout\" class=\"anchor\"></a></h2>\n<p>The editor has three panels:</p>\n<ul>\n<li><strong>Sidebar</strong> (left, collapsible) - metadata, file tree, and help reference</li>\n<li><strong>Editor</strong> (center) - CodeMirror 6 markdown editor with a toolbar above it</li>\n<li><strong>Preview</strong> (right, toggle-able) - live preview of the rendered page</li>\n</ul>\n<h3 id=\"top-bar\">Top bar<a href=\"#top-bar\" aria-label=\"Link to heading 'Top bar'\" data-heading-content=\"Top bar\" class=\"anchor\"></a></h3>\n<p>The top bar contains:</p>\n<ul>\n<li><strong>Sidebar</strong> / <strong>Back</strong> - toggle sidebar visibility or return to the rendered page</li>\n<li><strong>New</strong> - create a new post or page</li>\n<li><strong>Version</strong> - current marmite version</li>\n<li><strong>Content type</strong> - shows POST or PAGE badge</li>\n<li><strong>Content title</strong> - the title of the content being edited</li>\n<li><strong>Config</strong> - open the site configuration dialog</li>\n<li><strong>Theme</strong> - toggle light/dark editor theme</li>\n<li><strong>Preview</strong> - show/hide the preview panel</li>\n</ul>\n<h3 id=\"editor-toolbar\">Editor toolbar<a href=\"#editor-toolbar\" aria-label=\"Link to heading 'Editor toolbar'\" data-heading-content=\"Editor toolbar\" class=\"anchor\"></a></h3>\n<p>Above the editor area:</p>\n<ul>\n<li><strong>Insert</strong> menu - headings, bold, italic, links, images, code blocks, tables, lists, blockquotes, horizontal rules, and a media file picker</li>\n<li><strong>Save</strong> - save to disk (also triggered by Ctrl+S)</li>\n<li><strong>Save As</strong> - save as a new content file with a different title</li>\n</ul>\n<h3 id=\"sidebar-tabs\">Sidebar tabs<a href=\"#sidebar-tabs\" aria-label=\"Link to heading 'Sidebar tabs'\" data-heading-content=\"Sidebar tabs\" class=\"anchor\"></a></h3>\n<ul>\n<li><strong>Info</strong> - content metadata (title, slug, date, tags, etc.) and a project file tree. Content files link to the editor. Non-content editable files (CSS, JS, YAML, fragments) open in a floating modal editor.</li>\n<li><strong>Edit</strong> - frontmatter fields with autocomplete for tags, streams, series, authors, languages, images</li>\n<li><strong>Actions</strong> - add translations, clone content, delete content</li>\n<li><strong>Help</strong> - markdown syntax reference and available shortcodes list</li>\n</ul>\n<h3 id=\"status-bar\">Status bar<a href=\"#status-bar\" aria-label=\"Link to heading 'Status bar'\" data-heading-content=\"Status bar\" class=\"anchor\"></a></h3>\n<p>Below the editor area, shows cursor position (line/column), font size slider, and editor theme selector with 12 themes.</p>\n<h2 id=\"auto-save\">Auto-save<a href=\"#auto-save\" aria-label=\"Link to heading 'Auto-save'\" data-heading-content=\"Auto-save\" class=\"anchor\"></a></h2>\n<p>The editor auto-saves after 1.5 seconds of inactivity. This writes the file to disk, triggers a rebuild (when running with <code>--watch</code>), and refreshes the preview panel. A localStorage backup is also kept for crash recovery - if the browser closes unexpectedly, the editor offers to restore the draft on next load.</p>\n<h2 id=\"preview\">Preview<a href=\"#preview\" aria-label=\"Link to heading 'Preview'\" data-heading-content=\"Preview\" class=\"anchor\"></a></h2>\n<p>The preview panel shows the rendered page in an iframe. It refreshes automatically after each save/rebuild via a dedicated WebSocket connection. The editor page itself never reloads during saves.</p>\n<p>The preview panel can be hidden with the <strong>Preview</strong> button in the top bar. When browsing around in the preview and then clicking back into the editor, the preview automatically navigates back to the page being edited.</p>\n<p>Use <strong>Pop Out</strong> to open the preview in a separate browser tab, or <strong>Refresh</strong> to manually reload it.</p>\n<h2 id=\"raw-file-editing\">Raw file editing<a href=\"#raw-file-editing\" aria-label=\"Link to heading 'Raw file editing'\" data-heading-content=\"Raw file editing\" class=\"anchor\"></a></h2>\n<p>The editor supports editing non-content files without adding frontmatter:</p>\n<ul>\n<li><strong>Fragment files</strong> (<code>_hero.md</code>, <code>_comments.md</code>, etc.) - open from the file tree or navigate to <code>/__marmite__/editor/content/_hero.md</code></li>\n<li><strong>Config, CSS, JS, YAML, and other text files</strong> - click them in the file tree to open a floating modal editor with a save button, or navigate directly via URL for full-screen editing</li>\n</ul>\n<p>In raw mode, the editor skips frontmatter handling, hides the preview panel and Edit/Actions sidebar tabs.</p>\n<h2 id=\"configuration-dialog\">Configuration dialog<a href=\"#configuration-dialog\" aria-label=\"Link to heading 'Configuration dialog'\" data-heading-content=\"Configuration dialog\" class=\"anchor\"></a></h2>\n<p>Click <strong>Config</strong> in the top bar to open the site configuration dialog with 9 tabs:</p>\n<ul>\n<li><strong>Site</strong> - name, tagline, URL, language, footer, logo</li>\n<li><strong>Content</strong> - pagination, default author, date format, TOC, next/prev links, related content</li>\n<li><strong>Search</strong> - enable search, match snippets, snippets per result, search title</li>\n<li><strong>Feeds</strong> - JSON feed, sitemap, URLs JSON, publish markdown, shortcodes</li>\n<li><strong>Appearance</strong> - colorscheme (13 options), colorscheme picker, color mode, light/dark toggle, code highlighting</li>\n<li><strong>Images</strong> - card image, banner image, skip resize, max width, banner width, resize filter</li>\n<li><strong>Menu</strong> - add, remove, and reorder navigation menu items</li>\n<li><strong>Paths</strong> - content, site, and media directory paths</li>\n<li><strong>Raw YAML</strong> - edit the full marmite.yaml directly</li>\n</ul>\n<h2 id=\"disabling-the-toolbar\">Disabling the toolbar<a href=\"#disabling-the-toolbar\" aria-label=\"Link to heading 'Disabling the toolbar'\" data-heading-content=\"Disabling the toolbar\" class=\"anchor\"></a></h2>\n<p>To serve without the toolbar and editor:</p>\n<pre class=\"marmite-code\"><code class=\"marmite-code-inner language-yaml\"><a-c># marmite.yaml</a-c>\n<a-pr>enable_toolbar</a-pr><a-p>:</a-p> <a-co>false</a-co></code></pre>\n<p>Or via CLI:</p>\n<pre class=\"marmite-code\"><code class=\"marmite-code-inner language-console\">$ marmite myblog --serve --enable-toolbar false\n</code></pre>\n<p>The API endpoints and editor page still work when the toolbar is disabled - only the automatic injection into served HTML pages is suppressed.</p>\n<h2 id=\"api-endpoints\">API endpoints<a href=\"#api-endpoints\" aria-label=\"Link to heading 'API endpoints'\" data-heading-content=\"API endpoints\" class=\"anchor\"></a></h2>\n<p>The editor uses these API endpoints (all under <code>/__marmite__/</code>):</p>\n<table>\n<thead>\n<tr>\n<th>Endpoint</th>\n<th>Method</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>content/{slug}/body</code></td>\n<td>GET</td>\n<td>Read frontmatter and raw markdown body</td>\n</tr>\n<tr>\n<td><code>content/{slug}/body</code></td>\n<td>PUT</td>\n<td>Write markdown body with optional frontmatter updates</td>\n</tr>\n<tr>\n<td><code>file/{path}</code></td>\n<td>GET</td>\n<td>Read any text file in the project</td>\n</tr>\n<tr>\n<td><code>file/{path}</code></td>\n<td>PUT</td>\n<td>Write any text file in the project</td>\n</tr>\n<tr>\n<td><code>files</code></td>\n<td>GET</td>\n<td>List all project files with editable/fragment flags</td>\n</tr>\n<tr>\n<td><code>config</code></td>\n<td>GET</td>\n<td>Read raw marmite.yaml content</td>\n</tr>\n<tr>\n<td><code>config</code></td>\n<td>PUT</td>\n<td>Write raw marmite.yaml (with YAML validation)</td>\n</tr>\n<tr>\n<td><code>editor/{slug}</code></td>\n<td>GET</td>\n<td>Serve the editor page for a content slug</td>\n</tr>\n<tr>\n<td><code>editor/{path}</code></td>\n<td>GET</td>\n<td>Serve the editor in raw mode for a file path</td>\n</tr>\n<tr>\n<td><code>editor/</code></td>\n<td>GET</td>\n<td>Serve the empty editor with file tree navigation</td>\n</tr>\n</tbody>\n</table>\n<blockquote>\n<p>Please consider giving a ☆ on Marmite <a href=\"https://github.com/rochacbruno/marmite\">Github</a> repository, that helps a lot!</p>\n</blockquote>\n<!-- Contents from _markdown_footer.md are appended to every content -->\n<!-- _references.md is a file to gather all references together \nthis file is appended to every raw markdown.\n-->\n",
      "summary": "\"The marmite editor is a full-featured markdown editor with live preview, metadata management, and file editing built into the dev server.\"",
      "date_published": "2026-07-10T10:00:00-00:00",
      "image": "media/marmite-editor.banner.jpg",
      "authors": [
        {
          "name": "Bruno Rocha",
          "url": "https://go.rocha.social/@bruno",
          "avatar": "https://github.com/rochacbruno.png"
        }
      ],
      "tags": [
        "docs",
        "features",
        "editor",
        "toolbar",
        "server"
      ],
      "language": "en"
    },
    {
      "id": "https://marmite.blog/marmite-toolbar.html",
      "url": "https://marmite.blog/marmite-toolbar.html",
      "title": "Marmite Toolbar",
      "content_html": "<p>The marmite toolbar is a floating development panel that appears when you serve your site with <code>--serve</code>. It provides a visual interface for managing content, editing frontmatter, configuring your site, and viewing site stats - all without leaving the browser.</p>\n<div class=\"markdown-alert markdown-alert-note\">\n<p class=\"markdown-alert-title\">Note</p>\n<p>The toolbar is only injected by the built-in dev server. It does not appear on your deployed site.</p>\n</div>\n<h2 id=\"getting-started\">Getting started<a href=\"#getting-started\" aria-label=\"Link to heading 'Getting started'\" data-heading-content=\"Getting started\" class=\"anchor\"></a></h2>\n<p>Start your site with the built-in server:</p>\n<pre class=\"marmite-code\"><code class=\"marmite-code-inner language-console\">$ marmite myblog --serve --watch\n</code></pre>\n<p>A small gear icon appears at the top-left corner of every page. Click it to open the toolbar sidebar. Press <code>Escape</code> or click the overlay to close it. The toolbar remembers its open/closed state and active tab across page reloads.</p>\n<p>The toolbar header shows the marmite version and an <strong>Editor</strong> button. On content pages, the Editor button opens the <a href=\"marmite-editor.html\" data-wikilink=\"true\">marmite-editor</a> for that specific content. On non-content pages, it opens the editor with a file tree for navigation.</p>\n<p>To disable the toolbar, set <code>enable_toolbar: false</code> in <code>marmite.yaml</code> or use <code>--enable-toolbar false</code> on the CLI. The API endpoints and editor page remain accessible even when the toolbar is disabled.</p>\n<h2 id=\"tabs\">Tabs<a href=\"#tabs\" aria-label=\"Link to heading 'Tabs'\" data-heading-content=\"Tabs\" class=\"anchor\"></a></h2>\n<p>The toolbar organizes its features into tabs. On content pages (posts and pages), all tabs are available. On non-content pages (index, tag listings, archive), only the Site, Layout, and Config tabs are shown.</p>\n<h3 id=\"info\">Info<a href=\"#info\" aria-label=\"Link to heading 'Info'\" data-heading-content=\"Info\" class=\"anchor\"></a></h3>\n<p>Displays metadata for the current content page:</p>\n<ul>\n<li>Title, slug, date, description</li>\n<li>Tags, authors, stream, series</li>\n<li>Language, translations, translates</li>\n<li>Pinned status</li>\n<li>Source file path and last modification time</li>\n</ul>\n<p>The data comes from the <code>{slug}.metadata.json</code> file generated during <code>--serve</code> mode.</p>\n<h3 id=\"edit\">Edit<a href=\"#edit\" aria-label=\"Link to heading 'Edit'\" data-heading-content=\"Edit\" class=\"anchor\"></a></h3>\n<p>A form for editing the current page's frontmatter. Fields include:</p>\n<ul>\n<li><strong>Title</strong> and <strong>Slug</strong> - changing the slug redirects you to the new URL after rebuild</li>\n<li><strong>Description</strong> and <strong>Date</strong> - date uses the browser's native date/time picker</li>\n<li><strong>Tags</strong>, <strong>Stream</strong>, <strong>Series</strong>, <strong>Authors</strong> - all with autocomplete from existing values</li>\n<li><strong>Language</strong> - autocomplete from all ISO 639-1 codes</li>\n<li><strong>Translates</strong> - autocomplete from all existing content slugs</li>\n<li><strong>Banner Image</strong> and <strong>Card Image</strong></li>\n<li><strong>Pinned</strong> and <strong>Comments</strong> toggles</li>\n<li><strong>Extra</strong> - JSON editor for the <code>extra</code> frontmatter field</li>\n</ul>\n<p>Click <strong>Save Frontmatter</strong> to write changes. The site rebuilds automatically and the page reloads (or redirects if the slug changed).</p>\n<p>The <strong>Edit Content</strong> button is reserved for a future in-browser markdown editor.</p>\n<h3 id=\"actions\">Actions<a href=\"#actions\" aria-label=\"Link to heading 'Actions'\" data-heading-content=\"Actions\" class=\"anchor\"></a></h3>\n<p>Content-specific actions for the current page:</p>\n<h4 id=\"add-translation\">Add Translation<a href=\"#add-translation\" aria-label=\"Link to heading 'Add Translation'\" data-heading-content=\"Add Translation\" class=\"anchor\"></a></h4>\n<p>Select a language code and enter a translated title. Marmite creates the translation file in the correct location:</p>\n<ul>\n<li>If the original is in a flat directory (e.g. <code>posts/hello.md</code>), the translation goes to <code>posts/ola.md</code> with explicit <code>translates: hello</code> and <code>language: pt</code> in frontmatter</li>\n<li>If the original is in a slug-named subfolder (e.g. <code>posts/hello/hello.md</code>), the translation goes to <code>posts/hello/pt-ola.md</code> with a language prefix in the filename (auto-discovered by marmite)</li>\n</ul>\n<h4 id=\"clone--copy\">Clone / Copy<a href=\"#clone--copy\" aria-label=\"Link to heading 'Clone / Copy'\" data-heading-content=\"Clone / Copy\" class=\"anchor\"></a></h4>\n<p>Creates a full copy of the current content including the markdown body and all frontmatter. Only the title and slug are changed. The <code>aliases</code> and <code>translates</code> fields are stripped from the clone. Enter a new title and click <strong>Clone Content</strong>.</p>\n<h4 id=\"move--rename\">Move / Rename<a href=\"#move--rename\" aria-label=\"Link to heading 'Move / Rename'\" data-heading-content=\"Move / Rename\" class=\"anchor\"></a></h4>\n<p>Rename the file or move it to a different directory. Enter the new filename (e.g. <code>new-name.md</code> or <code>tutorials/new-name.md</code>). If the content has an explicit <code>slug:</code> in frontmatter, the URL does not change.</p>\n<h4 id=\"delete\">Delete<a href=\"#delete\" aria-label=\"Link to heading 'Delete'\" data-heading-content=\"Delete\" class=\"anchor\"></a></h4>\n<p>Deletes the content file after a confirmation prompt. Redirects to the home page.</p>\n<h3 id=\"site\">Site<a href=\"#site\" aria-label=\"Link to heading 'Site'\" data-heading-content=\"Site\" class=\"anchor\"></a></h3>\n<p>Site overview and quick content creation.</p>\n<h4 id=\"stats\">Stats<a href=\"#stats\" aria-label=\"Link to heading 'Stats'\" data-heading-content=\"Stats\" class=\"anchor\"></a></h4>\n<p>Six clickable cards showing counts for posts, pages, tags, streams, authors, and series. Each card links to its corresponding listing page. Below the cards, the last build's rendering time is displayed.</p>\n<h4 id=\"create-content\">Create Content<a href=\"#create-content\" aria-label=\"Link to heading 'Create Content'\" data-heading-content=\"Create Content\" class=\"anchor\"></a></h4>\n<p>A form with title and tags fields, plus an expandable <strong>+ Advanced</strong> section with stream, series, language, translates (slug picker), and directory fields. All fields support autocomplete. Two buttons:</p>\n<ul>\n<li><strong>New Post</strong> - creates a dated post</li>\n<li><strong>New Page</strong> - creates an undated page</li>\n</ul>\n<h3 id=\"layout\">Layout<a href=\"#layout\" aria-label=\"Link to heading 'Layout'\" data-heading-content=\"Layout\" class=\"anchor\"></a></h3>\n<p>Edit site layout and navigation settings. Changes are saved to <code>marmite.yaml</code>.</p>\n<h4 id=\"menu\">Menu<a href=\"#menu\" aria-label=\"Link to heading 'Menu'\" data-heading-content=\"Menu\" class=\"anchor\"></a></h4>\n<p>Visual editor for the navigation menu. Each menu item has a label and URL. Drag items up/down with the arrow buttons, remove with the X button, or add new items at the bottom.</p>\n<h4 id=\"titles\">Titles<a href=\"#titles\" aria-label=\"Link to heading 'Titles'\" data-heading-content=\"Titles\" class=\"anchor\"></a></h4>\n<p>Edit section titles used across the site: Pages, Tags, Archives, Authors, Streams, Series, Languages, and Search.</p>\n<h4 id=\"streams-series-languages-authors\">Streams, Series, Languages, Authors<a href=\"#streams-series-languages-authors\" aria-label=\"Link to heading 'Streams, Series, Languages, Authors'\" data-heading-content=\"Streams, Series, Languages, Authors\" class=\"anchor\"></a></h4>\n<p>Edit display names and metadata for each configured entry:</p>\n<ul>\n<li><strong>Streams</strong> - set <code>display_name</code> for each stream</li>\n<li><strong>Series</strong> - set <code>display_name</code> and <code>description</code> for each series</li>\n<li><strong>Languages</strong> - set <code>display_name</code> for each language</li>\n<li><strong>Authors</strong> - collapsible panels with name, avatar URL, bio, and links (formatted as <code>Label=URL, Label=URL</code>)</li>\n</ul>\n<p>Each section has a <strong>+</strong> button to add new entries and an <strong>X</strong> button on each row to remove entries. The key field autocompletes from existing values.</p>\n<h3 id=\"config\">Config<a href=\"#config\" aria-label=\"Link to heading 'Config'\" data-heading-content=\"Config\" class=\"anchor\"></a></h3>\n<p>Edit general site configuration fields from <code>marmite.yaml</code>:</p>\n<ul>\n<li><strong>General</strong> - site name, tagline, URL, language, footer, default author, date format</li>\n<li><strong>Display</strong> - pagination, search, related content, next/prev links</li>\n<li><strong>Images</strong> - card image, banner image, logo image</li>\n<li><strong>Paths</strong> - content path, site path, media path</li>\n<li><strong>Extra</strong> - JSON editor for the <code>extra</code> config object</li>\n</ul>\n<h2 id=\"404-page---create-it-button\">404 Page - &quot;Create it!&quot; button<a href=\"#404-page---create-it-button\" aria-label=\"Link to heading '404 Page - &quot;Create it!&quot; button'\" data-heading-content=\"404 Page - &quot;Create it!&quot; button\" class=\"anchor\"></a></h2>\n<p>When you navigate to a page that doesn't exist (e.g. <code>http://localhost:8000/my-new-page.html</code>), the 404 page shows a <strong>&quot;Page not found - Click here to create it!&quot;</strong> button. Clicking it creates the page using the slug from the URL as the title (converting hyphens to spaces and capitalizing words), then redirects you to the newly created page after the site rebuilds.</p>\n<h2 id=\"how-it-works\">How it works<a href=\"#how-it-works\" aria-label=\"Link to heading 'How it works'\" data-heading-content=\"How it works\" class=\"anchor\"></a></h2>\n<p>The toolbar is a self-contained JavaScript and CSS bundle served from <code>/__marmite__/toolbar.js</code> and <code>/__marmite__/toolbar.css</code>. The server injects <code>&lt;link&gt;</code> and <code>&lt;script&gt;</code> tags before <code>&lt;/body&gt;</code> in every HTML response.</p>\n<p>All toolbar actions use the <a href=\"content-management-api.html\" data-wikilink=\"true\">content-management-api</a> endpoints. After any mutation (create, edit, move, clone, delete), the toolbar intercepts the live-reload WebSocket signal to redirect to the correct page instead of blindly reloading the current URL.</p>\n<p>The toolbar state (open/closed, active tab) is persisted in <code>localStorage</code> so it survives page reloads.</p>\n<h2 id=\"keyboard-shortcuts\">Keyboard shortcuts<a href=\"#keyboard-shortcuts\" aria-label=\"Link to heading 'Keyboard shortcuts'\" data-heading-content=\"Keyboard shortcuts\" class=\"anchor\"></a></h2>\n<table>\n<thead>\n<tr>\n<th>Key</th>\n<th>Action</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>Escape</code></td>\n<td>Close the toolbar panel</td>\n</tr>\n</tbody>\n</table>\n<blockquote>\n<p>Please consider giving a ☆ on Marmite <a href=\"https://github.com/rochacbruno/marmite\">Github</a> repository, that helps a lot!</p>\n</blockquote>\n<!-- Contents from _markdown_footer.md are appended to every content -->\n<!-- _references.md is a file to gather all references together \nthis file is appended to every raw markdown.\n-->\n",
      "summary": "\"The marmite toolbar is a floating development panel injected during --serve mode that lets you create, edit, move, clone, and delete content directly from the browser.\"",
      "date_published": "2026-07-09T12:30:00-00:00",
      "image": "media/marmite-toolbar.banner.jpg",
      "authors": [
        {
          "name": "Bruno Rocha",
          "url": "https://go.rocha.social/@bruno",
          "avatar": "https://github.com/rochacbruno.png"
        }
      ],
      "tags": [
        "docs",
        "features",
        "toolbar",
        "server"
      ],
      "language": "en"
    }
  ]
}