printhive/README.md
dlawler489 a37db15a3f Initial commit: Printhive 3D-print file library
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>
2026-06-22 13:15:17 +10:00

3.2 KiB

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 sidecar for 3MF→GLB conversion and volume.
  • Optional 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):
    python3 -m venv tools/venv
    tools/venv/bin/pip install trimesh numpy networkx lxml
    
  3. Install deps and run:
    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.