| name | manyfold |
| description | Self-hosted 3D model library manager for organizing, viewing, and managing 3D print files. Use when the user asks about deploying, configuring, or using Manyfold for managing STL/OBJ/3MF collections. Triggers on phrases like "Manyfold", "3D model library", "manage my 3D prints", "self-hosted model manager", "organize STL files", "3D print collection", or any Docker/homelab deployment involving 3D model organization. |
Manyfold Skill
Manyfold is a self-hosted web application for managing 3D print file collections with interactive previews, metadata organization, and Fediverse federation support.
Quick Reference
Docker Image: ghcr.io/manyfold3d/manyfold:latest
Default Port: 3214
Web UI: http://{server}:3214
Deployment Options
Minimal (Solo with SQLite)
services:
manyfold:
image: ghcr.io/manyfold3d/manyfold-solo:latest
ports:
- "3214:3214"
volumes:
- /path/to/config:/config
- /path/to/models:/libraries
environment:
SECRET_KEY_BASE: <generate-128-char-hex>
PUID: 1000
PGID: 1000
restart: unless-stopped
Production (PostgreSQL + Redis)
services:
manyfold:
image: ghcr.io/manyfold3d/manyfold:latest
ports:
- "3214:3214"
volumes:
- /path/to/models:/libraries
environment:
DATABASE_URL: postgresql://manyfold:password@db/manyfold?pool=5
REDIS_URL: redis://redis:6379/1
SECRET_KEY_BASE: <generate-128-char-hex>
PUID: 1000
PGID: 1000
security_opt:
- no-new-privileges:true
cap_drop:
- ALL
cap_add:
- CHOWN
- DAC_OVERRIDE
- SETUID
- SETGID
depends_on:
- db
- redis
db:
image: postgres:15
volumes:
- db_data:/var/lib/postgresql/data
environment:
POSTGRES_USER: manyfold
POSTGRES_PASSWORD: password
POSTGRES_DB: manyfold
redis:
image: redis:7
volumes:
db_data:
Required Environment Variables
| Variable | Description |
|---|---|
SECRET_KEY_BASE |
128-char hex string for cookie signing. Generate with openssl rand -hex 64 |
PUID / PGID |
User/group ID for file permissions. Get with id command |
REDIS_URL |
Redis connection (not needed for solo image). Format: redis://host:6379/1 |
Database Configuration
Option 1: DATABASE_URL (recommended)
- PostgreSQL:
postgresql://user:pass@host/dbname?pool=5 - MySQL:
mysql2://user:pass@host/dbname?pool=5 - SQLite:
sqlite3:/config/manyfold.sqlite3?pool=5
Option 2: Individual variables
DATABASE_ADAPTER: postgresql, mysql2, or sqlite3DATABASE_HOST,DATABASE_PORT,DATABASE_USER,DATABASE_PASSWORD,DATABASE_NAME
Key Optional Features
| Variable | Description |
|---|---|
MULTIUSER=enabled |
Enable login, roles, permissions |
FEDERATION=enabled |
ActivityPub/Fediverse support |
HTTPS_ONLY=enabled |
Force HTTPS, set HSTS headers |
DEMO_MODE=enabled |
Disable all destructive operations |
OIDC Single Sign-On
OIDC_CLIENT_ID=<client-id>
OIDC_CLIENT_SECRET=<secret>
OIDC_ISSUER=https://auth.example.com/
OIDC_NAME=Authentik
FORCE_OIDC=enabled # Optional: disable local login
Email (SMTP)
SMTP_SERVER=smtp.example.com
SMTP_PORT=587
SMTP_USERNAME=user
SMTP_PASSWORD=pass
SMTP_FROM_ADDRESS=manyfold@example.com
PUBLIC_HOSTNAME=manyfold.example.com
Performance Tuning
| Variable | Default | Description |
|---|---|---|
WEB_CONCURRENCY |
4 | Web worker processes |
RAILS_MAX_THREADS |
16 | Threads per worker |
DEFAULT_WORKER_CONCURRENCY |
4 | Background job threads |
PERFORMANCE_WORKER_CONCURRENCY |
1 | Heavy job threads (analysis, conversion) |
Security Settings
MAX_FILE_UPLOAD_SIZE=536870912 # 512MB in bytes
MAX_FILE_EXTRACT_SIZE=1073741824 # 1GB in bytes
MIN_PASSWORD_SCORE=4 # 0-4, higher = stricter
Core Concepts
- Library: Storage location (local folder or S3 bucket) containing models
- Model: A folder containing related 3D files (parts, images, docs)
- Creator: Content author/designer
- Collection: Grouping of related models
- Tags: Organizational keywords
User Workflows
Initial Setup
- Access web UI at
http://server:3214 - Create admin account (email, username, password)
- Add first library (path inside container, e.g.,
/libraries) - Scan runs automatically to index existing files
Scanning
- Scan for new files: Detect new folders/files added outside Manyfold
- Rescan all models: Re-check existing models for problems/metadata
Uploading
- Upload ZIP archives (extracted as separate models)
- Upload individual STL/OBJ files (creates single model)
- Progress shown during upload, extraction happens in background
External Integrations (v0.118+)
Import metadata from Thingiverse, MyMiniFactory, Cults3D:
- Configure API keys in Settings > Integrations
- Add link to model page
- Click sync icon to import metadata/images
- Or paste URL in search bar for direct import
Supported File Formats
See references/supported_formats.md for complete list.
3D Models with Preview: STL, OBJ, 3MF, GLTF/GLB, FBX, PLY, 3DS Slicer Files: GCode (preview), Chitubox, Lychee Images: PNG, JPG, GIF, WebP, SVG, TIFF, BMP Documents: PDF, Markdown, TXT Archives: ZIP, RAR, 7z, gzip, bzip2
Troubleshooting
Container won't start
- Ensure
SECRET_KEY_BASEis set - Check
PUID/PGIDhave read/write access to mounted volumes - Verify Redis is accessible (for full image)
Files not appearing
- Check library path matches container mount (not host path)
- Run manual scan from web UI
- Verify file extensions are supported
Permission errors
- Match
PUID/PGIDto owner of library folders - Ensure container has write access for temp files
Health check
wget --no-verbose --tries=1 --spider http://localhost:3214/health
Reverse Proxy
Set RAILS_RELATIVE_URL_ROOT=/manyfold for non-root paths.
Required headers for HTTPS proxy:
X-Forwarded-Proto: httpsX-Forwarded-ForHost
Note: Federation requires domain root (no subpath).
Additional References
- Configuration details: references/configuration.md
- All supported formats: references/supported_formats.md