# Local Web Page Viewer
Opens local `.html` files in your vault as real rendered pages - CSS, images, and video all work, on desktop and mobile alike - instead of Obsidian refusing to display them at all.
[](https://buymeacoffee.com/miroff)
## Demo
### Desktop
**Rendering** - opening a `.html` file, zoom, page-native JS interactivity, following a link, opening and pinch/scroll-zooming an image, playing video in the in-app player.
**Settings** - pinning/unpinning toolbar actions, reordering them, resetting.
### Mobile
**Viewing** - Fit to width, playing video, following a link.
**Bookmarks** - opening the Bookmarks menu, jumping to a saved spot, managing bookmarks.
## Why another HTML viewer plugin?
Obsidian doesn't render `.html` files - clicking one in the file explorer either does nothing useful or opens "unsupported file type." A common case: exporting a Telegram channel via Telegram Desktop produces `messages.html` plus `css/`, `images/`, `js/`, `photos/`, `video_files/` - a real static page, just sitting in your vault, unreadable from inside Obsidian.
Two existing approaches were tried and ruled out during development, for concrete, observed reasons - not just guesswork:
- **"HTML Reader"-style plugins** (inject the file's contents into an `iframe`/`srcdoc` without inlining its CSS) run straight into Obsidian's own Content-Security-Policy, which restricts `style-src` to `'self'` - an external stylesheet link inside that context gets silently blocked, so the page renders unstyled. Observed directly while comparing plugins during development: a real CSP violation in Obsidian's own console, naming exactly this.
- **A local-HTTP-server approach** (spin up `http://127.0.0.1:PORT` and point an iframe at it) genuinely works around Obsidian's restrictions, but by its own documentation is **desktop-only** - it needs Node's `http` module, which doesn't exist in Obsidian's mobile (Capacitor) runtime at all. Telegram exports are exactly the kind of thing you'd want to read on your phone.
Local Web Page Viewer takes a third path: no local server, no unstyled DOM injection. It reads the HTML, rewrites every relative resource reference (CSS, images, scripts) to a real vault resource path, inlines stylesheets as `