{ "repository": "OpenVibers/OpenVibe.MediaHub", "stage": "alpha", "code": true, "wave": "W20", "plan": "plan T10/T19: media-hub serves openvibe.download as a private drive in v1; openvibe.video serves public read-only watch pages and playlists for OpenVibe.Live recordings and clips (Video v1 step C); openvibe.pics is parked (302 to openvibe.network) until scanning and abuse intake exist", "runtime": "node 22, express 4, PostgreSQL 18 (openvibe-sdk/db, async) + Valkey 9", "port": "4990", "domain": "openvibe.download and openvibe.video (openvibe.pics is parked: it redirects to openvibe.network)", "packages": [ "openvibe-contracts v0.419.0", "openvibe-sdk v0.161.0", "openvibe-shared v4.238.0" ], "summary": "OpenVibe.MediaHub: openvibe.download as a private drive. Account-only uploads stream into OpenVibe.Media (a plain form up to 256 MB, resumable parts beyond). Files are private. Share links expire in 1 hour to 7 days, need a signed-in downloader and can be limited to named accounts (matched by subject). Reports suspend a share for staff. Downloads are always sandboxed attachments. Per-person quotas, and account export and deletion (ADR-033). openvibe.video serves public watch pages and playlists for Live's recordings and clips (no uploads); openvibe.pics is parked and redirects to openvibe.network.", "works": [ "Sign-in with OpenVibe.Network (PKCE S256, httpOnly session cookies); pages server-rendered, complete without JavaScript", "Uploads: a plain form streamed to disk with its sha256 (up to 256 MB), and resumable chunked uploads (8 MB parts) through Media multipart", "Private files and folders, per-person limits (2 GB stored, 512 MB per file, 50 uploads a day, 20 live shares)", "Share links: 1 hour to 7 days, revocable, counted, sign-in required, optional named accounts (Network subjects only)", "Reports: 3 distinct people or one report of illegal content suspend a share; staff restore or remove (Media object deleted)", "Downloads: attachment, nosniff, sandbox CSP, real type only for a safe list, filename* for any script, Range resume", "OpenVibe.Video step A: public watch pages on openvibe.video (/v/:id, /c/:id, /@:username) reading Live's public API, with WebVTT captions/chapters and no uploads", "OpenVibe.Video playlists: a signed-in person's named lists of Live recordings and clips (/playlists, /playlists/:id), with a browser-session and app API (video.playlist.read / video.playlist.manage), the ?list= watch flow, and sign-in on the video host", "Parked domain: openvibe.pics redirects to openvibe.network in nginx; no request reaches the app", "Account export and deletion (ADR-033) through openvibe-sdk/account-data; subscriptions created at boot", "Per-caller and per-address limits; readiness (database required); metrics on loopback" ], "notYet": [ "Signed-out uploads on openvibe.pics (MEDIAHUB_PICS_ANONYMOUS) and openvibe.download (MEDIAHUB_DOWNLOAD_ANONYMOUS): built and off until the owner registers the DMCA designated agent and the CSAM hash-matching account (plan T10)", "Scanning of uploads (hash lists, malware) and abuse intake shared with OpenVibe.Media's holds", "App, agent and service tokens on the drive, Pics and video upload routes: only the two playlist capabilities are registered; every other /api/v1 route needs a signed-in person" ], "capabilitiesRegistered": true, "serviceManifestRegistered": true, "deployed": true, "placeholderInSites": false, "features": [ "Network sign-in", "server-rendered pages", "api mount", "limits and readiness", "deploy files" ], "contracts": "openvibe-contracts v0.419.0", "sdk": "openvibe-sdk v0.161.0", "shared": "openvibe-shared v4.238.0", "deployment": "openvibe-ovh: unit openvibe-media-hub.service on 127.0.0.1:4990 (git checkout /opt/openvibe.download, env /etc/openvibe/media-hub.env, database ov_media_hub), deployed with `sudo ovhost deploy media-hub`; public at https://openvibe.download since 2026-10-08, https://openvibe.video since 2026-10-12 and https://openvibe.pics since 2026-10-15.", "updated": "2026-11-13" }