New features
All user media now served from Cloudflare R2Every upload, conversion output, video stream segment, ZIP archive, transfer import, and AI-generated image now lives on Cloudflare R2 instead of Supabase Storage. Reads honor a per-row
storage_provider flag so older Supabase-hosted files keep resolving until a one-time backfill copies them across.- Zero egress fees on R2 — the line item that scales linearly with active users disappears.
- Same signed-URL model end-to-end: presigned PUT for direct-to-storage uploads, presigned GET for downloads, HMAC-signed CDN transform URLs.
- Industry-standard security posture: private R2 bucket, server-side authenticated signing, no client-side credentials, no public bucket URLs.
Forma AI — generative image transformsThe AI surface expands from analysis-only (alt text, tags, descriptions, safety) to generative image operations powered by
POST /api/ai/transform. Pro and above.- Operations:
image.edit,image.generate,image.upscale,image.background-replace,image.style-transfer,image.outpaint. - Inputs: uploaded
file, an existing library file viastoredFileId, or a publicsourceUrl.image.generateworks text-only with no source. - Async mode via
async=trueenqueues the job and returns a job id; pollGET /api/ai/transform/jobs/{jobId}until the result lands. Useful for outpaints and large upscales that routinely run 10–30 seconds. - Outputs auto-save to the caller’s library with operation metadata, ready to use anywhere a
stored_filesrow is accepted. - Per-image pricing at 75 AI units base + 1 unit per MB of source. Pro overage of 0.16.
Editor: real Crop and Expand (AI) tools with drag handlesTwo new tools in the editor sidebar at
/app/editor/{fileId}:- Crop. Eight drag handles (4 corners + 4 edges) on a survivor rectangle directly on the canvas, with a dim mask around the trimmed region. Aspect-ratio presets in the inspector (1:1, 16:9, 4:3, 9:16, 3:4) snap the rectangle without overriding free-form drag. Apply commits the crop as a step in the edit stack.
- Expand (AI). Drag the same eight handles outward past the image edges. The new canvas area renders a checkerboard backdrop so it’s visible what will be filled. Click Generative fill with Forma AI and the editor composites the image onto the larger canvas client-side and dispatches an
image.outpaintjob to the worker. The filled image lands as a step in the stack.
image.edit, image.background-replace, image.style-transfer, and image.upscale against the current image without leaving the editor.Live broadcasting now first-classLive RTMP/SRT ingest and HLS/WebRTC playback are now production-ready alongside the existing on-demand HLS/DASH streaming.
- Manage live inputs via the dashboard or
POST /api/live/inputs. Stream keys are hashed, write-only, and rotatable throughPOST /api/live/inputs/{id}/rotate-key. - Domain allow-lists and lifecycle event tracking on every input.
- Ingest and playback URLs are returned with each live input — no separate media server setup required.
Improvements
File manager — paged loads, retina thumbnails, no more cropped previews
- Infinite scroll on every folder via
useInfiniteQuery— 100 files per page with anIntersectionObserversentinel that prefetches the next batch before it scrolls into view. - Image thumbnails now preserve aspect ratio. The CDN transform URL switched from
fit=cover(1:1 crop) tofit=inside, with separate@1x(240px) and@2x(480px) variants in asrcSetso retina screens get sharp previews without LCP regressions. - Workspace summary strip + counts only render on the root view, not on individual folders.
Editor canvas — per-tool controlsThe transform gizmo, rotate handle, and live W×H badge now only render on the Transform tool. Crop owns its eight crop handles, Expand owns its eight outer-edge handles, and every other tool shows a clean canvas. Resize cursors on the handles now actually match the drag direction (the editor’s global
cursor: pointer was previously winning the specificity battle).Forma AI rebrand“ConvertlyAI” is now Forma AI across the dashboard, pricing comparison, account menu, and API responses. The Forma AI floating button stays bottom-right in
/app/* and runs workspace operations (rename, organize). The editor’s AI composer at the bottom of the canvas runs image transforms.Fixes
- Resize cursor. Dragging a corner of the Transform gizmo now shows the diagonal resize cursor again instead of a pointer. The editor’s
[&_button]:cursor-pointerrule was overriding the per-handle cursor classes; the resize handles now force their cursor with!important.
- Avatar uploads stopped relying on Supabase’s public-bucket URL. New
/api/account/avatarroute uploads through R2 and serves via a refreshed signed URL. - WordPress copy-from-library now records the R2 provider on the cloned
stored_filesrow so subsequent reads resolve correctly after the cutover.