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.2.0.tar.gz (31.0 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.2.0-py3-none-any.whl (29.0 kB view details)

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for silmaril-0.2.0.tar.gz
Algorithm Hash digest
SHA256 132150b60a55c6abf7835f399e1111afb2cd03ca2382906143e45f1e9cc26f13
MD5 e8cd34f5e5a087a6fcc1b4af0f41ea14
BLAKE2b-256 718a6b9d094f3d9256e21f694d8d6c2690549e5b48f6a162817ef405c18411c0

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: silmaril-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 29.0 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.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 b6a683f0f1117855a7e8bbbb8e2dfb1323a9b3141a55286c57589eb8c3ca3008
MD5 e9e7a1ff87fd3faa8fbc348982cab90f
BLAKE2b-256 a2008b791477fa3ea0dcbde21765020c764972fe96a283e0fa704b2e013beb3d

See more details on using hashes here.

Provenance

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