MeshVault

MeshVault

Docker app from Darkmatter5's Repository

Overview

A self-hosted catalog for a 3D printing model collection. Indexes your model folders in place - files are never moved or renamed unless you 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. Supports STL and 3MF. Multi-user, with private collections and favorites per account. The first account you create becomes the administrator. Keep the /data volume on cache or an unassigned SSD: it holds a SQLite database, and SQLite over a network share is unreliable.

MeshVault

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:

  • Port80808080, TCP
  • Path/mnt/user/appdata/meshvault/data, Read/Write
  • Path — your models folder → /models, Read Only
  • VariableMeshVault__Libraries__0__Name = Models
  • VariableMeshVault__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

  1. 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.
  2. Registration closes automatically afterwards. Add people from Accounts, or re-open self-signup there if you prefer.
  3. 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.

Open the Apps tab on your Unraid server Search Community Apps for MeshVault Review the template variables and paths Click Install

Related apps

Explore more like this

Explore all

Details

Repository
ghcr.io/007darkmatter5/meshvault:latest
Last Updated2026-08-23
First Seen2026-08-21

Runtime arguments

Web UI
http://[IP]:[PORT:8080]/
Network
bridge
Shell
bash
Privileged
false

Template configuration

WebUI PortPorttcp

Port for the MeshVault web interface.

Target
8080
Default
8080
Value
8080
App DataPathrw

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
Model LibraryPathro

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
Library NameVariable

Name shown for the library above.

Target
MeshVault__Libraries__0__Name
Default
Models
Value
Models
Library PathVariable

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
Rescan Interval (hours)Variable

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
TimezoneVariable

Timezone for dates shown in the UI.

Target
TZ
Default
Etc/UTC
Value
Etc/UTC