Product Documentation.

How HermesMarkdown works, feature by feature. Plain .md files, a minimalist writing surface, and optional AI assistance when you want it. Works offline, saves straight to your machine.

Get Started

Installation

HermesMarkdown is a web app — there's nothing to download or install in the traditional sense.

Vaults are read and written through the browser's File System Access API, which only Chromium-based browsers implement. Use one of the browsers below.

Google ChromeSupported
Microsoft EdgeSupported
Brave / Arc / OperaSupported
FirefoxNot supported
SafariNot supported
NoteOn an unsupported browser, the editor still loads, but the vault picker is disabled — there's no folder to open or save to.

HermesMarkdown ships a web app manifest, so supported browsers offer an Install option in the address bar. Installing gives it its own window and app icon, but doesn't change how it works — it's the same browser-based app, not a native build.

Create a vault

A vault is any folder on disk that HermesMarkdown reads and writes Markdown files in directly.

Click the vault icon in the sidebar and pick an existing folder, or create a new one in the picker.

The browser grants HermesMarkdown direct read/write access to that folder for the session. Nothing is uploaded — files stay where they are on disk.

Everything in the folder — your notes, your subfolders — is yours; HermesMarkdown never restructures it. A hidden .hermes/ directory only appears if you set up a voice profile, and holds nothing but that one file.

WarningDropbox and iCloud can lock files mid-sync. If saves start failing inside a synced folder, pause the sync client and retry.

New vault

Create a fresh, empty vault — name it, pick a location, and start writing.

In the sidebar, click the vault icon and choose New Vault, or run it from the command palette.

Type a vault name (this becomes the folder name on disk) and click Choose parent folder to pick where the folder will be created, then click Create Vault.

HermesMarkdown creates the folder and opens the vault on a blank note. No example content is added.

NoteThe dialog checks for an existing folder with the same name at the chosen location and stops if one is found — it will never overwrite an existing directory.

Your first note

New File opens a blank Markdown file with its frontmatter panel ready to fill in.

Use the + button in the sidebar, or run New file from the command palette.

The frontmatter panel opens automatically on every new file, prompting for the fields defined in your vault's schema — title, status, and whatever else you've configured. Fill in what's relevant and skip the rest; nothing here is required beyond title.

titleRequired
statusDefaults to draft
Everything elseOptional
TipClosed the panel without finishing? Click the ✎ icon in the frontmatter header to reopen it at any time.

Save manually with CTRL+S, or rely on autosave — configurable under Settings → Editor. The status bar shows whether the file has unsaved changes.

Editor layout

The app opens straight into a full-screen editor — every panel is summoned, not docked by default.

There's no formatting toolbar above the text. Formatting happens through Markdown syntax, keyboard shortcuts, and the slash command menu.

The sidebar (files, search, tasks) stays hidden at rest. Move the mouse to the left edge to open it, or pin it with CTRL+SHIFT+E; switching between its panels happens from the command palette rather than a row of icons.

SidebarHover edge / CTRL+SHIFT+E
Command PaletteCTRL+SHIFT+P
AI ChatCTRL+SHIFT+B
Voice inputCTRL+SHIFT+V
Frontmatter panel✎ in document header

Open several files side by side: split right from the tab bar, drag tabs between panes, and resize with the divider.

Keyboard shortcuts

The full reference, grouped by where you're using it.

Editor

SaveCTRL+S
BoldCTRL+B
ItalicCTRL+I
UndoCTRL+Z
Open link pillCTRL+ENTER
Expand date pickerALT+↓
Toggle sidebarCTRL+SHIFT+E
AI ChatCTRL+SHIFT+B
Voice inputCTRL+SHIFT+V
Dismiss / closeESCAPE

Table

Move between cellsTAB / SHIFT+TAB / ARROWS
Edit focused cellENTER
New row at endENTER on last row

Navigation

Open link or dateCTRL+CLICK
Toggle task checkboxCLICK [ ] / [x]
Cycle lifecycle tagCLICK ‹ #tag ›

Command Palette

OpenCTRL+SHIFT+P
FilterKeep typing
Navigate results↑ / ↓
Run commandENTER
DismissESCAPE

Editor

Writing

One view, not two — the editor highlights Markdown inline over the raw text instead of switching between source and preview.

What you see is the file's actual content — headings, bold, links, and lifecycle tags are rendered inline over the text you're typing, not in a separate pane. There's nothing to toggle between.

Two column widths are available from Settings → Editor: Standard and Narrow. Below the medium breakpoint, the column collapses to full width regardless of the setting.

