A tiny WYSIWYG-style Markdown formatting layer for Obsidian users.
English | Русский | Español | Deutsch | 中文 | 日本語
mdMenu is a clean-room Obsidian Markdown toolbar inspired by cMenu. It gives the editor a mini WYSIWYG-style layer for common formatting while keeping your notes as plain Markdown underneath. Headings, checkboxes, callouts, links, highlights, code, lists, bold, italic, and a few quiet helpers stay right next to the text you are writing.
Keep it pinned at the bottom. Let it follow the selection. Drag it somewhere comfortable and leave it there. You still write Markdown, just with fewer command palette trips, fewer memorized shortcuts, and a little more direct manipulation.
Status: GitHub-release ready. Community plugin submission: in progress.

The built-in command registry covers:
The default toolbar doesn't show every command at once. It starts with a useful writing set and leaves the rest available through presets or the settings tab.
The default toolbar shows H1, H2, H3, and H4 as separate buttons. H5, H6, and the grouped heading menu are still there if you want a different setup.
mdMenu has four placement modes:
fixed: keep the toolbar at the bottom of the workspace.selection: show it near selected text.cursor: place it near the current editor selection or caret when the browser gives mdMenu a usable selection rectangle.manual: drag it by the handle and keep the saved position.Selection, cursor, and manual placement stay inside the viewport, even in small windows.
The toolbar is editable from settings:
Separators are real toolbar items, so you can make the bar read like groups instead of one long strip of icons.
Presets are quick starting points:
Writer: the full default set for regular Markdown writing.Zettelkasten: headings, checkboxes, quotes, highlights, wikilinks, and Markdown links.Code notes: inline code, code blocks, lists, callouts, and links.Compact: a shorter toolbar with grouped headings and the compact visual style.After picking a preset, you can still add buttons, remove buttons, add separators, and reorder everything. Presets don't lock the toolbar. They just save you from building the first version by hand.
default: regular Obsidian toolbar density.compact: smaller buttons when the note needs more room.Both styles use Obsidian theme variables, so mdMenu follows light and dark themes without adding its own color system.
> [!note], or removes an existing callout marker.Saved settings are normalized on load. If old or malformed data shows up, mdMenu falls back to defaults instead of breaking the toolbar.
The repo has a local release build and a tag-based GitHub release workflow. Release assets include main.js, manifest.json, and styles.css, with GitHub artifact attestations.
The settings tab lets you:
Install mdMenu from the official Obsidian Community Plugins directory:
mdMenu on Obsidian Community Plugins
Then enable mdMenu from Obsidian's community plugin settings.
BRAT can install mdMenu directly from GitHub releases:
sandsaber/mdMenu.mdMenu from Obsidian's community plugin settings.Download these files from the latest GitHub release:
main.js
manifest.json
styles.css
Put them here in your vault:
.obsidian/plugins/mdmenu
Then enable mdMenu from Obsidian's community plugin settings.
Build the release folder:
npm run build:dist
Copy this folder:
dist/mdmenu
to your vault:
.obsidian/plugins/mdmenu
Then enable mdMenu from Obsidian's community plugin settings.
npm run build:dist creates:
dist/mdmenu/main.js
dist/mdmenu/manifest.json
dist/mdmenu/styles.css
dist/mdmenu/LICENSE
dist/ is ignored by Git. Rebuild it when you need a fresh local package.
GitHub releases are created from semver tags without a v prefix:
git tag 1.0.3
git push origin 1.0.3
The release workflow runs on tags matching x.y.z. It installs dependencies with npm ci, runs npm audit --omit=dev, lints, typechecks, runs tests, builds dist/mdmenu, checks that the tag matches package.json and manifest.json, verifies release assets, creates GitHub artifact attestations, and publishes main.js, manifest.json, and styles.css.
Install dependencies:
npm install
Run tests:
npm run test
Run lint checks:
npm run lint
Run TypeScript checks:
npm run typecheck
Build the root plugin bundle:
npm run build
Build the release folder:
npm run build:dist
Run the full pre-release check:
npm run check
npm run check runs lint checks, tests, the production build, the release folder build, and npm audit --omit=dev.
The current tests cover:
Next up:
mdMenu runs locally inside Obsidian. It doesn't send notes, selections, settings, or telemetry anywhere.
mdMenu is inspired by cMenu, an earlier Obsidian formatting toolbar plugin. This project doesn't copy cMenu source files.
MIT. See LICENSE.