Materializr
Open-source parametric 3D CAD for makers — constraint sketches, solid modeling, threads, SVG & text engraving, STL/STEP export. Android, iPad, Linux, Mac, Windows. Vibe coded.
Browse a library of 3D-printable models in your browser.
Translation pending
DesignTypeScript · ShellGitHub @ConfusedSkyOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Local browser for a 3D-print model library: orbitable thumbnail grid, semantic search, open-in-slicer. Bun · Hono · React · three.js
Taken from the repository README
Loading the full README. The saved excerpt is shown below.
A local browser for a 3D-print model library. Point it at a directory tree full of
STL/3MF/OBJ files (zips included) and it gives you a thumbnail grid you can orbit,
search, and send to your slicer.
Open http://localhost:5173 and type an absolute path to your model library in the
path bar. That's it — thumbnails render in the background and cache to
~/.cache/model-browser/.Read the full README ↗Live demo: models.masamaeda.com
A local browser for a 3D-print model library. Point it at a directory tree full of STL/3MF/OBJ files (zips included) and it gives you a thumbnail grid you can orbit, search, and send to your slicer.
bun install
bun run dev # server on 127.0.0.1:3177, UI on http://localhost:5173
Open http://localhost:5173 and type an absolute path to your model library in the
path bar. That's it — thumbnails render in the background and cache to
~/.cache/model-browser/.
pack.zip!/part.stl).The context menu offers "open in …" for every application your OS associates with the model's type (STL/3MF/OBJ), default first. It reads your desktop-entry registry — there is no in-app slicer configuration:
Pin a default: xdg-mime default lycheeslicer.desktop model/stl, or use any
"always open with" affordance your desktop has.
Slicer missing from the menu? Its desktop entry probably doesn't declare
model types. Drop a corrected entry in ~/.local/share/applications/ — a
ten-line file. Example (photon-workshop.desktop for a Wine-installed slicer):
[Desktop Entry]
Type=Application
Name=Photon Workshop
Exec=wine start /ProgIDOpen PhotonWorkShop %f
MimeType=model/stl;
"Open with…" hands the file to a chooser command of your choice (e.g. a
rofi picker). Configure it in ~/.config/model-browser/launch.json; the menu
item is hidden until you do:
{
"chooser": ["/home/you/bin/open-with", "{file}"]
}
The same file can override any launch operation with an argv template
({mime}, {appId}, {file} placeholders; no shell involved) — see
docs/platform-surface.md for the operations and their contracts. Linux is the
implemented platform; the doc sketches what Windows/macOS ports would swap in.
The server must run inside your graphical session (it launches GUI apps on your
display) — starting bun run dev from a normal terminal is exactly that.
A separate embedding service (SigLIP) answering on port 8077 adds three things, all from the same index — the UI calls it meaning search:
The service is mini-classify, started by hand:
cd mini-classify
.venv/bin/python serve_api.py <collection root> --cache-dir <embedding cache> --port 8077
The collection root must lie inside your model library — an index of models the
app can't reach covers nothing. The positional root overrides whichever root the
cache recorded when it was built, which is how one cache can serve a moved or
re-derived copy of its corpus. For a containerised setup, see deploy/demo/README.md.
MODEL_BROWSER_INDEX points the server at a different address; setting it to the
empty string turns the feature off outright.
The app runs fine: browsing, thumbnails and name search don't touch the index, and the meaning toggle simply doesn't appear. The states the UI reports are distinct and worth reading literally:
--cache-dir: a cache with no embeddings in it.The panel also states what the index covers for the folder you're in ("12 of 40 models here are indexed"), so a thin result set is legible rather than mysterious.
The Search tab exposes what the ranking does: read the phrase as written or through a template, pool a model's views by mean/max/softmax, and bound the results by a count (default 60), a score floor (default 0.10), or both — at least one is always in force, since an unbounded meaning search is the entire collection. Mode and tuning ride in the URL, so a meaning search is a link you can share.
Worth knowing before you read a flat result as a bug:
bun run test # vitest, both workspaces
bun run typecheck # tsc, both workspaces
cd client && bunx vitest run)
— not from the repo root.openspec/specs/, changes flow
through openspec/changes/. CLAUDE.md carries the working agreements
(architecture constraints, testing sharp edges) and is worth reading even if
you're human.server/ is Hono and must run on Node unchanged (Bun-only APIs are confined to
its entry point); client/ is React + Vite + three.js with a single shared
WebGL renderer.