Commit Graph
74 Commits
Author SHA1 Message Date
yusufipk 8845c2c643 feat: name video downloads by title + version
Downloads now save as "<video title> <version label>" (or "<title> vN"
when no label), with the real extension derived from the file's content
type, instead of the CDN's generic "original" name.

- Bunny (cross-origin CDN redirect) files are fetched and saved as a named
  blob, but only up to 10 GB; larger files fall back to a plain navigation
  so the browser streams to disk without buffering in memory.
- R2 / S3 / MinIO uploads are same-origin (/api/upload/video/...), so the
  download attribute names them correctly at any size, no buffering.
- Applies to both single-video and bulk/project downloads; bulk downloads
  run sequentially so at most one file is buffered at a time.
- Shared helper in lib/client/download-file.ts.
2026-07-10 21:58:09 +07:00
yusufipk 8d7d064647 feat: make asset downloads opt-in via "Include assets" toggle
Project/selected downloads now include only videos by default. Add an
"Include assets" checkbox toggle to both download dropdowns (default off)
that adds b-rolls and other attached assets to the download when enabled.

- buildProjectDownloadManifest gains an includeAssets option (default false).
- Download route reads ?assets=1 and passes it through.
2026-07-10 21:03:34 +07:00
yusufipk 34e72f6cbb fix: bulk video download (original quality, latest version by default)
- Accept source=auto in the version download route (was 400 Bad Request),
  so bulk/project downloads of Bunny videos no longer fail.
- Bulk/project downloads now request the original (uncompressed) Bunny file
  so quality never drops (was source=auto which could fall back to compressed).
- Project/selected downloads default to the latest version of each video and
  add a separate "All versions" option in the download dropdowns.
2026-07-10 20:04:18 +07:00
yusufipk 880d0ac0fa feat: chunked (S3 multipart) uploads for R2/S3 video backend
Self-hosted instances on the R2/S3 backend could only upload a video as a
single PUT, which fails behind a Cloudflare proxy/tunnel (100MB request-body
cap) and is capped at 5GiB with no resilience. Bunny already avoids this via
tus; this brings the R2/S3 path to parity.

Files larger than a threshold (default 90MiB) are now split into parts
(default 32MiB, min 5MiB) and uploaded directly browser->R2 via presigned
UploadPart URLs, then reassembled server-side with CompleteMultipartUpload.
Each request stays under the 100MB cap, lifts the size ceiling well past
5GiB, and adds per-chunk retry. Files at/under the threshold keep the
existing single-PUT path unchanged. Bunny path is untouched.

Thresholds are env-overridable via OPENFRAME_R2_MULTIPART_THRESHOLD_BYTES
and OPENFRAME_R2_MULTIPART_PART_SIZE_BYTES.

Verified end-to-end against real Cloudflare R2 and a local MinIO behind an
nginx 90MB cap (single 141MB PUT 413s on master; 32MB parts pass here).

Closes #22
2026-07-10 19:19:07 +07:00
yusufipk 52e4169db2 feat: add project bulk download and bulk video delete
Add a "Download project" / "Download selected" flow that builds a
server-side manifest of downloadable media, plus a selection mode with
bulk delete for project videos.

Gate viewer downloads behind a new project allowDownloads setting
(default off, opt-in). Admins can always download; enabling on a public
project allows anonymous visitors to download. Enforce the setting on
every download surface (manifest, version, asset, watch, video routes)
via canDownloadProjectMedia.

Add rate limits for the manifest endpoint, host allowlisting for direct
download URLs, and configurable file/byte caps.