StandardWider column, more characters per line
NarrowProse-width column
Small screensFull width, setting ignored
TipClick actions work without touching raw syntax — checkboxes toggle, lifecycle tags cycle on click, and wikilinks open with CTRL+Click.

Tables

Click inside a pipe table for a floating toolbar, and edit cells directly in the text — no separate view to switch to.

Type /table in the slash menu, or the {table} shortcode. Both drop a 3×2 starter table with the cursor in the first cell.

Click inside any table to get a floating toolbar over it.

Delete table× in toolbar
Copy as CSVCSV in toolbar
Sort a column↑ / ↓ in toolbar
Cell navigationTab / Shift+Tab / Arrows
Edit a cellEnter
New row at endEnter on last row

Smart sorting recognizes dates, currency, and plain numbers regardless of column alignment. Output stays clean, auto-padded Markdown that respects left, center, or right alignment markers.

NoteTable cells hold plain text — there's no formula engine or spreadsheet-style calculation. What you type is what gets written back to the file.

Tasks pane

A vault-wide checklist — every checkbox task across every note, grouped into To Do, In Progress, and Done.

Open it from the command palette (Open Tasks). The pane scans every file in the vault for Markdown task lines and lists them grouped by status.

- [ ] taskTo Do
- [ ] task #progIn Progress
- [x] taskDone

A task counts as In Progress when it's unchecked and tagged #prog anywhere on the line. The #prog tag itself — along with #todo and #done, which are purely cosmetic — is stripped from the text shown in the pane. Within each group, tasks are sorted by their note's title.

Click a task's checkbox to toggle it — the change writes straight back to the source line in the file, no need to open it first. Click the task text instead to open its note and jump to that line.

NoteThe Done group starts collapsed so completed work doesn't crowd out what's still outstanding; To Do and In Progress start expanded. Click a group header to fold or unfold it.

Frontmatter panel

A structured form over the YAML block at the top of a file — edit fields without writing YAML by hand.

Click the ✎ icon in a document's frontmatter header to open the panel. It also opens automatically on new files.

The panel renders three fields: title, status, and tags. That's the whole schema — fixed, not configurable, kept deliberately small.

Every change in the panel writes straight back to the YAML block at the top of the file — there's no separate save step for frontmatter and no risk of the panel and the raw block drifting apart.

NoteOn a mobile screen, the panel uses a bottom-sheet layout to stay clear of the soft keyboard.

Callout blocks

Obsidian-compatible callout syntax — a typed, foldable blockquote, written in plain Markdown.

> [!tip] Optional title
> Body text, same as a regular blockquote.

Insert one from the slash menu with /callout, which defaults to note.

Add + or - after the type to make it foldable: + starts expanded, - starts collapsed. No suffix means a plain, non-foldable callout.

> [!warning]- Collapsed by default
> Click the title to expand.

The type is case-insensitive and any word works, but these have dedicated colors and icons:

note📝
abstract📋
infoℹ️
tip💡
success
question
warning⚠️
failure
danger🔥
bug🐛
example📑
quote💬
NoteAliases resolve to one of the types above — e.g. tldr and summary map to abstract; hint and important map to tip; check and done map to success; help and faq map to question; caution and attention map to warning; fail and missing map to failure; error maps to danger; and cite maps to quote. An unrecognized type falls back to the note style with your own label.

Voice input

Dictate straight into a note — the mic understands a small grammar of spoken commands for lists, headings, and formatting, not just plain sentences.

Start voice input from the command palette (Start voice input) to start listening. Speech accumulates in an editable preview box instead of the document itself, so you can fix a mishear before it ever touches your note. Press Enter to insert the reviewed text at the cursor, Shift+Enter to add a line break within the preview, or Escape to discard it.

WarningVoice input uses the browser's built-in Web Speech API, which only Chromium-based browsers implement — see Installation. The mic button is hidden entirely on unsupported browsers.

Most speech is inserted as plain text, but starting a phrase with one of the keywords below is parsed as a command instead:

"heading two Project Notes"## Project Notes
"bullet buy milk"- buy milk
"numbered item first step"1. first step
"indent bullet …" / "indent numbered item …"Nested one level deeper
"task incomplete / complete …"- [ ] … / - [x] …
"quote to be or not to be"> to be or not to be
"bold …" / "italic …" / "strikethrough …"**…** / *…* / ~~…~~
"inline code const x"`const x`
"code block python" … "end code block"Fenced code, dictated literally until closed
"wiki link to dashboard" / "link"[[dashboard]] / opens the link dialog
"horizontal rule" / "divider"---

A few words control layout and punctuation instead of inserting Markdown syntax directly:

