Self-hosted Express + Postgres app for organizing STL/3MF/OBJ/etc. with: - Model/file library, tags, collections, print settings - URL import: Thingiverse (API), Printables (GraphQL), MakerWorld (FlareSolverr + token), cubee3d/other (metadata + manual files) - In-browser 3D viewer; 3MF rendered via Python/trimesh GLB conversion - Auto thumbnails, license/commercial-use tracking, in-app editing - Settings (API tokens / FlareSolverr) stored in DB with .env fallback Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
57 lines
3.2 KiB
Markdown
57 lines
3.2 KiB
Markdown
# Printhive
|
|
|
|
A self-hosted web app for organizing your 3D-printing files (STL, 3MF, OBJ, STEP, GCODE, ZIP) into a searchable library — with in-browser 3D previews, collections, license/commercial-use tracking, and one-paste **import from popular model sites**.
|
|
|
|
## Features
|
|
|
|
- **Library** of models, each owning one or more files; tags, collections, descriptions, print settings.
|
|
- **Import from URL**:
|
|
- **Thingiverse** — downloads files automatically via the official API (needs a free app token).
|
|
- **Printables** — downloads files automatically via its public GraphQL API (no auth needed for free models).
|
|
- **MakerWorld** — downloads files via FlareSolverr (solves Cloudflare) + your account token.
|
|
- **cubee3d (Hive)** and any other URL — imports title/description/preview image; you add the files manually.
|
|
- **In-browser 3D viewer** (Three.js) for STL/OBJ, and for 3MF via a server-side **trimesh GLB conversion** (handles Bambu/MakerWorld production-extension files the JS loader can't).
|
|
- **Auto thumbnails** rendered from the model; embedded 3MF thumbnails used when present.
|
|
- **License & commercial-use tracking** — captured per source, with a "sellable / non-commercial" indicator (a guide; verify before selling).
|
|
- **Collections** — group models (a model can be in many); rename/delete without losing models.
|
|
- **Editing** — rename/retag, edit print settings, override commercial-use, refresh metadata from source, re-download files, download all files as a zip.
|
|
- **Settings** — API tokens / FlareSolverr URL stored in the database (with `.env` fallback), secrets masked.
|
|
|
|
## Tech stack
|
|
|
|
- Node.js + Express, vanilla-JS frontend (no build step), PostgreSQL.
|
|
- Three.js (viewer) via CDN import map.
|
|
- Python + [trimesh](https://github.com/mikedh/trimesh) sidecar for 3MF→GLB conversion and volume.
|
|
- Optional [FlareSolverr](https://github.com/FlareSolverr/FlareSolverr) for Cloudflare-protected sources.
|
|
|
|
## Setup
|
|
|
|
1. **Postgres** — create a database and point `DATABASE_URL` at it. The schema is applied automatically on startup.
|
|
2. **Python sidecar** (for 3MF previews/volume):
|
|
```bash
|
|
python3 -m venv tools/venv
|
|
tools/venv/bin/pip install trimesh numpy networkx lxml
|
|
```
|
|
3. **Install deps and run**:
|
|
```bash
|
|
npm install
|
|
cp .env.example .env # set DATABASE_URL (+ optional tokens)
|
|
npm start
|
|
```
|
|
4. Open http://localhost:3000
|
|
|
|
## Configuration
|
|
|
|
Settings live in the database (editable in the app's **Settings** menu) and fall back to environment variables:
|
|
|
|
| Setting | Env var | Purpose |
|
|
|---|---|---|
|
|
| Thingiverse API token | `THINGIVERSE_TOKEN` | Thingiverse auto-download |
|
|
| FlareSolverr URL | `FLARESOLVERR_URL` | Read Cloudflare-protected sites (MakerWorld) |
|
|
| MakerWorld auth token | `MAKERWORLD_TOKEN` | MakerWorld downloads (bearer token from your session) |
|
|
| Printables auth token | `PRINTABLES_TOKEN` | Optional; account-gated Printables files |
|
|
|
|
## Notes
|
|
|
|
- Auto-download from MakerWorld/Printables relies on their private/session APIs and can break if they change; failed/partial imports can be recovered with "Download files from source".
|
|
- The commercial-use badge is a best-effort read of the license — always confirm on the source page before selling.
|