All apps · 0 apps
MeshVault
Docker app from Darkmatter5's Repository
Overview
Readme
View on GitHubMeshVault
A self-hosted catalog for a 3D printing model collection.
It indexes your model folders in place — files are never moved or renamed unless you explicitly allow it — and adds search, tags, collections, designers, source links, per-model notes, rendered thumbnails, and an in-browser 3D preview you can rotate and snapshot as the card image.
Built with .NET 10, Blazor Server, MudBlazor, EF Core and SQLite. No GPU, no native imaging libraries, no external services.
Running it on Unraid
The old Template Repositories field on the Docker tab is gone — it was deprecated in favour of Community Applications. Until this is listed there, add the container by hand.
By hand
Docker tab → Add Container → turn on Advanced View:
| Field | Value |
|---|---|
| Name | MeshVault |
| Repository | ghcr.io/007darkmatter5/meshvault:latest |
| Network Type | Bridge |
| WebUI | http://[IP]:[PORT:8080]/ |
Then add:
- Port —
8080→8080, TCP - Path —
/mnt/user/appdata/meshvault→/data, Read/Write - Path — your models folder →
/models, Read Only - Variable —
MeshVault__Libraries__0__Name=Models - Variable —
MeshVault__Libraries__0__Path=/models
Apply, then open the WebUI and create the first account — it becomes the administrator. Unraid saves this as a user template, so later edits are one click.
Via Community Applications
templates/meshvault.xml and ca_profile.xml are ready for submission at
ca.unraid.net/submit. Once accepted, MeshVault installs
from the Apps tab with the paths and variables pre-filled.
Or with compose
git clone https://github.com/007darkmatter5/meshvault.git
cd meshvault
# edit docker-compose.yml: set your library path
docker compose up -d
Two things worth getting right
Keep /data on local storage. It holds a SQLite database. SQLite over SMB or NFS
is unreliable and will eventually corrupt. Cache drive or an unassigned SSD.
Back up /data. Your models are safe on the array regardless, but everything
MeshVault knows about them — tags, collections, designers, notes, favorites, chosen
preview images — lives only there.
Library speed matters more than you'd expect. Building previews reads every model once. On a fast local share that is minutes; over a slow link it can be hours. It runs in the background, steps aside whenever you are using the app, and can be paused from the Libraries page.
First run
- Open the web UI. It will say nobody has claimed it — create the first account, which becomes the administrator and takes ownership of anything already indexed.
- Registration closes automatically afterwards. Add people from Accounts, or re-open self-signup there if you prefer.
- The library scans, then previews build in the background.
If your models came out of Manyfold, hit Import on the
Libraries page: it reads each datapackage.json and fills in real titles, tags,
collections and designers. It never overwrites anything you have set by hand.
Configuration
Every setting can be supplied as an environment variable using __ for nesting.
| Variable | Default | What it does |
|---|---|---|
MeshVault__DataPath |
/data |
Database, thumbnails, preview cache, sign-in keys |
MeshVault__Libraries__0__Name |
— | Display name for the first library |
MeshVault__Libraries__0__Path |
— | Path to it inside the container |
MeshVault__Libraries__0__AllowOrganize |
false |
Let MeshVault move and rename files |
MeshVault__ScanOnStartup |
true |
Scan libraries when the app starts |
MeshVault__RescanIntervalHours |
12 |
Skip that scan if one ran this recently |
Behind a reverse proxy
Forwarded headers are honoured, so SWAG, Nginx Proxy Manager and Traefik work without extra configuration. Terminate TLS at the proxy and forward to port 8080.
Development
dotnet run --project src/MeshVault.Web
dotnet test
| Project | Purpose |
|---|---|
src/MeshVault.Core |
Domain model, filesystem scanning, mesh parsing, software renderer |
src/MeshVault.Data |
EF Core, indexing, catalog queries, metadata import |
src/MeshVault.Web |
Blazor UI, authentication, background workers, HTTP endpoints |
tests/MeshVault.Tests |
176 tests |
How some of it works
Scanning. A folder becomes a model when it directly contains a mesh or CAD file. Subfolders without models of their own (photos, docs) are absorbed into it. Rescans reconcile rather than rebuild, so tags, notes and favorites stay attached across scans.
Thumbnails are rendered by a software rasteriser — z-buffer, supersampling, PNG
written via ZLibStream — so there is no GPU or native imaging dependency and the
container stays slim.
The 3D viewer receives quantised 16-bit positions rather than the original file (18 bytes per triangle against 50 in a binary STL), decimated by vertex clustering when a model exceeds the triangle budget. Payloads are cached, so opening a model is a local read rather than a trip to the library share.
Accounts. The first is the administrator; registration then closes. Collections and favorites are per-user. The last administrator cannot be demoted, suspended or deleted.
Licence
MIT. See LICENSE.
Install MeshVault on Unraid in a few clicks.
Find MeshVault in Community Apps on your Unraid server, review the template, and click Install. Unraid handles the Docker app or plugin setup from the published template.
Categories
Related apps
Explore more like this
Explore allDetails
ghcr.io/007darkmatter5/meshvault:latestRuntime arguments
- Web UI
http://[IP]:[PORT:8080]/- Network
bridge- Shell
bash- Privileged
- false
Template configuration
Port for the MeshVault web interface.
- Target
- 8080
- Default
- 8080
- Value
- 8080
Database, thumbnails, 3D preview cache and sign-in keys. Put this on cache or an SSD - SQLite over a network share is unreliable. Back it up: it holds your tags, collections and notes.
- Target
- /data
- Default
- /mnt/user/appdata/meshvault
- Value
- /mnt/user/appdata/meshvault
Your 3D model folder. Mounted read-only by default so MeshVault can never touch your files. Change to rw only if you want it to organise them for you.
- Target
- /models
- Default
- /mnt/user/models
- Value
- /mnt/user/models
Name shown for the library above.
- Target
- MeshVault__Libraries__0__Name
- Default
- Models
- Value
- Models
Path inside the container for the library. Leave as /models unless you changed the mount above.
- Target
- MeshVault__Libraries__0__Path
- Default
- /models
- Value
- /models
Skip the startup scan if the library was scanned this recently. A full walk of a large library takes minutes. Set to 0 to always rescan on start.
- Target
- MeshVault__RescanIntervalHours
- Default
- 12
- Value
- 12
Timezone for dates shown in the UI.
- Target
- TZ
- Default
- Etc/UTC
- Value
- Etc/UTC