"new line" / "new row" / "new paragraph"Line break / blank line
"period" / "comma" / "question mark" / "exclamation point"Punctuation
"colon" / "semicolon"Punctuation
"outdent" / "unindent"Back out one list level
"two levels deep"Jump list indentation to a specific level
"done with list" / "end list"Reset indentation to zero
"scratch that" / "delete last" / "undo that"Remove the previous dictated phrase
TipCommands nest — "bullet bold important" produces - **important**, and the same applies inside headings and tasks. Anything that doesn't match a command is inserted as plain text, so ordinary dictation always works. Sentences capitalize themselves automatically after a spoken "period", "question mark", or "exclamation point" (a comma doesn't count), and a heading always starts its own line.

Listening stops automatically when the pane loses focus, the tab is backgrounded, or the mic button is clicked again. If the browser denies microphone access, loses its network connection mid-session, or can't find a microphone, a toast explains why and listening stops rather than retrying silently.

Command palette

A fuzzy-searchable list of every app-level action — open it instead of hunting for a menu.

CTRL+SHIFT+P. Keep typing to filter — matching characters are highlighted, and each entry shows its own shortcut if it has one.

Every command here is a second entry point to something also reachable another way — there's no command-only behavior.

SaveCTRL+S
New file
Export current file
Toggle sidebarCTRL+SHIFT+E
Switch theme
Open settings
Open vault
New folderWhen a vault is open
Create new vault
Open AI ChatCTRL+SHIFT+B · when AI is configured
Focus editor
Close current tab
Close all tabs

Combine this with the per-context shortcuts in Keyboard shortcuts and the slash command menu (/) for inserting content, and the editor is fully operable without ever reaching for the mouse.

Vault

Vault overview

A vault is a folder. HermesMarkdown reads and writes plain Markdown files in it and otherwise leaves it alone.

Any folder you open becomes a vault. Subfolders, file names, and organization are entirely yours — HermesMarkdown doesn't enforce a structure or move files around.

my-vault/
  projects/         ← yours
    roadmap.md
  daily/            ← yours
    2026-06-25.md

Every note is a plain .md file with a small YAML frontmatter block. Open the folder in any other editor, sync it with Dropbox or Google Drive, or move it to another machine — nothing about it depends on HermesMarkdown being installed. The only thing HermesMarkdown ever adds is a hidden .hermes/ folder, and only if you set up a voice profile.

Frontmatter conventions

Three fields, fixed — all optional except title.

titlestring · required
statusenum · default draft
tagslist · optional

title

The note's primary identifier. The only field a note can't be saved without.

status

One of draft, review, active, or archived. Stays in sync with the document's lifecycle tag — change one and the other follows.

tags

Free-form domain tags, distinct from the lifecycle tag that mirrors status.

AI Features

BYOK setup

Every AI feature is hidden until you connect your own Anthropic or Google Gemini key — there's no default model HermesMarkdown provides.

Anthropic ClaudeSonnet, Haiku, Opus tiers
Google GeminiModels fetched from your account

Settings → AI Features → choose a provider → paste your API key → Test Connection. Once a key validates, every AI action in the editor and command palette becomes visible.

The key is stored in your browser. Each AI request passes through HermesMarkdown's servers on its way to Anthropic or Google — the key is never logged or saved there. See Privacy model for the full picture.

NoteRemove a key by clearing the field in Settings → AI Features and saving. AI actions disappear again until a new key is set.

AI commands

Selection-based commands rewrite what you've highlighted; a few others work from a typed instruction or the surrounding note instead.

Type / and pick a command from the AI group — only visible once a key is configured.

✨ Improve writingClearer wording, same intent
✅ Fix spelling & grammarLight correction pass
✂️ ShortenCompress verbose text
➕ ExpandElaborate on terse text
🎩 Change tone: Formal / Casual / Direct / PolishedFour separate commands
📃 SummarizeConcise recap
🗒️ Extract tasksConvert to a checklist
📑 Create outlineHeadings and bullets
🏷️ Generate titleFrom the note or selection
➡️ Continue writingFrom the cursor, using nearby context
❓ Explain selectionPlain-language recap

Selection-based commands need text highlighted first. Generate title and Continue writing work without a selection — they read the surrounding note instead.

TipEvery action opens a diff review before anything touches your note — red for removed, green for added — then Replace, Insert Below, or Cancel. Nothing is applied without a confirmed review.

Repurpose a note

Turn the note you're editing into a blog post, social post, or newsletter draft — as new files, with the source note left untouched.

Run Repurpose note into blog / social / newsletter draft… from the command palette (only visible once a key is configured, and only with an open note that has content).

