Skip to content

Repository files navigation

VaultView

A secure, read-only web viewer for Obsidian vaults. Browse your notes, kanban boards, task databases, and media from any browser without opening Obsidian.

Features

Core

  • Markdown rendering — full CommonMark + Obsidian extensions: wikilinks, [[embeds]], tags, task lists, strikethrough, fenced code blocks with syntax highlighting
  • Frontmatter properties panel — all YAML frontmatter fields displayed with wikilink resolution
  • Wikilink navigation[[Note Name]] and [[Note|Alias]] links resolve to real pages; broken links shown distinctly
  • Sidebar tree — collapsible folder tree for the full vault; active note highlighted
  • Full-text search — instant client-side search across all note titles
  • EPUB viewer — built-in reader for .epub files
  • Attachment serving — images, audio, video, PDFs, and other attachments embedded inline
  • Local and remote modes — read directly from the filesystem (NOTES_MODE=local) or from a CouchDB instance synced via Obsidian LiveSync (NOTES_MODE=remote)

Screenshot

Obsidian Plugin Support

Kanban Plugin

Notes with kanban-plugin: true in their frontmatter are rendered as read-only kanban boards, with columns parsed from ## Heading sections and cards from list items. Checked ([x]) and unchecked ([ ]) states are preserved.

Obsidian Bases (.base files)

.base database files are parsed and rendered as filterable, sortable tables. Supported features:

  • Obsidian filter expression syntax (file.hasTag(), contains(), and/or conditions, etc.)
  • Column ordering from the view's order field
  • Sort by any property, ascending or descending
  • Per-view filter merging (global + view-level)
  • Field-aware cell rendering: status, priority, due/scheduled dates, contexts, projects, and tags columns all display with visual styling

TaskNotes Plugin

Individual task notes (.md files created by the TaskNotes plugin) are auto-detected by their frontmatter and rendered as structured task cards instead of plain notes.

Detection — a note is treated as a task if its frontmatter contains any of the following distinctive fields, or contains status paired with at least one task-related field:

Distinctive (any one triggers)Paired with status
timeEntries, timeEstimate, recurrence, complete_instancesdue, scheduled, priority, contexts, projects, blockedBy, completedDate

