{"id":50546802,"url":"https://github.com/kurenn/trove","last_synced_at":"2026-06-07T00:00:36.108Z","repository":{"id":362345992,"uuid":"1258572750","full_name":"kurenn/trove","owner":"kurenn","description":"Trove — self-hosted desktop 3D-print model library (Tauri v2 + React/TS)","archived":false,"fork":false,"pushed_at":"2026-06-03T23:40:36.000Z","size":2036,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-04T00:02:14.575Z","etag":null,"topics":["3d-models","3d-printing","desktop","react","rust","self-hosted","sqlite","tauri","threejs","typescript"],"latest_commit_sha":null,"homepage":"https://trove.spoolr.io","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/kurenn.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-03T17:54:48.000Z","updated_at":"2026-06-03T23:40:38.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/kurenn/trove","commit_stats":null,"previous_names":["kurenn/trove"],"tags_count":6,"template":false,"template_full_name":null,"purl":"pkg:github/kurenn/trove","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kurenn%2Ftrove","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kurenn%2Ftrove/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kurenn%2Ftrove/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kurenn%2Ftrove/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kurenn","download_url":"https://codeload.github.com/kurenn/trove/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kurenn%2Ftrove/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34003814,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-06T02:00:07.033Z","response_time":107,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["3d-models","3d-printing","desktop","react","rust","self-hosted","sqlite","tauri","threejs","typescript"],"created_at":"2026-06-04T00:00:19.373Z","updated_at":"2026-06-07T00:00:36.101Z","avatar_url":"https://github.com/kurenn.png","language":"TypeScript","funding_links":["https://buymeacoffee.com/kurito"],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n\u003cimg src=\"assets/logo.png\" width=\"108\" alt=\"Trove\" /\u003e\n\n# Trove\n\n### Your 3D-print library, finally organized.\n\nA self-hosted **desktop app** that indexes your STL / 3MF / STEP files **in place** — browse them in a real 3D viewer, search instantly, and summon any model with a global launcher. Nothing is ever moved, modified, uploaded, or downloaded.\n\n[![Release](https://img.shields.io/github/v/release/kurenn/trove?color=c2693d\u0026label=release)](https://github.com/kurenn/trove/releases/latest)\n[![Build](https://img.shields.io/github/actions/workflow/status/kurenn/trove/release.yml?color=c2693d\u0026label=build)](https://github.com/kurenn/trove/actions/workflows/release.yml)\n[![License: MIT](https://img.shields.io/github/license/kurenn/trove?color=c2693d)](LICENSE)\n![Platforms](https://img.shields.io/badge/platforms-macOS%20·%20Windows%20·%20Linux-c2693d)\n![Built with Tauri](https://img.shields.io/badge/built%20with-Tauri%20v2%20·%20Rust%20·%20React-c2693d)\n[![Buy me a coffee](https://img.shields.io/badge/Buy%20me%20a%20coffee-c2693d?logo=buymeacoffee\u0026logoColor=white)](https://buymeacoffee.com/kurito)\n\n[**🌐 Website**](https://trove.spoolr.io) \u0026nbsp;·\u0026nbsp; [**⬇️ Download**](https://github.com/kurenn/trove/releases/latest) \u0026nbsp;·\u0026nbsp; [**🧭 Quick start**](#-quick-start) \u0026nbsp;·\u0026nbsp; [**☕ Support**](https://buymeacoffee.com/kurito)\n\n\u003cbr/\u003e\n\n\u003cimg src=\"assets/library.png\" width=\"860\" alt=\"Trove library view\" /\u003e\n\n\u003c/div\u003e\n\n---\n\n## Why Trove?\n\nYour models are scattered across folders, drives, and a network share — `final_v3.stl`, a ZIP from a marketplace, a `Renders/` folder you forgot about. Trove points at those folders and turns them into a fast, browsable, **read-only** library. It indexes, auto-tags, renders 3D previews, and gets you to the file — then hands off to your slicer or file manager. **It never touches your files.**\n\n## ✨ Features\n\n- 🗂️ **Read-only indexer** — point it at any folder (local or network-mounted). A parallel walker scans fast; incremental rescans skip unchanged directories. Files stay exactly where they are.\n- 🧊 **Real 3D previews** — an in-app Three.js viewer for STL / OBJ / 3MF (STEP via lazy WASM). Thumbnails render off the main thread in a Web Worker; folder render images (e.g. `Renders/`) are used as previews when present.\n- ⚡ **Quick Find** — a frosted-glass global launcher (default `⌘/Ctrl+Shift+Space`) that floats over your desktop and searches every file + folder via a full-text index, with live preview and one-click *Open folder*.\n- 🏷️ **Smart auto-tagging** — tags inferred from filenames, folder structure, and geometry, with faceted filtering and a `⌘K` command palette.\n- 📚 **Collections** — group models from anywhere in your library, independent of how they're stored on disk.\n- 🔄 **Auto-updates** — signed in-app updates delivered through GitHub Releases. Stay current with one click.\n- 🌙 **Light \u0026 dark**, runs in the **background** so the global hotkey is always a keypress away, and **scales** to thousands of models on slow shares (SQLite index + thumbnail cache + virtualized grid).\n\n\u003e 🔒 **Self-hosted \u0026 private.** No accounts, no cloud, no telemetry. Trove only ever *reads* your files.\n\n## 📸 Screenshots\n\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003ctd width=\"50%\"\u003e\u003cimg src=\"assets/detail.png\" alt=\"Model detail\" /\u003e\u003cbr/\u003e\u003csub\u003e\u003cb\u003eModel detail\u003c/b\u003e — live 3D viewer, dimensions, parts, collections, and one-click folder access.\u003c/sub\u003e\u003c/td\u003e\n    \u003ctd width=\"50%\"\u003e\u003cimg src=\"assets/launcher.png\" alt=\"Quick Find launcher\" /\u003e\u003cbr/\u003e\u003csub\u003e\u003cb\u003eQuick Find\u003c/b\u003e — a global launcher that searches your whole library from anywhere.\u003c/sub\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd width=\"50%\"\u003e\u003cimg src=\"assets/collections.png\" alt=\"Collections\" /\u003e\u003cbr/\u003e\u003csub\u003e\u003cb\u003eCollections\u003c/b\u003e — curate groups of models across folders.\u003c/sub\u003e\u003c/td\u003e\n    \u003ctd width=\"50%\"\u003e\u003cimg src=\"assets/library-dark.png\" alt=\"Dark mode\" /\u003e\u003cbr/\u003e\u003csub\u003e\u003cb\u003eDark mode\u003c/b\u003e — the full library, your way.\u003c/sub\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n## 🚀 Quick start\n\n**Download:** grab the latest build for your OS from the [**Releases**](https://github.com/kurenn/trove/releases/latest) page.\n\n- **macOS** — open the `.dmg` and drag Trove to **Applications**. Trove isn't notarized yet, so macOS may say *\"Trove is damaged.\"* It isn't — clear the download quarantine flag once:\n  ```bash\n  xattr -dr com.apple.quarantine /Applications/Trove.app\n  ```\n  Then open it normally. (Apple Silicon → `aarch64.dmg`, Intel → `x64.dmg`.)\n- **Windows** — run the `.msi` or `-setup.exe`. On SmartScreen: **More info → Run anyway**.\n- **Linux** — `.AppImage` (chmod +x and run), `.deb`, or `.rpm`.\n\nOn first run, the onboarding walks you through pointing Trove at a folder. That's it.\n\n## 🛠️ Build from source\n\nRequires **Node 18+** and the **Rust** toolchain ([Tauri v2 prerequisites](https://v2.tauri.app/start/prerequisites/)).\n\n```bash\ngit clone https://github.com/kurenn/trove.git\ncd trove\nnpm install\n\nnpm run dev          # web UI on mock data (http://localhost:1420)\nnpm run tauri dev    # full desktop app against the real index\nnpm run tauri build  # → src-tauri/target/release/bundle/ (.app + .dmg, .msi, .AppImage…)\n```\n\nRun the backend tests with `cd src-tauri \u0026\u0026 cargo test` (indexer scan, incremental rescan, tagging, helpers).\n\n\u003cdetails\u003e\n\u003csummary\u003eDev helpers\u003c/summary\u003e\n\nGated on `import.meta.env.DEV`:\n- Deep-link any screen: `?s=model\u0026id=m4`, `?dark=1`, `?search=1`, `?phase=setup`\n- Render a single mesh file: `?mesh=/path.stl\u0026ext=stl`\n- Auto-mount a folder at boot: `TROVE_DEV_MOUNT=\"/path/to/library\" npm run tauri dev`\n- Replay onboarding: `VITE_FORCE_ONBOARDING=1 npm run tauri dev`\n\u003c/details\u003e\n\n## 🧱 Architecture\n\nThe **native side (Rust)** owns the filesystem — scanning, file-watching, the SQLite index, and OS handoff. The **web side (React)** owns the UI, Three.js mesh loading, and thumbnail rendering (offscreen canvas → PNG, cached to disk by Rust). Model files and thumbnails stream into the webview via Tauri's asset protocol, not JSON IPC.\n\nThe dataset lives in a Zustand store, so the UI runs on mock fixtures in a plain browser (`npm run dev`) and swaps to the live Rust index under Tauri with no call-site changes.\n\n```\nsrc/                     React/TS frontend\n  data/        types, mock fixtures, reactive dataset helpers\n  lib/         store (Zustand), Tauri bridge, updater\n  three/       geometries, Viewer3D, mesh loaders, Web Worker, thumbnails\n  components/  Sidebar, Topbar, ⌘K palette, cards, UpdateBanner, icons\n  screens/     Library, Detail, Search, Collections, Creators, …, Setup\n  Launcher.tsx the Quick Find global launcher (its own window)\nsrc-tauri/               Rust backend\n  src/index.rs     scan walker, auto-tagging, dataset assembly, commands\n  src/db.rs        SQLite schema (WAL + FTS5)\n  src/watch.rs     debounced file watching\n  src/quickfind.rs global shortcut + launcher window control\n```\n\n**Stack:** Tauri v2 · Rust (`jwalk`/`walkdir`, `rusqlite`, `notify`) · React 18 + TypeScript + Vite + Zustand · Three.js (+ `occt-import-js` WASM for STEP).\n\n## 🔁 How updates ship\n\nBump the version, tag, and push — CI builds + signs every platform and publishes a GitHub Release; installed apps pick it up automatically.\n\n```bash\n# bump version in tauri.conf.json, package.json, src-tauri/Cargo.toml, then:\ngit tag v2.1.0 \u0026\u0026 git push origin v2.1.0\n```\n\n## 🗺️ Out of scope for v1\n\nActivityPub federation and a public library page; the prototype's four visual \"directions\" (ships the Hearth direction, light/dark); print-time / filament estimation — Trove never slices, so real models show file-derived facts instead.\n\n## 🤝 Contributing\n\nIssues and PRs are welcome. Building locally is just `npm install` + `npm run tauri dev`.\n\n## ☕ Support\n\nTrove is free and open source, with no accounts, cloud, or telemetry. If it earns a spot in your workflow and you'd like to support continued development, you can [**buy me a coffee**](https://buymeacoffee.com/kurito). Thank you!\n\n## 📄 License\n\n[MIT](LICENSE) © Spoolr. \u0026nbsp;·\u0026nbsp; Inspired by the self-hosted-library concept popularized by [Manyfold](https://manyfold.app).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkurenn%2Ftrove","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkurenn%2Ftrove","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkurenn%2Ftrove/lists"}