Closes #16
Closes #19
2026-06-27 13:24:05 +02:00
yusufipk 9613c4f2c6 fix: harden email validation and CI permissions 2026-06-14 16:59:09 +02:00
yusufipk 51257e004f Add SEO comparison landing pages and footer compare links.
Introduces dynamic marketing comparison routes, competitor data, and Compare sections on the homepage and marketing footer.
2026-06-14 16:36:26 +02:00
yusufipk 00124bc7c2 feat: bulk video uploads and S3 asset video support (#18)
Add multi-file drag-and-drop queues for project videos and the assets pane, and route asset video uploads through S3/R2 when direct Bunny uploads are disabled.
2026-06-13 23:24:21 +02:00
yusufipk 52ace1a1a8 fix: generate CSP from runtime storage env for self-hosted MinIO
Move Content-Security-Policy generation to proxy.ts so R2_PRESIGN_ENDPOINT
is included at request time instead of being frozen at image build time.
Document reverse-proxy layouts for Docker self-hosting and copy proxy.ts
into the Docker image.

Closes #17
2026-06-12 21:21:31 +02:00
yusufipk 4bf6e821af feat: enable S3 video uploads and update related configurations
- Added support for self-hosted S3 video uploads with new environment variables: OPENFRAME_ENABLE_S3_VIDEO_UPLOADS and OPENFRAME_MAX_VIDEO_UPLOAD_BYTES.
- Updated .env.example and .env.docker.example to reflect new configuration options.
- Enhanced Content Security Policy to include origins for S3-compatible storage.
- Updated dependencies for AWS SDK to support new features.
- Refactored upload logic to accommodate both Bunny and S3 upload providers.
- Updated documentation to clarify the usage of direct uploads and S3 configurations.
- Closes #11
2026-05-27 17:04:39 +02:00
Enes Köksal 3cfea40fbd refactor: eslint and prettier conflict will be resolved and formatted 2026-04-23 17:05:43 +03:00
Yusuf İpek 873945464d feat: implement storage quota management for uploads
- Added storage quota enforcement for audio and image uploads in the respective routes.
- Introduced reservation system to manage concurrent uploads and prevent quota overages.
- Enhanced comment creation to account for audio and image attachment sizes against user quotas.
- Created new UploadReservation model to track in-flight upload reservations.
- Backfilled existing video assets with size information from R2.
- Added progress component for UI feedback during uploads.
- Updated API responses to include reservation IDs for better quota management.
- Adjusted error handling to return appropriate storage limit exceeded messages.
2026-04-15 19:53:43 +03:00
Yusuf İpek e18d5219f5 feat(billing): add trial eligibility logic and update billing overview 2026-04-11 12:53:02 +03:00
Yusuf İpek faa902a604 feat(auth): implement email verification process with resend functionality and update registration flow 2026-04-11 00:17:09 +03:00
Yusuf İpek 4ba7521a38 feat(auth): implement OAuth login with Google and GitHub, add Prisma adapter for user management 2026-04-10 22:23:13 +03:00
Yusuf İpek df10f45e9e feat(onboarding): implement rate limiting for onboarding completion 2026-04-10 21:48:25 +03:00
Yusuf İpek 9b561b78b4 refactor(request-origin): remove unused origin retrieval functions to enhance security 2026-04-10 21:45:40 +03:00
Yusuf İpek 288c5d2624 feat(stripe-billing): add Stripe stats retrieval and display in admin dashboard 2026-04-10 21:35:22 +03:00
Yusuf İpek c92181b90f feat(rate-limit): enforce rate limit configuration in production environment 2026-04-10 21:13:43 +03:00
Yusuf İpek d07b40a937 feat(rate-limit): add rate limit configuration for comment export 2026-04-10 21:12:56 +03:00
Yusuf İpek 84ea384ee7 refactor(invitation): simplify buildInvitationUrl by removing email parameter 2026-04-10 21:11:56 +03:00
Yusuf İpek 8014fc3986 Refactor error logging across the application to use a centralized logger
- Introduced a new logger utility (`logError`) to standardize error logging.
- Replaced all instances of `console.error` with `logError` in various API routes and libraries.
- Enhanced error logging to sanitize sensitive information, particularly for Prisma and Stripe errors.
- Ensured consistent error handling and logging practices throughout the codebase.
2026-04-10 21:10:09 +03:00
Yusuf İpek 439e74d037 feat(validation): implement validateAnnotationStrokes function for safe annotation data handling
feat(rate-limit): add TRUSTED_PROXY_MODE for configurable proxy header trust
feat(comments): validate annotation data structure in comment routes and components
2026-04-10 20:38:22 +03:00
Yusuf İpek 26cf58a28c feat(auth): enhance project access handling with pre-fetched data and new utility functions 2026-04-09 17:17:39 +03:00
Yusuf İpek e97d60cf36 feat(docker): add Docker support with configuration files and entrypoint scripts 2026-04-09 15:54:03 +03:00
Yusuf İpek b1b1715578 Refactor registration and dashboard features to support invite codes and Bunny uploads
- Moved registration logic to a new client component for better separation of concerns.
- Integrated invite code requirement based on feature flags in the registration process.
- Enhanced dashboard functionality to conditionally enable Bunny uploads based on feature flags.
- Updated various components and API routes to check for Bunny uploads and Stripe billing feature flags.
- Added new feature flag utilities for managing feature toggles in the application.
2026-04-08 18:46:12 +03:00
Yusuf İpek 6f22b0bf8b feat(billing): integrate Stripe for subscription management and billing access
- Added billing-related fields to the User model in the database.
- Implemented functions for managing billing access, including trial periods and subscription statuses.
- Created new billing utility functions for Stripe integration.
- Updated onboarding page to include billing overview and workspace creation eligibility.
- Enhanced route access checks to require billing access for certain actions.
- Implemented cleanup scripts for expired billing workspaces and associated media.
- Updated header component to conditionally show app navigation based on billing access.
- Added new migrations for billing-related database changes.
2026-04-08 17:50:40 +03:00
Yusuf İpek f5f96e6f9f feat(rate-limit): add environment variable to disable rate limiting for local testing 2026-03-20 22:32:26 +03:00
Yusuf İpek 490e800e69 feat(search): implement search API with rate limiting and results fetching 2026-03-01 19:18:32 +03:00
Yusuf İpek 147e5520a3 feat(notifications): update Telegram bot support and update settings management 2026-03-01 17:28:25 +03:00
Yusuf İpek 975ff603e1 feat: add audio asset support with recording and upload functionality
- Implemented audio asset handling in the API, including download and deletion routes.
- Added audio content type mappings and extraction functions for audio file names and keys.
- Enhanced the asset management UI to support audio uploads, including recording capabilities.
- Updated the database schema to accommodate audio assets with new enum values.
- Integrated audio playback features in the asset list and comment sections.
- Improved user experience with drag-and-drop support for audio files.
2026-02-28 11:01:10 +03:00
Yusuf İpek 60add2a1c4 feat(comments): implement asset handling for attached images in comment creation 2026-02-26 12:45:23 +03:00
Yusuf İpek 4ea6099508 feat(bunny-cdn): refactor CDN hostname resolution and update asset URLs for improved flexibility 2026-02-26 11:53:03 +03:00
Yusuf İpek 76d37d02e5 feat: make media cleanup best-effort with warning summaries and enforce video/workspace management access 2026-02-25 18:59:02 +03:00
Yusuf İpek 9ce033d306 feat(video-assets): add full video asset system (uploads, downloads, @mentions, and cleanup/billing integration) 2026-02-25 18:34:03 +03:00
Yusuf İpek 6eea327083 refactor(dashboard): centralize access guards and split interactive pages into client components 2026-02-25 16:42:47 +03:00
Yusuf İpek a2b07b3e19 feat: add approvals workflow and unified member invitation management across projects, workspaces, and videos 2026-02-25 16:24:45 +03:00
Yusuf İpek 59b766d071 chore(infra): gate DB pool debug logs and de-duplicate rate-limit cleanup timer 2026-02-24 18:10:36 +03:00
Yusuf İpek 7f07a271a4 Improve media cleanup performance with bounded concurrency and aggregated failure reporting 2026-02-24 17:44:23 +03:00
Yusuf İpek 6e14d4d19f feat(admin): add manual R2 stats refresh endpoint/button and share in-memory storage snapshot cache 2026-02-24 17:35:42 +03:00
Yusuf İpek 354bc38d42 refactor(auth): centralize project/workspace authorization with checkProjectAccess across API routes 2026-02-24 17:18:04 +03:00
Yusuf İpek fa51847aa4 feat(storage): add shared R2 media proxy and orphan cleanup tooling for R2/Bunny 2026-02-24 17:02:54 +03:00
Yusuf İpek afa1529873 feat(feedback): add user feedback/review system with admin management and hardened image upload validation 2026-02-24 16:05:11 +03:00
Yusuf İpek 449433a08a fix: centralize trusted same-origin validation for watch session and upload token routes 2026-02-23 18:31:09 +03:00
Yusuf İpek fe7235052e Add guest upload tokens and share-session aware permissions 2026-02-23 18:17:22 +03:00
Yusuf İpek 9058317247 feat(share): add video-level secure share links with password unlock and session-based watch/comment access 2026-02-23 17:11:32 +03:00
Yusuf İpek d15e5192ac chore: clean up lint/type issues and tighten comment media URL validation 2026-02-23 16:06:43 +03:00
Yusuf İpek 609b33bbcb feat(admin): track and display per-user download egress for Bunny version downloads 2026-02-22 20:19:55 +03:00
Yusuf İpek 323093029e feat(seo): upgrade site metadata, schema, and crawl files for OpenFrame rebrand
- update title/description to Open Source Video Review Platform
- add centralized SEO config with canonical URL + meta image (/meta.webp)
- add Open Graph and Twitter card metadata
- add JSON-LD Organization/WebSite structured data
- add robots.txt, sitemap.xml, and web app manifest routes
- version icon metadata to help search engines refresh branding
2026-02-22 16:53:01 +03:00
Yusuf İpek 0288fe08d3 feat(video-download): add Bunny original/compressed download options with secure file handling and tighter rate limits 2026-02-22 16:33:52 +03:00