Obviewer is a native macOS reader for local Obsidian vaults built around one non-negotiable promise: the app must remain read-only with respect to the user's notes.
The project is already a working prototype, not just a sketch. It has a portable core, a macOS app shell, a reader-first interface, a graph workspace, a generated demo vault, documentation screenshots, and green GitHub CI. It is not yet a fully shipped consumer app because signed/notarized app distribution, parser fidelity, accessibility, and large-vault performance still need dedicated modernization work.
QUICKSTART.mdfor the fastest local rundocs/VISUAL_TOUR.mdfor the current UI and design languagedocs/README.mdfor the zero-memory documentation indexdocs/HANDOFF.mdfor the current project state and maintainer contextdocs/MODERNIZATION_PLAN.mdfor the phased roadmap to turn the prototype into a modern shipping product
- Native SwiftUI macOS app shell with
NavigationSplitView - Portable
ObviewerCoremodule for parsing, lookup, vault indexing, and graph construction - macOS-specific
ObviewerMacAppmodule for security-scoped access, bookmarks, app state, and UI - Local vault loading with progress reporting, live vault watching, and path-aware selective reloads
- Warm-start snapshot cache that reuses parsed notes and attachment metadata across relaunches when files are unchanged
- Search by title, path, tags, preview text, aliases, and frontmatter metadata through a core precomputed search index
- Obsidian-aware parsing for frontmatter, links, tables, headings, ordered/task/nested lists, footnotes, tags, callouts, image embeds, and graceful fallback blocks for Mermaid/math/media embeds
- Inline image rendering with size hints plus a lightbox for image attachments
- Reader workspace with metadata, linked-note navigation, and a contents rail
- Graph workspace with local and global graph views
- Rich synthetic-vault tooling for realistic manual testing
- Large-vault benchmark tooling with index diagnostics for cold load, warm reload, selective reload, search, and graph query profiling
- CI benchmark profiling for smoke and integration fixtures, with the smoke profile enforced by a checked-in budget
- Documentation screenshot generation from the real app
- Green CI on
macos-14andmacos-15
The UI being "view only" is not enough. The guarantee comes from platform boundaries and the code structure:
- The shipping app must run with App Sandbox enabled.
- The app must request only
com.apple.security.files.user-selected.read-only. - Vault access must come from user-selected folders, not broad filesystem exceptions.
- Vault reads must flow through the reader layer, with no write API.
- Release packaging must preserve the sandbox entitlements through code signing.
The current entitlement baseline lives in Configuration/Obviewer.entitlements.
The shortest local trial path is:
git clone https://github.com/felizvida/obviewer.git
cd obviewer
make try-localIf you want a realistic vault without touching your own notes:
make demo-vaultThat generates build/SampleVault, which includes nested folders, duplicate filenames, shared and local attachments, tags, tables, links, images, and graph-friendly note relationships.
If you want a repeatable performance read on the synthetic large-vault path:
make benchmark-vaultThat runs the benchmark fixture profile and prints index diagnostics plus timings for cold load, warm reload, selective reload, search, and graph queries.
For the same path that CI enforces, use:
PROFILE=smoke BUDGET=Configuration/benchmark-smoke-budget.json make benchmark-vaultCI also publishes smoke and integration benchmark artifacts on every run, and each job now writes a readable benchmark summary directly into the GitHub Actions run page.
Today the GitHub release workflow always publishes source archives and checksums. It is now also prepared to publish a signed .dmg once Apple signing and notarization secrets are configured in GitHub.
The Phase 1 distribution foundation now includes:
project.ymlfor XcodeGen app-project generationscripts/build_app.shfor signed app buildsscripts/notarize_release_app.shfor app notarization and staplingscripts/package_release_app.shfor signed release zip packagingscripts/package_release_dmg.shfor signed DMG packaging, with optional notarization.github/workflows/release.ymlfor tag-driven release automation that can publish a signed/notarized DMG when secrets are present
The next distribution milestone is to configure the Apple credentials in GitHub and validate the first fully notarized public download.
The codebase is split into three primary targets:
ObviewerCorePortable models and services for notes, attachments, parser output, graph data, and vault indexingObviewerMacAppmacOS app state, platform integrations, SwiftUI/AppKit views, and documentation renderingObviewerThin executable entry point that launches the app
This separation keeps the vault and parser logic easier to test, debug, and eventually reuse in another shell.
The project should modernize in this order:
- Ship the production-grade app container and distribution path
- Upgrade markdown and Obsidian fidelity without weakening the read-only boundary
- Deepen live refresh into truly change-aware indexing, caching, and large-vault performance work
- Deepen navigation, graph, media, and accessibility polish
- Add observability and maintenance workflows that keep the project healthy over time
The detailed roadmap is in docs/MODERNIZATION_PLAN.md.
- CI runs on pushes to
mainandcodex/**, on pull requests, and on manual dispatch - Releases are tag-driven through
.github/workflows/release.yml - The repo includes issue templates, CODEOWNERS, contribution guidance, and security/support docs
- The current release line is green after
v0.2.5
This repository is licensed under Apache 2.0. See LICENSE.