Pick one or more target formats, then Draft. The AI drafts each selected format from the current note's content — reading .hermes/voice.md for tone if it exists — and shows every draft for review before anything is saved.

Confirming writes one new file per format, named after the source note (e.g. pricing-launch-blog.md, pricing-launch-social.md). The original note is never modified.

TipThis is a single in-app action instead of a manual prompt — the AI drafts every format in one pass and nothing is written until you confirm.

Voice profile

A .hermes/voice.md file describing your audience, tone, and recurring themes — the AI reads it before generation or rewrite tasks where tone matters.

Three ways to set it up: Settings → AI Features → Voice & Tone, or the command palette entries Voice & Tone: Create voice.md and Voice & Tone: Draft voice.md from notes… (the second needs an AI key configured).

Create voice.mdOpens a blank file at .hermes/voice.md for you to fill in by hand
Draft from notes…Pick a few existing notes; the AI reads them once and drafts Audience / Tone / Recurring themes / Avoid sections for you to review and edit before saving

It's a plain Markdown file — nothing is created or overwritten automatically. Once it exists, AI commands that generate or rewrite text read it for tone guidance, including repurposing a note into a blog post, social snippet, or newsletter draft.

TipThe first time you have an AI key configured and open a vault with no voice.md, a one-time toast offers to set one up. It shows at most once — dismissing it (or already having a voice.md) means you won't see it again, but the Settings page and command palette entries stay available regardless.
NoteRequires an AI key for the "Draft from notes…" option — see BYOK setup. Creating voice.md by hand needs no key at all.

Privacy model

No AI request leaves your machine unless you've configured a key, and the key itself never touches HermesMarkdown's servers at rest.

HermesMarkdown is local-first: your vault is read and written directly from the browser, with no upload step and no HermesMarkdown database holding your notes.

Vault filesNever leave your machine
App settings (theme, font, sidebar width)Browser localStorage / IndexedDB
AI API keyBrowser localStorage
NoteWithout an AI key configured, no note content is ever sent anywhere. Every AI action is triggered manually — nothing runs on its own.

Settings

Appearance

Theme, type size, line height, letter spacing, and typeface are independent settings — each one editable on its own.

Dark/light theme is a single toggle in Settings → Interface. Type settings live in Settings → Typography.

Dark themeSettings → Interface
Text sizeCompact / Standard / Large / XL
Line heightNormal / Relaxed / Loose
Letter spacingNormal / Wide
TypefaceSystem Mono, JetBrains Mono, Fira Code, IBM Plex Mono, Journal (Serif)
NoteLine height only offers the default or looser — the highlighted overlay and the underlying textarea have to stay pixel-aligned, so tighter values aren't exposed.

Editor width

Standard or Narrow sets the maximum line width of the editor column.

Settings → Editor → Display → Editor Width.

StandardWider column, more characters per line
NarrowProse-width column
Below the medium breakpointFull width, setting ignored

Keybindings

Shortcuts are fixed — there's no remapping screen yet.

Every shortcut in HermesMarkdown is built in and not user-configurable. See Keyboard shortcuts for the full reference grouped by context.

Mobile

Mobile layout

Below a 768px viewport, the sidebar and tab bar are replaced by a single floating button and full-screen overlays.

A single draggable button opens the command palette — Files, New File, Search, Voice, and AI Chat all live there, the same as on desktop. Drag it out of the way of what you're typing; its position is remembered between sessions.

With more than one file open, a thin indicator bar above the editor shows the active file's name and expands into a switcher on tap.

Files and Search open as full-screen overlays rather than a docked sidebar panel.

Table editor on mobile

Tables edit in place, same as desktop — only the frontmatter panel switches to a bottom sheet.

Tables use the same floating toolbar and in-place cell editing as desktop — there's no separate view to switch to. Tapping the frontmatter ✎ icon instead slides a sheet up from the bottom edge, capped to a portion of the screen height so the soft keyboard never covers it. Drag the handle down to dismiss.

Cell navigation and range selection work the same as desktop — only the surrounding chrome changes.

Differences from desktop

Mobile trades some desktop-only surfaces for touch-first equivalents — the underlying editing model is unchanged.

SidebarFloating button + full-screen overlays
Frontmatter panelBottom sheet, not centered dialog
Selection toolbarBold, Italic, Link only

On desktop, selecting text surfaces a toolbar with Improve Writing, Expand, and a free-form prompt action alongside formatting. On mobile, the equivalent toolbar is pared down to Bold, Italic, and Link — AI actions on a selection are reached through the slash menu or command palette instead.