silmaril 0.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
silmaril-0.1.0/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Daniil Merkulov
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,4 @@
1
+ include LICENSE
2
+ include README.md
3
+ include app.py
4
+ recursive-include silmaril/static *
@@ -0,0 +1,175 @@
1
+ Metadata-Version: 2.4
2
+ Name: silmaril
3
+ Version: 0.1.0
4
+ Summary: Self-hosted, mobile-first web UI for browsing and editing Obsidian vaults
5
+ Author-email: Daniil Merkulov <bratishka.mipt@gmail.com>
6
+ License: MIT
7
+ Project-URL: Homepage, https://github.com/MerkulovDaniil/silmaril
8
+ Project-URL: Repository, https://github.com/MerkulovDaniil/silmaril
9
+ Keywords: obsidian,vault,viewer,markdown,notes,self-hosted
10
+ Classifier: Development Status :: 4 - Beta
11
+ Classifier: Framework :: FastAPI
12
+ Classifier: Intended Audience :: End Users/Desktop
13
+ Classifier: License :: OSI Approved :: MIT License
14
+ Classifier: Programming Language :: Python :: 3
15
+ Classifier: Topic :: Text Processing :: Markup :: Markdown
16
+ Requires-Python: >=3.10
17
+ Description-Content-Type: text/markdown
18
+ License-File: LICENSE
19
+ Requires-Dist: fastapi>=0.100.0
20
+ Requires-Dist: uvicorn>=0.20.0
21
+ Requires-Dist: python-frontmatter>=1.0.0
22
+ Requires-Dist: markdown>=3.4
23
+ Requires-Dist: pyyaml>=6.0
24
+ Dynamic: license-file
25
+
26
+ # Silmaril
27
+
28
+ A self-hosted, mobile-first web UI for browsing and editing Obsidian vaults from any device. Single Python file, zero config. Inspired by [notion4ever](https://github.com/MerkulovDaniil/notion4ever).
29
+
30
+ ```mermaid
31
+ graph LR
32
+ V[("📂 Your Vault")] --- S{{"⚡ silmaril"}}
33
+ S <-->|browse| P["📱 Phone"]
34
+ S <-->|search| D["🖥️ Desktop"]
35
+ S <-->|edit| L["💻 Laptop"]
36
+ ```
37
+
38
+ > **Your vault stays in one place. You access it from anywhere.**
39
+
40
+ ## Why?
41
+
42
+ 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.
43
+
44
+ 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.
45
+
46
+ 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.
47
+
48
+ ## Features
49
+
50
+ - **Markdown rendering** with full Obsidian flavor: `[[wiki-links]]`, `![[embeds]]`, callouts, highlights, checkboxes
51
+ - **KaTeX** math rendering (`$inline$` and `$$display$$`)
52
+ - **Obsidian Bases** (`.base` files) with cards, list, and table views
53
+ - **Iconic plugin** support with native icon editing (Lucide + emoji picker)
54
+ - **Cover images** from frontmatter (`banner`, `cover`, `image`)
55
+ - **Frontmatter badges** (status, tags) with color coding
56
+ - **Full-text search** with instant sidebar filtering and content snippets
57
+ - **Cards / List / Table views** for any directory
58
+ - **Clean URLs** — `/notes/ideas.md` not `/view/notes/ideas.md`
59
+ - **Mobile-first** responsive design
60
+ - **Edit and delete** notes in the browser (`?edit`, `?raw`)
61
+ - **Code blocks** with copy button
62
+ - **File tree** sidebar with collapsible folders
63
+
64
+ ## Installation
65
+
66
+ ```bash
67
+ pip install silmaril
68
+ ```
69
+
70
+ Then run:
71
+
72
+ ```bash
73
+ silmaril --vault /path/to/your/vault
74
+ ```
75
+
76
+ Open [http://localhost:8000](http://localhost:8000) in your browser.
77
+
78
+ ### From source
79
+
80
+ ```bash
81
+ git clone https://github.com/MerkulovDaniil/silmaril.git
82
+ cd silmaril
83
+ pip install .
84
+ silmaril --vault /path/to/your/vault
85
+ ```
86
+
87
+ Or run directly without installing:
88
+
89
+ ```bash
90
+ pip install fastapi uvicorn python-frontmatter markdown pyyaml
91
+ python app.py --vault /path/to/vault
92
+ ```
93
+
94
+ ## Configuration
95
+
96
+ ### CLI arguments
97
+
98
+ | Argument | Env variable | Default | Description |
99
+ |-----------|-------------|-------------|--------------------------------|
100
+ | `--vault` | `VAULT_ROOT`| `./vault` | Path to your Obsidian vault |
101
+ | `--host` | `VAULT_HOST`| `0.0.0.0` | Bind address |
102
+ | `--port` | `VAULT_PORT`| `8000` | Bind port |
103
+ | `--title` | `VAULT_NAME`| folder name | App title shown in the sidebar |
104
+
105
+ ### Config file
106
+
107
+ Place a `silmaril.yml` (or `silmaril.yaml`) in the working directory:
108
+
109
+ ```yaml
110
+ vault: /path/to/vault
111
+ host: 0.0.0.0
112
+ port: 8000
113
+ title: My Vault
114
+
115
+ favicon: https://example.com/icon.png
116
+ custom_css: "body { font-size: 18px; }"
117
+ pinch_zoom: true
118
+ readonly: false
119
+ hide:
120
+ - "_private/**"
121
+ - "*.tmp"
122
+ ```
123
+
124
+ **Priority**: CLI args > config file > environment variables > defaults.
125
+
126
+ ## Authentication
127
+
128
+ No built-in auth. Recommended options:
129
+
130
+ 1. **Cloudflare Access / Tunnel** — zero-trust, recommended for public hosting
131
+ 2. **Reverse proxy with basic auth** — nginx, caddy
132
+ 3. **Run locally** — `silmaril --host 127.0.0.1`
133
+
134
+ ## Deployment
135
+
136
+ ### systemd
137
+
138
+ ```ini
139
+ [Unit]
140
+ Description=Silmaril
141
+ After=network.target
142
+
143
+ [Service]
144
+ ExecStart=silmaril --vault /path/to/vault --port 8000
145
+ Restart=always
146
+
147
+ [Install]
148
+ WantedBy=multi-user.target
149
+ ```
150
+
151
+ ### Docker
152
+
153
+ ```dockerfile
154
+ FROM python:3.12-slim
155
+ WORKDIR /app
156
+ COPY pyproject.toml app.py ./
157
+ COPY silmaril/ silmaril/
158
+ RUN pip install --no-cache-dir .
159
+ EXPOSE 8000
160
+ CMD ["silmaril", "--vault", "/vault"]
161
+ ```
162
+
163
+ ```bash
164
+ docker run -v /path/to/vault:/vault -p 8000:8000 silmaril
165
+ ```
166
+
167
+ ## License
168
+
169
+ [MIT](LICENSE)
170
+
171
+ ## Credits
172
+
173
+ Inspired by [notion4ever](https://github.com/MerkulovDaniil/notion4ever). Built with [FastAPI](https://fastapi.tiangolo.com/), [python-frontmatter](https://github.com/eyeseast/python-frontmatter), and [KaTeX](https://katex.org/).
174
+
175
+ Author: [Daniil Merkulov](https://github.com/MerkulovDaniil)
@@ -0,0 +1,150 @@
1
+ # Silmaril
2
+
3
+ A self-hosted, mobile-first web UI for browsing and editing Obsidian vaults from any device. Single Python file, zero config. Inspired by [notion4ever](https://github.com/MerkulovDaniil/notion4ever).
4
+
5
+ ```mermaid
6
+ graph LR
7
+ V[("📂 Your Vault")] --- S{{"⚡ silmaril"}}
8
+ S <-->|browse| P["📱 Phone"]
9
+ S <-->|search| D["🖥️ Desktop"]
10
+ S <-->|edit| L["💻 Laptop"]
11
+ ```
12
+
13
+ > **Your vault stays in one place. You access it from anywhere.**
14
+
15
+ ## Why?
16
+
17
+ 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.
18
+
19
+ 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.
20
+
21
+ 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.
22
+
23
+ ## Features
24
+
25
+ - **Markdown rendering** with full Obsidian flavor: `[[wiki-links]]`, `![[embeds]]`, callouts, highlights, checkboxes
26
+ - **KaTeX** math rendering (`$inline$` and `$$display$$`)
27
+ - **Obsidian Bases** (`.base` files) with cards, list, and table views
28
+ - **Iconic plugin** support with native icon editing (Lucide + emoji picker)
29
+ - **Cover images** from frontmatter (`banner`, `cover`, `image`)
30
+ - **Frontmatter badges** (status, tags) with color coding
31
+ - **Full-text search** with instant sidebar filtering and content snippets
32
+ - **Cards / List / Table views** for any directory
33
+ - **Clean URLs** — `/notes/ideas.md` not `/view/notes/ideas.md`
34
+ - **Mobile-first** responsive design
35
+ - **Edit and delete** notes in the browser (`?edit`, `?raw`)
36
+ - **Code blocks** with copy button
37
+ - **File tree** sidebar with collapsible folders
38
+
39
+ ## Installation
40
+
41
+ ```bash
42
+ pip install silmaril
43
+ ```
44
+
45
+ Then run:
46
+
47
+ ```bash
48
+ silmaril --vault /path/to/your/vault
49
+ ```
50
+
51
+ Open [http://localhost:8000](http://localhost:8000) in your browser.
52
+
53
+ ### From source
54
+
55
+ ```bash
56
+ git clone https://github.com/MerkulovDaniil/silmaril.git
57
+ cd silmaril
58
+ pip install .
59
+ silmaril --vault /path/to/your/vault
60
+ ```
61
+
62
+ Or run directly without installing:
63
+
64
+ ```bash
65
+ pip install fastapi uvicorn python-frontmatter markdown pyyaml
66
+ python app.py --vault /path/to/vault
67
+ ```
68
+
69
+ ## Configuration
70
+
71
+ ### CLI arguments
72
+
73
+ | Argument | Env variable | Default | Description |
74
+ |-----------|-------------|-------------|--------------------------------|
75
+ | `--vault` | `VAULT_ROOT`| `./vault` | Path to your Obsidian vault |
76
+ | `--host` | `VAULT_HOST`| `0.0.0.0` | Bind address |
77
+ | `--port` | `VAULT_PORT`| `8000` | Bind port |
78
+ | `--title` | `VAULT_NAME`| folder name | App title shown in the sidebar |
79
+
80
+ ### Config file
81
+
82
+ Place a `silmaril.yml` (or `silmaril.yaml`) in the working directory:
83
+
84
+ ```yaml
85
+ vault: /path/to/vault
86
+ host: 0.0.0.0
87
+ port: 8000
88
+ title: My Vault
89
+
90
+ favicon: https://example.com/icon.png
91
+ custom_css: "body { font-size: 18px; }"
92
+ pinch_zoom: true
93
+ readonly: false
94
+ hide:
95
+ - "_private/**"
96
+ - "*.tmp"
97
+ ```
98
+
99
+ **Priority**: CLI args > config file > environment variables > defaults.
100
+
101
+ ## Authentication
102
+
103
+ No built-in auth. Recommended options:
104
+
105
+ 1. **Cloudflare Access / Tunnel** — zero-trust, recommended for public hosting
106
+ 2. **Reverse proxy with basic auth** — nginx, caddy
107
+ 3. **Run locally** — `silmaril --host 127.0.0.1`
108
+
109
+ ## Deployment
110
+
111
+ ### systemd
112
+
113
+ ```ini
114
+ [Unit]
115
+ Description=Silmaril
116
+ After=network.target
117
+
118
+ [Service]
119
+ ExecStart=silmaril --vault /path/to/vault --port 8000
120
+ Restart=always
121
+
122
+ [Install]
123
+ WantedBy=multi-user.target
124
+ ```
125
+
126
+ ### Docker
127
+
128
+ ```dockerfile
129
+ FROM python:3.12-slim
130
+ WORKDIR /app
131
+ COPY pyproject.toml app.py ./
132
+ COPY silmaril/ silmaril/
133
+ RUN pip install --no-cache-dir .
134
+ EXPOSE 8000
135
+ CMD ["silmaril", "--vault", "/vault"]
136
+ ```
137
+
138
+ ```bash
139
+ docker run -v /path/to/vault:/vault -p 8000:8000 silmaril
140
+ ```
141
+
142
+ ## License
143
+
144
+ [MIT](LICENSE)
145
+
146
+ ## Credits
147
+
148
+ Inspired by [notion4ever](https://github.com/MerkulovDaniil/notion4ever). Built with [FastAPI](https://fastapi.tiangolo.com/), [python-frontmatter](https://github.com/eyeseast/python-frontmatter), and [KaTeX](https://katex.org/).
149
+
150
+ Author: [Daniil Merkulov](https://github.com/MerkulovDaniil)
silmaril-0.1.0/app.py ADDED
@@ -0,0 +1,5 @@
1
+ """Thin wrapper so ``python app.py`` keeps working."""
2
+ from silmaril import app, main # noqa: F401
3
+
4
+ if __name__ == "__main__":
5
+ main()
@@ -0,0 +1,44 @@
1
+ [build-system]
2
+ requires = ["setuptools>=68.0", "wheel"]
3
+ build-backend = "setuptools.build_meta"
4
+
5
+ [project]
6
+ name = "silmaril"
7
+ version = "0.1.0"
8
+ description = "Self-hosted, mobile-first web UI for browsing and editing Obsidian vaults"
9
+ readme = "README.md"
10
+ license = {text = "MIT"}
11
+ requires-python = ">=3.10"
12
+ authors = [
13
+ { name = "Daniil Merkulov", email = "bratishka.mipt@gmail.com" },
14
+ ]
15
+ keywords = ["obsidian", "vault", "viewer", "markdown", "notes", "self-hosted"]
16
+ classifiers = [
17
+ "Development Status :: 4 - Beta",
18
+ "Framework :: FastAPI",
19
+ "Intended Audience :: End Users/Desktop",
20
+ "License :: OSI Approved :: MIT License",
21
+ "Programming Language :: Python :: 3",
22
+ "Topic :: Text Processing :: Markup :: Markdown",
23
+ ]
24
+ dependencies = [
25
+ "fastapi>=0.100.0",
26
+ "uvicorn>=0.20.0",
27
+ "python-frontmatter>=1.0.0",
28
+ "markdown>=3.4",
29
+ "pyyaml>=6.0",
30
+ ]
31
+
32
+ [project.urls]
33
+ Homepage = "https://github.com/MerkulovDaniil/silmaril"
34
+ Repository = "https://github.com/MerkulovDaniil/silmaril"
35
+
36
+ [project.scripts]
37
+ silmaril = "silmaril:main"
38
+
39
+ [tool.setuptools.packages.find]
40
+ where = ["."]
41
+ include = ["silmaril*"]
42
+
43
+ [tool.setuptools.package-data]
44
+ silmaril = ["static/*"]
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+