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.3.tar.gz (30.1 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.3-py3-none-any.whl (28.2 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: silmaril-0.1.3.tar.gz
  • Upload date:
  • Size: 30.1 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.3.tar.gz
Algorithm Hash digest
SHA256 ea48fb2c25d5f9f2bb2cba13be23d99b819d2deefd7e7a66c8b6e072a5b2708b
MD5 21bc0ed0220335017fb4c53bae7ce3b4
BLAKE2b-256 d47acf096da78b552cc95aa1efe0fb04e35b1a40a12e7e2cee236d945533630e

See more details on using hashes here.

Provenance

The following attestation bundles were made for silmaril-0.1.3.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.3-py3-none-any.whl.

File metadata

  • Download URL: silmaril-0.1.3-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.3-py3-none-any.whl
Algorithm Hash digest
SHA256 4ddabcc60c8de4f7b238bb2a79082da325d5bf94c307136df9689178c7ec55cb
MD5 4b7e013823347ee52e8f35d3ed2f4385
BLAKE2b-256 1f80484e16cf12cb8d1a6678ecd38911b3a3c8ee4ef9afc72acd9468439fe023

See more details on using hashes here.

Provenance

The following attestation bundles were made for silmaril-0.1.3-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