Task card — rendered with:

  • Status badge — colour-coded pill (blue = open, yellow = in-progress, green = done, muted = cancelled, purple = waiting/blocked)
  • Priority badge — ⚡ urgent · ↑ high · → medium · ↓ low, each in its own colour
  • Metadata rows — due date, scheduled date, contexts (as #tag chips), projects (as resolved wikilinks), time estimate (auto-formatted from minutes), recurrence, blocked-by, completed date, time logged (summed from timeEntries start/end timestamps)
  • Tags — frontmatter tags rendered as chips
  • Additional properties — any extra frontmatter fields not listed above, with wikilink resolution
  • Note body — the markdown content below the frontmatter, rendered normally

Overdue due/scheduled dates are highlighted in red with a ⚠ indicator when the task is not yet done or cancelled.

TaskNotes Kanban View (kanban-default.base)

.base files with type: tasknotesKanban are rendered as a full kanban board instead of a table:

  • Columns are grouped by groupBy.property (typically status) and sorted alphabetically — matching Obsidian's board behaviour
  • Each card shows: a status circle indicator, a priority dot, the task title (linked, with strikethrough for done/cancelled), and configured metadata rows (dates with overdue callout, @context chips, #tag chips, project links)
  • Column headers show the group value with its status accent colour and a task count

Excalidraw Plugin (.excalidraw / .excalidraw.md files)

Drawing files created by the Obsidian Excalidraw plugin are rendered as fully interactive, read-only vector drawings using the Excalidraw library (loaded from CDN at runtime). Both standalone .excalidraw files and Obsidian's double-extension .excalidraw.md wrapper format are supported, including LZ-string compressed drawing data.

  • Full-page viewer — navigating to a drawing opens a dedicated full-canvas viewer; the drawing is automatically fitted to the viewport on load
  • Inline embeds![[drawing.excalidraw]] in a markdown note renders the drawing as an embedded iframe panel, matching the style of other embeds
  • Download — the original .excalidraw file can be downloaded from the toolbar

Zoom & pan controls:

ControlAction
Scroll wheelPan canvas
Ctrl + scrollZoom in / out
Left-click dragPan canvas
Middle-click dragPan canvas
+ / - keysZoom in / out
0 keyReset zoom to 100%
Shift + 1Fit drawing to screen
⊡ Fit buttonFit drawing to screen
/ + toolbar buttonsStep zoom out / in

A ? button in the toolbar shows the full shortcut reference at any time.

Note: The Excalidraw viewer requires an internet connection on first load to fetch React and the Excalidraw library from esm.sh. Subsequent renders are cached by the browser.

TaskNotes Calendar View (calendar-default.base)

.base files with type: tasknotesCalendar are rendered as an interactive monthly calendar:

  • Filtered tasks are placed on their due date (solid chip) and/or scheduled date (outlined chip), respecting the view's showDue and showScheduled options
  • Task chips are colour-coded by status and link directly to the task note
  • Done/cancelled tasks are shown faded with strikethrough
  • Today is highlighted with a coloured border and circled day number
  • Past days are dimmed
  • Prev / Next / Today buttons navigate months instantly in the browser — no page reload
  • firstDay option (0 = Sunday, 1 = Monday) is respected from the view config

Security

  • Password authentication with brute-force protection (10 failed attempts → 15-minute lockout)
  • HMAC constant-time password comparison to prevent timing attacks
  • Strict Content Security Policy, X-Frame-Options: SAMEORIGIN, X-Content-Type-Options, and other hardening headers
  • Session cookies: HttpOnly, SameSite=Lax, optionally Secure (set VAULT_HTTPS=true)
  • Configurable session lifetime (default 7 days)

Quick Start

Python (local)

git clone <repo>cd VaultView
python -m venv venv &&source venv/bin/activate
pip install -r requirements.txt
cp example.env .env
# Edit .env: set VAULT_USERNAME, VAULT_PASSWORD, and VAULT_PATH
python app.py /path/to/your/vault

Open http://localhost:5000.

Docker

git clone <repo>cd VaultView
cp example.env .env
# Edit .env: set VAULT_USERNAME, VAULT_PASSWORD, FLASK_SECRET_KEY, and VAULT_PATH
docker compose up -d

Open http://localhost:5000.

To use remote / LiveSync mode with CouchDB, swap the active service in docker-compose.yml (see the comments inside the file) and set the COUCHDB_* variables in your .env.

Configuration

All configuration is via environment variables (or a .env file — copy example.env to get started).

VariableRequiredDefaultDescription
VAULT_USERNAMEYesLogin username
VAULT_PASSWORDYesLogin password
FLASK_SECRET_KEYNorandomSecret for session signing — set this to keep sessions across restarts
NOTES_MODENolocallocal or remote (CouchDB)
VAULT_PATHNo.Path to vault directory (local mode)
COUCHDB_URLNohttp://127.0.0.1:5984CouchDB URL (remote mode)
COUCHDB_DBNoobsidianCouchDB database name (remote mode)
COUCHDB_USERNoCouchDB username (remote mode)
COUCHDB_PASSWORDNoCouchDB password (remote mode)
VAULT_HTTPSNofalseSet true to enable the Secure cookie flag when behind HTTPS
VAULT_SESSION_DAYSNo7Session lifetime in days
PORTNo5000Host port to expose (Docker Compose only)

CLI Options

python app.py [vault_path] [--title "My Notes"] [--host 0.0.0.0] [--port 5000]

Supported File Types

ExtensionRendered as
.mdMarkdown note, TaskNotes card, or Kanban board
.baseDatabase table, TaskNotes Kanban board, or TaskNotes Calendar
.epubBuilt-in EPUB reader
.excalidrawInteractive read-only Excalidraw drawing viewer
Images, video, audioInline embed
PDF, Office docs, archivesDownload / pass-through

Dependencies

PackagePurpose
flaskWeb framework
gunicornProduction WSGI server
markdownMarkdown rendering
python-frontmatterYAML frontmatter parsing
pyyaml.base file parsing
pymdown-extensionsTask lists, strikethrough, fenced code (recommended)
python-dotenv.env file loading (recommended)

About

Small python server to view your Obsidian Vault.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Contributors

Languages