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 (
.basefiles) 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.mdnot/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
theme: Things # any Obsidian community theme by name
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.
Themes
Silmaril supports all 416 Obsidian community themes out of the box. Just set the theme name in your config:
theme: Things
The CSS is fetched from GitHub on first launch and cached locally in ~/.cache/silmaril/themes/.
Some popular themes to try:
| Theme | Style |
|---|---|
Things |
Clean, minimal, Apple-inspired |
Obsidian Nord |
Nord color palette |
Obsidian gruvbox |
Retro groove colors |
Dracula for Obsidian |
Dark purple Dracula |
Atom |
Atom editor look |
Solarized |
Ethan Schoonover's palette |
80s Neon |
Synthwave vibes |
Notation |
Bear app inspired |
Without a theme setting, Silmaril uses Obsidian's default theme colors.
Authentication
No built-in auth. Recommended options:
- Cloudflare Access / Tunnel — zero-trust, recommended for public hosting
- Reverse proxy with basic auth — nginx, caddy
- Run locally —
silmaril --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
Credits
Inspired by notion4ever. Built with FastAPI, python-frontmatter, and KaTeX.
Author: Daniil Merkulov
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file silmaril-0.3.1.tar.gz.
File metadata
- Download URL: silmaril-0.3.1.tar.gz
- Upload date:
- Size: 33.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
54a6dad668038a242fca46e74a9097abefa940cab44bc50962850c8c369a4780
|
|
| MD5 |
cdbdbb23ed036953698795d96acf3117
|
|
| BLAKE2b-256 |
5aa178a6a552e570a65b1485c217bcb30ac334490c109d3dd555fe546e25b72b
|
Provenance
The following attestation bundles were made for silmaril-0.3.1.tar.gz:
Publisher:
publish.yml on MerkulovDaniil/silmaril
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
silmaril-0.3.1.tar.gz -
Subject digest:
54a6dad668038a242fca46e74a9097abefa940cab44bc50962850c8c369a4780 - Sigstore transparency entry: 1107807689
- Sigstore integration time:
-
Permalink:
MerkulovDaniil/silmaril@31fd8a4e75064d4ad82d9ec9de6ff923f1b3b4b7 -
Branch / Tag:
refs/tags/v0.3.1 - Owner: https://github.com/MerkulovDaniil
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@31fd8a4e75064d4ad82d9ec9de6ff923f1b3b4b7 -
Trigger Event:
push
-
Statement type:
File details
Details for the file silmaril-0.3.1-py3-none-any.whl.
File metadata
- Download URL: silmaril-0.3.1-py3-none-any.whl
- Upload date:
- Size: 31.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
53cef6e44c363449e877e0572e48057285a5733e4b9d4df852f3855877cb956b
|
|
| MD5 |
3792021576ccff431026d84c3c254e3d
|
|
| BLAKE2b-256 |
8ce14fba6318f4a06189ad60890f9f9d3b0a959f86fd6fdc89a5eb7aeb0e16a5
|
Provenance
The following attestation bundles were made for silmaril-0.3.1-py3-none-any.whl:
Publisher:
publish.yml on MerkulovDaniil/silmaril
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
silmaril-0.3.1-py3-none-any.whl -
Subject digest:
53cef6e44c363449e877e0572e48057285a5733e4b9d4df852f3855877cb956b - Sigstore transparency entry: 1107807691
- Sigstore integration time:
-
Permalink:
MerkulovDaniil/silmaril@31fd8a4e75064d4ad82d9ec9de6ff923f1b3b4b7 -
Branch / Tag:
refs/tags/v0.3.1 - Owner: https://github.com/MerkulovDaniil
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@31fd8a4e75064d4ad82d9ec9de6ff923f1b3b4b7 -
Trigger Event:
push
-
Statement type: