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 +21 -0
- silmaril-0.1.0/MANIFEST.in +4 -0
- silmaril-0.1.0/PKG-INFO +175 -0
- silmaril-0.1.0/README.md +150 -0
- silmaril-0.1.0/app.py +5 -0
- silmaril-0.1.0/pyproject.toml +44 -0
- silmaril-0.1.0/setup.cfg +4 -0
- silmaril-0.1.0/silmaril/__init__.py +1294 -0
- silmaril-0.1.0/silmaril/static/script.js +265 -0
- silmaril-0.1.0/silmaril/static/style.css +463 -0
- silmaril-0.1.0/silmaril.egg-info/PKG-INFO +175 -0
- silmaril-0.1.0/silmaril.egg-info/SOURCES.txt +14 -0
- silmaril-0.1.0/silmaril.egg-info/dependency_links.txt +1 -0
- silmaril-0.1.0/silmaril.egg-info/entry_points.txt +2 -0
- silmaril-0.1.0/silmaril.egg-info/requires.txt +5 -0
- silmaril-0.1.0/silmaril.egg-info/top_level.txt +1 -0
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.
|
silmaril-0.1.0/PKG-INFO
ADDED
|
@@ -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)
|
silmaril-0.1.0/README.md
ADDED
|
@@ -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,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/*"]
|
silmaril-0.1.0/setup.cfg
ADDED