Vantage 🔭
A beautiful local Markdown viewer with live reload and Git awareness.
Vantage renders your Markdown files the way GitHub does — locally, instantly, with live reload as you edit. Point it at one directory or several, and browse your docs in a polished web UI with file tree navigation, Mermaid diagrams, commit history, and diffs.
Vantage ships as a single Go binary with an embedded React frontend — no runtime dependencies, no background services to babysit. Built for developers who write docs alongside code, and especially useful for reviewing LLM-generated Markdown output in real time.
Platform: Linux and macOS are fully supported. Windows is not supported.
Install
go install
go install github.com/mschulkind-oss/vantage/cmd/vantage@latest
This installs a vantage binary to your $GOBIN (typically ~/go/bin). Make sure it's on your PATH.
Homebrew (recommended)
brew install mschulkind-oss/tap/vantage
From source
git clone https://github.com/mschulkind-oss/vantage
cd vantage
mise install # installs Go 1.26, Node 22, just
just build # produces ./vantage
The resulting ./vantage binary embeds the compiled frontend, so it's fully self-contained.
🚀 Quick Start
Single Directory
Point Vantage at any directory containing Markdown files — or a specific file:
vantage ~/Documents/notes # open a directory
vantage ~/Documents/notes/intro.md # open a specific file
The server starts, your default browser opens to the file (or directory root), and the sidebar focuses on the parent directory of what you opened. Pass --no-open to suppress the browser launch.
Point it at the directory holding your git clones and each clone becomes its own project, exactly as the daemon's source_dirs would make them, plus one project for any Markdown outside them (--one-project keeps them all together). To keep the clones served in the background:
vantage ~/code # one project per clone
vantage install-service --source-dir ~/code # the clones, as a login service
Multiple Directories (Daemon Mode)
To serve several directories at once, create a config and run the daemon:
# Generate a config file
vantage init-config
# Edit it
$EDITOR ~/.config/vantage/config.toml
# Start the daemon
vantage daemon
✨ Features
- GitHub-Style Rendering — Full GitHub Flavored Markdown with syntax highlighting, tables, task lists, and footnotes
- Math & Diagrams — KaTeX math rendering and inline Mermaid diagrams from fenced code blocks
- Live Reload — Files update instantly in the browser via WebSocket when modified on disk
- Git Integration — View commit history, diffs, working-tree changes, file status, and recent changes for any file
- Review Mode — Inline comments with tracked agent responses (delivered via
.vantage/inboxfiles or pasted into the panel) for collaborative review - Multi-Repo Mode — Serve multiple directories from a single daemon, each accessible by name
- Source Directory Auto-Discovery — Point at parent directories to automatically find and add all git repos
- File Tree Navigation — Lazy-loaded sidebar with directory expansion
- Frontmatter Support — Displays YAML and TOML frontmatter as a clean metadata table
- Agent CLI —
vantage-check: a standalone binary that prints Vantage's Markdown conventions and verifies that a document really renders - Static Site Export — Build a standalone static site from a directory of Markdown
- Dark Mode — Toggle with Shift+D, persisted across sessions
- Color Themes — Slate (the built-in look) plus Catppuccin, Gruvbox, Lila, Nord, Solarized and Tokyo Night, or your own palette as one CSS file in
~/.config/vantage/themes/(guide) - Keyboard Shortcuts — Quick file picker with
t, fuzzy search, keyboard navigation - Performance Diagnostics — Built-in
perf-reportcommand for anonymized timing data - Login Service — Run in the background from login: a systemd user unit on Linux, a launchd agent on macOS
🤝 Works well with
matt-craft is a set of skills for writing the kinds of documents Vantage is built to read: design notes that carry their open questions, roadmaps, research rounds, user stories — and one skill aimed squarely at Vantage's own Markdown conventions. Same author as this one, which is not a coincidence.
You do not need it. Vantage renders the Markdown you already write, in whatever style you already write it. But if you would rather not invent a house style for design docs, there is one sitting right there.
⚙️ Configuration
The config file lives at ~/.config/vantage/config.toml on Linux and macOS alike ($XDG_CONFIG_HOME/vantage/config.toml when that is set). Generate one with:
vantage init-config
Example Config
# Server settings
host = "127.0.0.1"
port = 8000
# Auto-discover git repos under these directories, re-scanned every 30s so a
# new clone is served — and a deleted one dropped — without a restart
source_dirs = ["~/code", "~/projects"]
# Or list repos explicitly (both methods can be combined)
[[repos]]
name = "notes"
path = "~/Documents/notes"
[[repos]]
name = "work-docs"
path = "~/work/documentation"
Each repo is accessible at http://localhost:8000/{name}/ — or whatever
port Vantage printed on startup, if 8000 was taken (only the default port
falls forward; see the note under --port below).
Configuration Reference
| Key | Type | Default | Description |
|---|---|---|---|
host |
string | "127.0.0.1" |
Server bind address |
port |
integer | 8000 |
Server port. Set explicitly it must be free or startup fails; only the default falls forward, scanning up to 100 ports |
source_dirs |
array of strings | [] |
Parent directories to scan for git repos |
repos[].name |
string | required | Display name and URL slug for the directory |
repos[].path |
string | required | Path to directory (supports ~) |
repos[].allowed_read_roots |
array of strings | [] |
Additional directories this repo may read |
exclude_dirs |
array of strings | (see below) | Directories to hide from file listings |
show_hidden |
boolean | true |
Show dotfiles in sidebar |
walk_max_depth |
integer or null | null (unlimited) |
Max directory depth for untracked file discovery |
walk_timeout |
float | 30.0 |
Timeout (seconds) for git ls-files subprocess |
use_ignore_files |
boolean | true |
Honor .gitignore and ignore files during walks |
log_level |
string | "info" |
Logging verbosity |
theme |
string | "" (built-in) |
Default color theme for every browser; user config only, and a project may offer one below it (guide) |
Excluded Directories
By default, Vantage hides common build and dependency directories from the sidebar, file picker, and recent files — for example node_modules, dist, build, .cache, .git, .hg, and .svn.
Override this in your config:
exclude_dirs = ["node_modules", "vendor", "dist"]
🔧 Service Management
Vantage can run as a per-user background service that starts on login — a systemd user unit on Linux, a launchd agent on macOS. One command writes either:
vantage install-service
It writes the service definition and prints the commands that load it; it never activates anything for you.
Linux (systemd)
install-service creates ~/.config/systemd/user/vantage.service.
# Enable and start
systemctl --user daemon-reload
systemctl --user enable vantage
systemctl --user start vantage
# Check status
systemctl --user status vantage
# View logs
journalctl --user -u vantage -f
# Restart after config changes
systemctl --user restart vantage
# Stop the service
systemctl --user stop vantage
User services stop when you log out. To keep Vantage running past logout:
loginctl enable-linger $USER
macOS (launchd)
install-service creates ~/Library/LaunchAgents/io.github.mschulkind-oss.vantage.plist.
# Load and start — now, and at every login
launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/io.github.mschulkind-oss.vantage.plist
# Check status
launchctl print gui/$(id -u)/io.github.mschulkind-oss.vantage
# View logs (launchd has no journal; the agent writes to a file)
tail -f ~/Library/Logs/vantage.log
# Restart after config changes
launchctl kickstart -k gui/$(id -u)/io.github.mschulkind-oss.vantage
# Stop and unload
launchctl bootout gui/$(id -u)/io.github.mschulkind-oss.vantage
kickstart restarts the job from the plist launchd read at bootstrap time, not from the file on disk — so after re-running install-service, bootout and bootstrap again. See Daemon Mode for the rest.
🖥️ CLI Reference
The command is vantage.
vantage [PATH] # Serve a dir or file, auto-open browser
vantage serve [PATH] [flags] # Same as above, with explicit flags
vantage daemon [-c config.toml] # Serve multiple directories from config
vantage init-config # Generate example config file
vantage install-service # Install a login service (systemd / launchd)
vantage install-service --source-dir DIR # Add DIR's clones to the config, install and start it
vantage build PATH -o OUTPUT # Build a static site
vantage perf-report [--url] # Performance diagnostics from a running instance
serve flags
| Flag | Description |
|---|---|
--host |
Bind address (default 127.0.0.1) |
--port |
Server port (default 8000). A port set explicitly — flag, PORT env, or config — must be free or startup fails; only the default falls forward, scanning up to 100 ports |
--no-open |
Don't open the browser on start |
--show-hidden |
Show dotfiles in the sidebar |
--exclude-dirs |
Directories to hide from file listings |
--use-ignore-files |
Honor .gitignore and ignore files during walks |
--walk-max-depth |
Max directory depth for untracked file discovery |
--walk-timeout |
Timeout (seconds) for git ls-files subprocess |
--one-project |
Serve a directory of git clones as one project, not one per clone |
🔌 API
Vantage exposes a REST API for programmatic access under /api.
Single-Repo Endpoints
| Endpoint | Description |
|---|---|
GET /api/tree?path=. |
File tree listing |
GET /api/content?path=file.md |
File content |
POST /api/planning/stream |
Every planning candidate, one JSON line each; a file's text only when the browser lacks it |
GET /api/planning/sources?path=file.md |
Planning index source for one file |
POST /api/planning/reviews |
Review comments of many documents |
GET /api/planning/server-id |
Which server this is, for the browser's planning cache |
GET /api/files |
List all Markdown files |
GET /api/files/all |
List all files |
GET /api/recent/all |
Recently changed files, all projects |
GET /api/info |
Repository metadata |
GET /api/git/history?path=file.md |
Commit history |
GET /api/git/diff?path=file.md&commit=SHA |
Diff for a commit |
GET /api/git/diff/working?path=file.md |
Uncommitted changes diff |
GET /api/git/status?path=file.md |
File status (modified, committed) |
GET /api/git/recent?limit=20 |
Recently changed files |
GET /api/review |
Read review comments |
DELETE /api/review |
Remove review data |
POST /api/review/comments (+ subroutes) |
Review commands (create, reply, …) |
Multi-Repo Endpoints
In daemon mode, endpoints are prefixed with /api/r/{repo}/:
| Endpoint | Description |
|---|---|
GET /api/repos |
List configured repositories |
GET /api/r/{repo}/tree?path=. |
File tree for a repo |
GET /api/r/{repo}/content?path=file.md |
File content for a repo |
| (all single-repo endpoints above) | Prefixed with /api/r/{repo} |
Utility Endpoints
| Endpoint | Description |
|---|---|
GET /api/health |
Health check |
GET /api/version |
Server version info |
GET /api/perf/diagnostics |
Performance diagnostics (anonymized) |
POST /api/perf/reset |
Reset performance counters |
GET /api/themes |
User color themes + the defaults |
GET /api/themes/{id} |
One user color theme's stylesheet |
GET /api/degraded |
Projects too big for a limit (watches, walk timeout), for the viewer's banner |
WS /ws |
WebSocket for live reload notifications |
🛠️ Development
Run the quality gate with just check (gofmt, go vet, staticcheck, go test, plus frontend lint, tsc, and vitest). See docs/development.md for more on building, testing, and contributing to Vantage.
📄 License
Apache 2.0 — see LICENSE.
Metadata
Release files for vantage-md 0.9.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| vantage_md-0.9.0-py3-none-musllinux_1_2_x86_64.whl | Python 3 | none | Linux musl 1.2+ x86-64 | Details |
| vantage_md-0.9.0-py3-none-musllinux_1_2_aarch64.whl | Python 3 | none | Linux musl 1.2+ ARM64 | Details |
| vantage_md-0.9.0-py3-none-manylinux_2_17_x86_64.whl | Python 3 | none | Linux glibc 2.17+ x86-64 | Details |
| vantage_md-0.9.0-py3-none-manylinux_2_17_aarch64.whl | Python 3 | none | Linux glibc 2.17+ ARM64 | Details |
| vantage_md-0.9.0-py3-none-macosx_11_0_x86_64.whl | Python 3 | none | macOS 11.0+ x86-64 | Details |
| vantage_md-0.9.0-py3-none-macosx_11_0_arm64.whl | Python 3 | none | macOS 11.0+ ARM64 | Details |
Total release size: 40.6 MB
Release files / vantage_md-0.9.0-py3-none-musllinux_1_2_x86_64.whl
| Download URL | vantage_md-0.9.0-py3-none-musllinux_1_2_x86_64.whl |
|---|---|
| Size | 6.9 MB |
| Tags | Linux musl 1.2+ x86-64 Python 3 |
|
SHA-256 checksum How to use checksums |
07e0595db0d97dafb6d039ce55e7ef81436b2a729dcaad7f156b96fbd03a2bf5
|
|
BLAKE2b-256 checksum How to use checksums |
f72a1e268b95fd49a15214d2f273243abffe9af113f69db2409e2da4b7d091d8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.23 {"installer":{"name":"uv","version":"0.12.23","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / vantage_md-0.9.0-py3-none-musllinux_1_2_aarch64.whl
| Download URL | vantage_md-0.9.0-py3-none-musllinux_1_2_aarch64.whl |
|---|---|
| Size | 6.5 MB |
| Tags | Linux musl 1.2+ ARM64 Python 3 |
|
SHA-256 checksum How to use checksums |
0108da11c493027e1a39d13e97fb1cae1bf272505074c2cc99b52f1efbb7279e
|
|
BLAKE2b-256 checksum How to use checksums |
c325cbfa7dd686c30d8ff3de30a7dabbcad8ec12c9d1970bc5a34d095e012181
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.23 {"installer":{"name":"uv","version":"0.12.23","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / vantage_md-0.9.0-py3-none-manylinux_2_17_x86_64.whl
| Download URL | vantage_md-0.9.0-py3-none-manylinux_2_17_x86_64.whl |
|---|---|
| Size | 6.9 MB |
| Tags | Linux glibc 2.17+ x86-64 Python 3 |
|
SHA-256 checksum How to use checksums |
107cf20f401109d044070a0d54ae6488fcf80b3c2667b23822ebbe21b8cf4b6e
|
|
BLAKE2b-256 checksum How to use checksums |
8abfdbbe0b721b62b1d0509cf9430fadd0ee8d5f2e37faa389c46391a49c1a36
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.23 {"installer":{"name":"uv","version":"0.12.23","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / vantage_md-0.9.0-py3-none-manylinux_2_17_aarch64.whl
| Download URL | vantage_md-0.9.0-py3-none-manylinux_2_17_aarch64.whl |
|---|---|
| Size | 6.5 MB |
| Tags | Linux glibc 2.17+ ARM64 Python 3 |
|
SHA-256 checksum How to use checksums |
787aa8c9a7d164cd09e1999296277a10bf972133170c595833970bec0eb8c8c9
|
|
BLAKE2b-256 checksum How to use checksums |
577112f36349d3412ec6169bdee5d917af85d142a66667196cef3a61c355e95b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.23 {"installer":{"name":"uv","version":"0.12.23","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / vantage_md-0.9.0-py3-none-macosx_11_0_x86_64.whl
| Download URL | vantage_md-0.9.0-py3-none-macosx_11_0_x86_64.whl |
|---|---|
| Size | 7.0 MB |
| Tags | Python 3 macOS 11.0+ x86-64 |
|
SHA-256 checksum How to use checksums |
1e71f81bd2f04867a5d58f1d27dc3fdf533fc6309432d0165660566f89aa8cde
|
|
BLAKE2b-256 checksum How to use checksums |
33b14e8d55273f88590daad19e5f04cb1e61f5d1fc6316b021189e7a20a0a14f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.23 {"installer":{"name":"uv","version":"0.12.23","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / vantage_md-0.9.0-py3-none-macosx_11_0_arm64.whl
| Download URL | vantage_md-0.9.0-py3-none-macosx_11_0_arm64.whl |
|---|---|
| Size | 6.7 MB |
| Tags | Python 3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
b793b14268d1eb8184e5a778777ef94c261d950ab3a7ae2549b773863b8f232f
|
|
BLAKE2b-256 checksum How to use checksums |
22634e85fc9d0b2c96451400ca014934026d8175073511afb580f5c3cab1acc0
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.23 {"installer":{"name":"uv","version":"0.12.23","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|