A local-first desktop editor for Amytis content workspaces. It is built for writing-heavy content work: calm editing, keyboard-first navigation, native workspace access, and Git-aware publishing flows without leaving the workspace.
Built with Tauri 2 + React + TypeScript + Tailwind CSS v4, using Bun as the package manager.
Ovid combines the core workflows needed for Amytis-native writing in one desktop app:
- open an Amytis workspace or a normal Markdown workspace directly from disk, scaffold a brand-new one, or clone one from a git remote
- edit Markdown in a Typora-style rich editor without a split preview
- manage frontmatter and content-type metadata inline
- search files and full workspace text quickly
- handle daily Git actions such as commit, push, pull, fetch, and branch switching
- tune appearance, editor, language, and new-content defaults in Preferences (
Cmd+,)
Current release status:
- macOS and Windows packages exist
- macOS public distribution is still limited by the missing Apple signing/notarization work tracked in issue #43
Ovid editing an Amytis workspace with the file tree, rich Markdown editor, properties panel, and Git-aware status bar visible in one writing-focused layout.
- macOS, Windows, or Linux
- Bun — package manager and test runner
- Rust — required to build the Tauri backend
gitonPATH— optional; enables git status indicators and commit/push
bun install # Install dependencies
bun run tauri dev # Start with hot reload
bun run tauri build # Build distributable app
bun run validate # Type-check + lint + tests + build + cargo testFor release work, use these repo artifacts:
- CHANGELOG.md for shipped scope
- docs/release-checklist.md for release gates and packaging checks
- docs/updater-release-runbook.md for updater-compatible release steps
Press ? at any time inside the app to open the live Keyboard Shortcuts dialog, or open it from Help → Keyboard Shortcuts in the menu bar. The full reference is in docs/shortcuts.md.
Most-used:
| Shortcut | Action |
|---|---|
? |
Show Keyboard Shortcuts |
Cmd+P |
Open file switcher |
Cmd+F |
Find in document |
Cmd+H |
Find & replace |
Cmd+Shift+F |
Full-text search (workspace) |
Cmd+Shift+P |
Toggle properties panel |
Cmd+\ |
Toggle sidebar |
Cmd+N |
New file |
Cmd+S |
Save (force, bypass debounce) |
Cmd+W |
Close current file or tab |
Cmd+Shift+G |
Open commit dialog |
Ctrl+Cmd+Z |
Toggle zen mode |
On Windows/Linux, substitute
CtrlforCmdandAltforOption. Zen mode (Ctrl+Cmd+Z) is macOS-only.
All major actions are accessible from the native menu bar, making features discoverable without knowing keyboard shortcuts.
| Menu | Items |
|---|---|
| Ovid | About Ovid, Hide, Quit (standard macOS app menu) |
| File | New, Today's Flow, Open Workspace…, Switch Workspace…, Save, Close File |
| Edit | Undo, Redo, Cut, Copy, Paste, Select All, Find in Workspace, Find…, Find & Replace…, Open Quickly |
| Insert | Link…, Image…, Code Block, Table, Horizontal Rule |
| Format | Bold, Italic, Strikethrough, Inline Code, Heading 1-6, Blockquote, Bullet List, Numbered List, Task List |
| View | Toggle Sidebar, Toggle Properties Panel, Zen Mode, Typewriter Mode, Toggle Spell Check |
| Git | Commit Changes…, Switch Branch…, New Branch…, Open Remote, Copy Remote URL, Push, Pull, Fetch |
| Window | Minimize, Zoom (standard macOS window menu) |
| Help | Check for Updates…, Keyboard Shortcuts, Ovid Documentation, Report an Issue… |
Menu items show their keyboard shortcut where one exists. Insert and Format menu items work on the current editor selection.
Ovid includes built-in Git support for status, commit, push, pull, fetch, branch switching, and multi-remote workflows.
See Git Workflow for the status-bar model, sync behavior, remote handling, and current Git limits.
Click Open folder or press Cmd+O to pick a directory. Ovid walks the file tree and detects whether it is an Amytis workspace by checking for site.config.ts + content/ directory. If the folder is not recognised as an Amytis project, a warning toast is shown.
Only .md and .mdx files appear in the sidebar.
Ovid remembers the last workspace you had open and reopens it (with its tabs) automatically on next launch. To suppress this, turn off Restore last session on launch in Preferences → General (Cmd+,).
Press Cmd+Shift+O or click the workspace name at the top of the sidebar to open the Workspace Manager. The list view shows your five most recently opened workspaces — pick one to switch, hover for the per-item ⋯ menu (Reveal in file manager, Copy path, Remove from recents), or use one of the footer actions:
- Open folder… picks an existing directory from disk.
- Create new… scaffolds a brand-new Amytis workspace. Choose a parent directory and a name; pick Minimal Amytis stub for a small
site.config.ts+content/posts/skeleton or From Amytis starter to clone a maintained starter repository. - Clone… clones a remote workspace from a git URL into a folder you choose. Progress streams live while
git cloneruns.
The sidebar shows the full file tree of the current workspace, filtered to .md / .mdx files.
- Toggle —
Cmd+\hides/shows the sidebar; state is remembered across sessions - Resize — drag the right border to resize between 180 px and 480 px; width is persisted across sessions
- Directory expand/collapse — click a directory to toggle; folder icon changes between open/closed state
- Filter — click the 🔍 icon next to the workspace name to reveal the filter input; type to narrow the file list by filename or frontmatter
titlein real time; pressEsconce to clear, again to collapse the input (or click the 🔍 icon to close and clear in one step) - Titles — frontmatter
titleis shown instead of the filename where available - Draft indicator — files with
draft: trueare dimmed - Content type icons — files show an icon based on their frontmatter
type:field (post,flow,series,book,page,note); a generic file icon is used when the field is absent - Git status — per-file coloured dot appears when the workspace is a git repository (modified, staged, untracked); a rollup dot appears on a collapsed directory if any child has uncommitted changes
- Context menu — right-click any file or directory to rename, delete, or create a new file inside that directory
- Workspace name — click it to open the workspace switcher
In an Amytis workspace, content is created the way the Amytis new-* scripts would: posts land in the posts bucket as date-prefixed .mdx, series and books are created as folder-backed index.mdx (with an images/ dir), notes as flat .mdx, and flows under flows/<year>/<month>/<day>.md. The right-click menu is layer-aware — right-clicking the series folder offers New Series, a series folder offers New Post, a book offers New Chapter, flows offers today's flow, and so on. The new file opens immediately in the editor.
Inline rename in the sidebar. The editor tab updates automatically if the renamed file is currently open. Duplicate names are rejected.
Creates a sibling copy of the selected post or Markdown file. For folder-backed posts such as post/index.md or post/index.mdx, Ovid copies the whole post folder and opens the copied index file immediately.
Creates a sibling post from the selected post without carrying over the old body content. Ovid keeps the frontmatter shape, clears the body, and resets common post fields such as title, date, draft, featured, pinned, coverImage, slug, and tags. For folder-backed posts such as post/index.md or post/index.mdx, Ovid creates a new sibling post folder with the same index filename.
Moves the file to the system Trash (not permanent delete). A confirmation dialog is shown. If the file is currently open, it is closed first.
Right-click any directory in the sidebar and choose New file here to create a file inside it. Subdirectories can be created the same way.
A collection is a series whose index.mdx is type: collection — it gathers posts and series that live elsewhere via an items: list instead of holding them inside the folder. In the sidebar, a collection expands to show those items as links (clicking opens the referenced file; a missing reference is shown greyed out). Right-click the collection and choose Add post or series… to pick something to add, or right-click a link and choose Remove from collection — both update the items: list in the collection's index.mdx.
Ovid uses a Typora-style WYSIWYG editor (Tiptap / ProseMirror). Markdown renders inline as you type — no split pane. Files are persisted as valid Markdown; .md and .mdx files are both supported and never coerced into a different format.
Click Aa in the status bar to open the editor settings popover:
- Font — Serif (Georgia), Sans (system-ui), or Mono (Fira Code / JetBrains Mono)
- Size — Small (15 px), Default (17 px), Large (19 px)
Preferences are persisted across sessions.
Toggle native OS spell check from the Aa popover. The preference is persisted. Misspellings are underlined by the OS without disrupting the editor.
Hides the sidebar, properties panel, and status bar. The editor expands to full width with generous vertical margins. Press Esc or Ctrl+Cmd+Z again to exit. Works even when the editor has focus.
Toggle from the status bar (⌨ button). Keeps the active line vertically centred as you type, reducing eye movement during long writing sessions.
Press Cmd+K while the editor has focus to open the link dialog. If the cursor is already inside a link, the dialog pre-fills with the current URL and shows a Remove button to unset the link.
Select text and press Cmd+E to wrap it in backticks as inline code. Press again to remove the formatting.
Fenced code blocks are rendered with syntax highlighting via lowlight. Each block has a small toolbar:
- Language picker — choose from a curated preset list or enter a custom language label
- Copy button — copy the code block contents to the system clipboard with one click
The saved markdown remains a normal fenced code block. If you use a custom language label, Ovid preserves that label on disk even if syntax highlighting falls back to plain/auto highlighting.
Ovid preserves standard Markdown footnote syntax such as [^note] and [^note]: ....
- References are visually styled like superscript markers while editing
- Definitions are visually offset so footnote blocks are easier to scan
This is an editor-side presentation layer, not a special document model. Footnotes remain plain Markdown text on disk.
At the start of structural blocks, Backspace removes the current block treatment before it starts merging content into the previous block:
- Bullet / numbered / task list items — non-empty items unwrap from the list; empty items also unwrap instead of merging into the previous item
- Blockquotes — unwrap one quote level at a time
- Headings — convert directly back to a paragraph
- Code blocks — empty blocks convert back to a paragraph; non-empty blocks stay intact and do not merge into the previous block
Drag one or more image files from Finder (or Explorer) into the editor. Ovid:
- Copies each image into
<workspace>/assets/(creating the directory if needed) - Inserts a markdown image node at the drop position
- Shows an inline preview
Supported formats: PNG, JPEG, GIF, WebP, AVIF, SVG.
Hover over any link in the editor to see a URL preview tooltip after a short delay.
The properties panel sits above the editor and displays the frontmatter of the current file.
- Toggle —
Cmd+Shift+Por click the chevron; state is remembered - Content type — select from the type dropdown (
post,flow,note,series,book,page); select unknown to remove thetypefield from frontmatter - Edit fields — click any value to edit inline; changes are written back to the frontmatter on disk verbatim
- Tab between fields —
Tabmoves to the next field;Esccancels an edit - Tags — type a tag name and press
Enteror,to add; click×on a chip to remove - Add fields — type a new key and value into the empty row at the bottom; press
Enterto confirm - Draft badge — files with
draft: trueshow a Draft badge; click it to toggle to published (and vice versa)
Fuzzy search across all files in the workspace by filename and frontmatter title. Keyboard-navigable. Shows the file path for disambiguation.
The last 10 opened files per workspace are tracked and shown at the top of the file switcher and in the empty state.
Replaces the sidebar with a search panel. The shortcut works even when the editor is focused. Queries run in Rust across the entire workspace. Results show the filename and matching line with context; the match is highlighted. Click any result to open the file. Frontmatter content is included in the search.
The status bar (bottom of the window) shows:
- Path control — click the current file path to rename it; folder-backed posts show paths like
hello/index.md, but only the folder name is editable - Save indicator — grey dot = saved, amber dot = unsaved changes
- Word count — total words in the current file
- Session words —
+Nwords added since the file was opened; resets on file switch - Aa — editor settings (font, size, spell check, word-count goal)
- ⌨ — typewriter mode toggle
- ◎ — zen mode toggle
- Theme toggle — moon/sun icon for dark/light mode
- Gear — open Preferences (
Cmd+,)
Bypasses the 750 ms debounce and saves immediately.
Open the Aa popover (or Preferences → Editor), enter a target word count, and click Set. The status bar shows your progress (+N/GOAL). The goal persists across restarts.
On open, Ovid checks for site.config.ts + content/. If found, it is treated as an Amytis workspace and content type templates are enabled. A warning toast is shown for non-Amytis folders (the app still works normally).
Amytis derives a file's content type from its bucket folder under content/ (posts, series, books, flows, notes), not from frontmatter. The sidebar and New menu offer bucket-aware actions (e.g. New Post, New Series) that scaffold the matching folder layout and frontmatter, mirroring Amytis's new-* scripts.
The features: block in site.config.ts supplies each bucket's localized display name. A bucket switched off for the site (enabled: false) is not hidden — Ovid still shows and edits its on-disk content, just dimmed with a "hidden from site" badge. .rst files are shown read-only (Ovid edits markdown only), and <slug>.<locale> translation variants are grouped under their base file.
When the workspace is a git repository, per-file status markers appear in the sidebar (● modified, + untracked, S staged). Status refreshes automatically after each save.
Opens the commit dialog. The commit message is pre-filled as Update: <title>, the current branch is shown, and changed files can be included or excluded before confirming. You can optionally enable push in the same dialog. Requires git on PATH.
Ovid includes a native Git menu for the daily actions that make sense inside a writing app:
- Commit Changes…
- Switch Branch…
- New Branch…
- Push
- Pull
- Fetch
- Open Remote
- Copy Remote URL
The current branch appears as a pill in the status bar. Click it to open the branch switcher, which lets you:
- search local branches
- switch branches
- create a new branch
- see upstream / ahead-behind state
- open the current remote
- copy the current remote URL
After a successful branch switch or branch creation, Ovid reloads the workspace so the tree and editor match the checked-out branch.
When a branch tracks an upstream, Ovid shows that relationship in the branch UI and in the status-bar branch tooltip. If the branch has a remote but no upstream yet, the UI makes that clear instead of failing silently.
If you push a newly created branch that does not yet have an upstream, Ovid automatically falls back to git push -u <remote> <branch>. The branch switcher also exposes this explicitly as Push + Track when appropriate.
In the properties panel, click the DRAFT badge to toggle draft: true/false. Setting draft: false on a file in a git workspace automatically opens the commit dialog pre-filled with Publish: <title>.
Follows the system preference by default. Toggle manually with the moon/sun icon in the status bar. The preference is persisted across sessions.
Errors and warnings appear as brief toast messages at the bottom centre of the window (visible for 2 seconds). They never block writing.