Skip to main content

Self-hosted, mobile-first web UI for browsing and editing Obsidian vaults

Project description

Silmaril

💎 A self-hosted, mobile-first web UI for browsing and editing Obsidian vaults from any device. Single Python file, zero config. Inspired by notion4ever.

graph LR
    V[("📂 Your Vault")] --- S{{"⚡ silmaril"}}
    S <-->|browse| P["📱 Phone"]
    S <-->|search| D["🖥️ Desktop"]
    S <-->|edit| L["💻 Laptop"]

Your vault stays in one place. You access it from anywhere.

Why?

If your vault lives on a VPS or a desktop machine and you want to access it from your phone or any browser — this is for you. All my attempts to sync vaults across devices (Remotely Save, third-party sync plugins) kept failing with conflicts and silent data loss. Obsidian Sync works, but costs money and requires the app on every device.

Silmaril takes a different approach: your vault stays in one place, you access it from anywhere. Point it at a directory, open a URL — browse, search, edit. It just works.

It renders most of what Obsidian renders: wiki-links, embeds, callouts, KaTeX math, frontmatter properties, cover images, Bases, Iconic plugin icons. It won't replace Obsidian for heavy workflows with lots of plugins or complex Dataview queries, but for reading, quick edits, and staying on top of your notes from a phone — it's a lifesaver.

Features

  • Markdown rendering with full Obsidian flavor: [[wiki-links]], ![[embeds]], callouts, highlights, checkboxes
  • KaTeX math rendering ($inline$ and $$display$$)
  • Obsidian Bases (.base files) with cards, list, and table views
  • Iconic plugin support with native icon editing (Lucide + emoji picker)
  • Cover images from frontmatter (banner, cover, image)
  • Frontmatter badges (status, tags) with color coding
  • Full-text search with instant sidebar filtering and content snippets
  • Cards / List / Table views for any directory
  • Clean URLs/notes/ideas.md not /view/notes/ideas.md
  • Mobile-first responsive design
  • Edit and delete notes in the browser (?edit, ?raw)
  • Code blocks with copy button
  • File tree sidebar with collapsible folders

Installation

pip install silmaril

Then run:

silmaril --vault /path/to/your/vault

Open http://localhost:8000 in your browser.

From source

git clone https://github.com/MerkulovDaniil/silmaril.git
cd silmaril
pip install .
silmaril --vault /path/to/your/vault

Or run directly without installing:

pip install fastapi uvicorn python-frontmatter markdown pyyaml
python app.py --vault /path/to/vault

Configuration

CLI arguments

Argument Env variable Default Description
--vault VAULT_ROOT ./vault Path to your Obsidian vault
--host VAULT_HOST 0.0.0.0 Bind address
--port VAULT_PORT 8000 Bind port
--title VAULT_NAME folder name App title shown in the sidebar

Config file

Place a silmaril.yml (or silmaril.yaml) in the working directory:

vault: /path/to/vault
host: 0.0.0.0
port: 8000
title: My Vault

favicon: https://example.com/icon.png
custom_css: "body { font-size: 18px; }"
pinch_zoom: true
readonly: false
hide:
  - "_private/**"
  - "*.tmp"

Priority: CLI args > config file > environment variables > defaults.

Authentication

No built-in auth. Recommended options:

  1. Cloudflare Access / Tunnel — zero-trust, recommended for public hosting
  2. Reverse proxy with basic auth — nginx, caddy
  3. Run locallysilmaril --host 127.0.0.1

Deployment

systemd

[Unit]
Description=Silmaril
After=network.target

[Service]
ExecStart=silmaril --vault /path/to/vault --port 8000
Restart=always

[Install]
WantedBy=multi-user.target

Docker

FROM python:3.12-slim
WORKDIR /app
COPY pyproject.toml app.py ./
COPY silmaril/ silmaril/
RUN pip install --no-cache-dir .
EXPOSE 8000
CMD ["silmaril", "--vault", "/vault"]
docker run -v /path/to/vault:/vault -p 8000:8000 silmaril

License

MIT

Credits

Inspired by notion4ever. Built with FastAPI, python-frontmatter, and KaTeX.

Author: Daniil Merkulov

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

silmaril-0.1.4.tar.gz (30.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

silmaril-0.1.4-py3-none-any.whl (28.2 kB view details)

Uploaded Python 3

File details

Details for the file silmaril-0.1.4.tar.gz.

File metadata

  • Download URL: silmaril-0.1.4.tar.gz
  • Upload date:
  • Size: 30.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for silmaril-0.1.4.tar.gz
Algorithm Hash digest
SHA256 b5bcf0aaac4c9f6c574cc9fc635924c97ab6ce548f179824c1643997f3720314
MD5 7b35b246d3878d44d9e276aab1ea6c6e
BLAKE2b-256 a7361b6cde79d0afec365aab2b247e5a486c4962c13754b3b53a65b5d169f620

See more details on using hashes here.

Provenance

The following attestation bundles were made for silmaril-0.1.4.tar.gz:

Publisher: publish.yml on MerkulovDaniil/silmaril

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file silmaril-0.1.4-py3-none-any.whl.

File metadata

  • Download URL: silmaril-0.1.4-py3-none-any.whl
  • Upload date:
  • Size: 28.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for silmaril-0.1.4-py3-none-any.whl
Algorithm Hash digest
SHA256 71e40890ceb2b4e615eee4022aa8b5da326601fdac704d8ff3286cc8ba8703fc
MD5 2ccb826d63e45f4914fe3df73f5e0be3
BLAKE2b-256 eed370e655bf8b5bff726eb9d1eaf44220fbb09ce50b8c7e6100dbb88c987012

See more details on using hashes here.

Provenance

The following attestation bundles were made for silmaril-0.1.4-py3-none-any.whl:

Publisher: publish.yml on MerkulovDaniil/silmaril

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page