Present STUDIO is a self-hosted file publishing service for PDF, HTML (including ZIP bundles), and text documents (TXT, CSV, MD, JSON, XML, YAML, LOG, TSV).
Each published file receives a share URL:
https://earthlab.space/p/p/{slug}
Access is controlled per file by optional view password, landing visibility, and a shared admin session. There is no multi-user RBAC — one ADMIN_PASSWORD protects the upload panel at /p/admin.
/p can be enabled or disabled from the earthlab admin panel under Private Service Status → Present STUDIO.| Layer | Technology |
|---|---|
| Runtime | Node.js 20+ / Fastify 5 |
| Database | SQLite (better-sqlite3) |
| Storage | DATA_DIR/uploads/{uuid}/ |
| Auth | HMAC-signed cookies + bcrypt passwords |
| Viewers | PDF.js canvas, HTML iframe + deck bridge, doc viewer |
| Deploy | Docker service behind earthlab nginx at /p/ |
/p)GET /p/ — landing FILE LISTGET /p/health — livenessGET /p/p/:slug — viewer or unlock formPOST /p/p/:slug/unlock — password entry (rate limited)GET /p/p/:slug/file — file bytesPOST /p/api/quick-upload — guest upload when enabledadmin_session)GET/POST /p/admin/login — sign inGET /p/admin — dashboard, upload, registryPOST /p/api/upload — multipart admin uploadPOST /p/api/presentations/:slug/delete — deletePOST /p/api/presentations/:slug/password — set/clear passwordPOST /p/api/presentations/:slug/visibility — landing show/hide| Limit | Value | Env var |
|---|---|---|
| Admin upload per file | 50 MB | MAX_UPLOAD_BYTES |
| Quick upload per file | 2 MB | QUICK_UPLOAD_MAX_BYTES |
| Total storage | 500 MB | MAX_STORAGE_BYTES (0 = unlimited) |
| Unlock rate | 5 / min / IP / slug | code constant |
| Variable | earthlab value |
|---|---|
BASE_URL | https://earthlab.space/p |
ROOT_PATH | /p |
BRAND_NAME | Present STUDIO |
EARTHLAB_GATE_URL | http://app:3000/api/internal/exposure/presentations |
DATA_DIR | /app/data (Docker volume) |
Back up presentations.db, uploads/, and app-settings.json together.
SESSION_SECRET and ADMIN_PASSWORD — separate from earthlab admin credentials.