+ {title} +
++ {description} +
+From 7bf0984698e43b9aa2dd879f65951318ed410390 Mon Sep 17 00:00:00 2001 From: Maze <167211895+mazeincoding@users.noreply.github.com> Date: Sat, 31 Jan 2026 00:20:04 +0100 Subject: codebase overhaul (#697) --- apps/web/src/app/(auth)/login/page.tsx | 146 --- apps/web/src/app/(auth)/signup/page.tsx | 162 --- apps/web/src/app/animation/page.tsx | 24 - apps/web/src/app/api/auth/[...all]/route.ts | 2 +- apps/web/src/app/api/get-upload-url/route.ts | 128 -- apps/web/src/app/api/health/route.ts | 6 +- apps/web/src/app/api/sounds/search/route.ts | 467 +++---- apps/web/src/app/api/transcribe/route.ts | 189 --- apps/web/src/app/api/waitlist/export/route.ts | 83 -- apps/web/src/app/base-page.tsx | 53 + apps/web/src/app/blog/[slug]/page.tsx | 264 ++-- apps/web/src/app/blog/page.tsx | 151 +-- apps/web/src/app/contributors/page.tsx | 536 ++++---- apps/web/src/app/editor/[project_id]/layout.tsx | 9 - apps/web/src/app/editor/[project_id]/page.tsx | 543 ++------ apps/web/src/app/globals.css | 430 ++++--- apps/web/src/app/layout.tsx | 86 +- apps/web/src/app/metadata.ts | 164 +-- apps/web/src/app/page.tsx | 22 +- apps/web/src/app/privacy/page.tsx | 512 ++++---- apps/web/src/app/projects/page.tsx | 1552 ++++++++++++++--------- apps/web/src/app/projects/store.ts | 129 ++ apps/web/src/app/roadmap/page.tsx | 371 ++---- apps/web/src/app/robots.ts | 18 +- apps/web/src/app/rss.xml/route.ts | 78 +- apps/web/src/app/sitemap.ts | 110 +- apps/web/src/app/sponsors/page.tsx | 82 ++ apps/web/src/app/terms/page.tsx | 580 ++++----- apps/web/src/app/why-not-capcut/page.tsx | 191 --- 29 files changed, 3104 insertions(+), 3984 deletions(-) delete mode 100644 apps/web/src/app/(auth)/login/page.tsx delete mode 100644 apps/web/src/app/(auth)/signup/page.tsx delete mode 100644 apps/web/src/app/animation/page.tsx delete mode 100644 apps/web/src/app/api/get-upload-url/route.ts delete mode 100644 apps/web/src/app/api/transcribe/route.ts delete mode 100644 apps/web/src/app/api/waitlist/export/route.ts create mode 100644 apps/web/src/app/base-page.tsx delete mode 100644 apps/web/src/app/editor/[project_id]/layout.tsx create mode 100644 apps/web/src/app/projects/store.ts create mode 100644 apps/web/src/app/sponsors/page.tsx delete mode 100644 apps/web/src/app/why-not-capcut/page.tsx (limited to 'apps/web/src/app') diff --git a/apps/web/src/app/(auth)/login/page.tsx b/apps/web/src/app/(auth)/login/page.tsx deleted file mode 100644 index f28cd191..00000000 --- a/apps/web/src/app/(auth)/login/page.tsx +++ /dev/null @@ -1,146 +0,0 @@ -"use client"; - -import { useRouter } from "next/navigation"; -import { Button } from "@/components/ui/button"; -import { - Card, - CardContent, - CardDescription, - CardHeader, - CardTitle, -} from "@/components/ui/card"; -import { memo, Suspense } from "react"; -import { Input } from "@/components/ui/input"; -import { Label } from "@/components/ui/label"; -import { Separator } from "@/components/ui/separator"; -import Link from "next/link"; -import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert"; -import { ArrowLeft, Loader2 } from "lucide-react"; -import { GoogleIcon } from "@/components/icons"; -import { useLogin } from "@/hooks/auth/useLogin"; - -const LoginPage = () => { - const router = useRouter(); - const { - email, - setEmail, - password, - setPassword, - error, - isAnyLoading, - isEmailLoading, - isGoogleLoading, - handleLogin, - handleGoogleLogin, - } = useLogin(); - - return ( -
setIsExpanded(!isExpanded)} - className="cursor-pointer hover:opacity-75 transition-opacity" - > - {isExpanded ? "Collapse" : "Expand"} -
-+ {description} +
+- {data.post.authors[0].name} -
- > - )} -{author.name}
+- Read the latest news and updates about OpenCut, the free and - open-source video editor. -
-{post.description}
+{post.description}
-- Meet the amazing developers who are building the future of video - editing -
- -- Leading the way in contributions -
-- Everyone who makes OpenCut better -
-- {contributor.contributions} -
-- Unable to load contributors at the moment. Check back later or - view on GitHub. -
- - - -- Tools we use to build OpenCut -
-+ Leading the way in contributions +
+- {tool.description} -
-- OpenCut is built by developers like you. Every contribution, - no matter how small, helps make video editing more accessible - for everyone. -
+function AllContributorsSection({ + contributors, +}: { + contributors: Contributor[]; +}) { + return ( ++ Everyone who makes OpenCut better +
++ {contributor.contributions} +
+Tools we use to build OpenCut
++ {tool.description} +
+- Learn how we handle your data and privacy. Contact us if you - have any questions. -
-- - OpenCut processes all videos locally on your device. - {" "} - We never upload, store, or have access to your video files. - Your content remains completely private and under your - control at all times. -
-- All video editing, rendering, and processing happens in your - browser using WebAssembly and local storage. No video data - is transmitted to our servers. -
-+ Questions? Email us at{" "} + + oss@opencut.app + +
+- When you create an account, we only collect: -
-- - We do NOT store your projects on our servers. - {" "} - All project data, including names, thumbnails, and creation - dates, is stored locally in your browser using IndexedDB. -
-- We use{" "} - - Better Auth - {" "} - for secure authentication and follow industry-standard - security practices. -
-+ Basic video editing happens locally on your device.{" "} + For standard editing features, we never upload, store, or have access + to your video files. Your content remains completely private and under + your control. +
++ AI features require secure processing: When you + choose to use AI features like auto captions, your audio/video content + is encrypted on your device before being uploaded to our servers for + processing. We use zero-knowledge encryption, meaning we cannot + decrypt or view your content. +
++ After AI processing is complete, the encrypted content is immediately + deleted from our servers. Only the results (like generated captions) + are returned to your device. +
+- We use{" "} - - Databuddy - {" "} - for completely anonymized and non-invasive analytics to - understand how people use OpenCut. -
-- This helps us improve the editor, but we never collect - personal information, track individual users, or store any - data that could identify you. -
-When you create an account, we only collect:
++ We do NOT store your projects on our servers. All + project data, including names, thumbnails, and creation dates, is + stored locally in your browser using IndexedDB. +
++ We use{" "} + + Better Auth + {" "} + for secure authentication and follow industry-standard security + practices. +
+- We use browser local storage and IndexedDB to: -
-- All data stays on your device and can be cleared at any time - through your browser settings. -
-+ When you use AI-powered features (like auto captions, content + analysis, or enhancement tools), your content needs to be processed on + our servers. Here's how we protect your privacy: +
++ Different AI features may process different types of content (audio + for captions, video for analysis, etc.), but all follow the same + zero-knowledge encryption approach. +
+- OpenCut integrates with these services: -
-+ We use{" "} + + Databuddy + {" "} + for completely anonymized and non-invasive analytics to understand how + people use OpenCut. +
++ This helps us improve the editor, but we never collect personal + information, track individual users, or store any data that could + identify you. +
+- You have complete control over your data: -
-We use browser local storage and IndexedDB to:
++ All data stays on your device and can be cleared at any time through + your browser settings. +
+- OpenCut is completely open source. You can review our code, - see exactly how we handle data, and even self-host the - application if you prefer. -
-- View our source code on{" "} - - GitHub - - . -
-OpenCut integrates with these services:
+- Questions about this privacy policy or how we handle your - data? -
-- Open an issue on our{" "} - - GitHub repository - - , email us at{" "} - - oss@opencut.app - - , or reach out on{" "} - - X (Twitter) - - . -
-You have complete control over your data:
+- Last updated: July 14, 2025 -
-+ OpenCut is completely open source. You can review our code, see + exactly how we handle data, and even self-host the application if you + prefer. +
++ View our source code on{" "} + + GitHub + + . +
+Questions about this privacy policy or how we handle your data?
++ Open an issue on our{" "} + + GitHub repository + + , email us at{" "} + + oss@opencut.app + + , or reach out on{" "} + + X (Twitter) + + . +
++ Last updated: July 14, 2025 +
+ + ); } diff --git a/apps/web/src/app/projects/page.tsx b/apps/web/src/app/projects/page.tsx index 3d66a3c5..d58c3aac 100644 --- a/apps/web/src/app/projects/page.tsx +++ b/apps/web/src/app/projects/page.tsx @@ -1,646 +1,956 @@ "use client"; -import { - Calendar, - ChevronLeft, - Loader2, - MoreHorizontal, - ArrowDown01, - Plus, - Search, - Trash2, - Video, - X, -} from "lucide-react"; import Image from "next/image"; import Link from "next/link"; import { useRouter } from "next/navigation"; -import { useCallback, useEffect, useState } from "react"; -import { DeleteProjectDialog } from "@/components/delete-project-dialog"; -import { RenameProjectDialog } from "@/components/rename-project-dialog"; +import type { KeyboardEvent, MouseEvent } from "react"; +import { useEffect, useState } from "react"; +import { toast } from "sonner"; +import { MigrationDialog } from "@/components/editor/dialogs/migration-dialog"; import { Button } from "@/components/ui/button"; import { Card, CardContent } from "@/components/ui/card"; import { Checkbox } from "@/components/ui/checkbox"; -import { - DropdownMenu, - DropdownMenuContent, - DropdownMenuItem, - DropdownMenuSeparator, - DropdownMenuTrigger, -} from "@/components/ui/dropdown-menu"; import { Input } from "@/components/ui/input"; -import { - Tooltip, - TooltipContent, - TooltipProvider, - TooltipTrigger, -} from "@/components/ui/tooltip"; import { Skeleton } from "@/components/ui/skeleton"; -import { useProjectStore } from "@/stores/project-store"; -import { useTimelineStore } from "@/stores/timeline-store"; -import type { TProject } from "@/types/project"; +import { useEditor } from "@/hooks/use-editor"; +import { useProjectsStore } from "./store"; +import type { + TProjectMetadata, + TProjectSortKey, + TProjectSortOption, +} from "@/types/project"; +import { formatTimeCode } from "@/lib/time"; +import { formatDate } from "@/utils/date"; +import { HugeiconsIcon } from "@hugeicons/react"; +import { + Breadcrumb, + BreadcrumbItem, + BreadcrumbLink, + BreadcrumbList, + BreadcrumbPage, + BreadcrumbSeparator, +} from "@/components/ui/breadcrumb"; +import { + Calendar04Icon, + GridViewIcon, + LeftToRightListDashIcon, + PlusSignIcon, + Search01Icon, + Video01Icon, + MoreHorizontalIcon, + Delete02Icon, + Copy01Icon, + Edit03Icon, + ArrowDown02Icon, + InformationCircleIcon, +} from "@hugeicons/core-free-icons"; +import { OcVideoIcon } from "@opencut/ui/icons"; +import { Label } from "@/components/ui/label"; +import { + DropdownMenu, + DropdownMenuCheckboxItem, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuTrigger, +} from "@/components/ui/dropdown-menu"; +import { DeleteProjectDialog } from "@/components/editor/dialogs/delete-project-dialog"; +import { ProjectInfoDialog } from "@/components/editor/dialogs/project-info-dialog"; +import { RenameProjectDialog } from "@/components/editor/dialogs/rename-project-dialog"; +import { cn } from "@/utils/ui"; + +const formatProjectDuration = ({ + duration, +}: { + duration: number | undefined; +}): string | null => { + if (duration === undefined) { + return null; + } + + const format = duration >= 3600 ? "HH:MM:SS" : "MM:SS"; + return formatTimeCode({ timeInSeconds: duration, format }); +}; export default function ProjectsPage() { - const { - savedProjects, - isLoading, - isInitialized, - deleteProject, - createNewProject, - getFilteredAndSortedProjects, - } = useProjectStore(); - const [thumbnailCache, setThumbnailCache] = useState< - Record- {savedProjects.length}{" "} - {savedProjects.length === 1 ? "project" : "projects"} - {isSelectionMode && selectedProjects.size > 0 && ( - - • {selectedProjects.size} selected - - )} -
-- Sort by{" "} - {sortOption.startsWith("createdAt") ? "date" : "name"} ( - {sortOption.endsWith("asc") ? "ascending" : "descending"}) -
-- Start creating your first video project. Import media, edit, and export - professional videos. -
- -- Your search for "{searchQuery}" did not return any results. -
- -+ Your search for "{searchQuery}" did not return any results. +
++ Start creating your first project. Import media, edit, and export your + videos. All privately. +
+- What's coming next for OpenCut (last updated: July 14, 2025) -
-- OpenCut is open source and built by the community. Every - contribution, no matter how small, helps us build the best - free video editor possible. -
-+ Support OpenCut and help us build the future of privacy-first video + editing. +
+{sponsor.description}
+- Fair and transparent terms for our free, open-source video - editor. -
-- OpenCut is a free, open-source video editor that runs in - your browser. By using our service, you agree to these - terms. We've designed these terms to be fair and protect - both you and our project. -
-- Key principle: Your content stays on your - device. We never claim ownership of your videos or projects. -
-+ Questions? Email us at{" "} + + oss@opencut.app + +
+- You own everything you create. OpenCut - processes your videos locally on your device, so we never - have access to your content. We make no claims to ownership, - licensing, or rights over your videos, projects, or any - content you create using OpenCut. -
-+ You own everything you create. OpenCut processes + basic editing locally on your device. For AI features, content is + encrypted before upload and we cannot access your original files. We + make no claims to ownership, licensing, or rights over your videos, + projects, or any content you create using OpenCut. +
+- OpenCut is free for personal and commercial use. You can: -
-- What we ask: Don't use OpenCut for illegal - activities, harassment, or creating harmful content. Be - respectful of others and follow applicable laws. -
-OpenCut is free for personal and commercial use. You can:
++ What we ask: Don't use OpenCut for illegal + activities, harassment, or creating harmful content. Be respectful of + others and follow applicable laws. +
+- To use certain features, you may create an account: -
-- OpenCut is provided "as is" without warranties. While we - strive for reliability, we can't guarantee uninterrupted - service. -
-+ OpenCut offers optional AI-powered features that require server + processing: +
++ By using AI features, you consent to the temporary, encrypted + processing of your content as described in our Privacy Policy. You can + always choose to use only local editing features. +
+- Because OpenCut is open source, you have additional rights: -
-- View our source code and license on{" "} - - GitHub - - . -
-To use certain features, you may create an account:
++ OpenCut is provided "as is" without warranties. While we strive for + reliability, we can't guarantee uninterrupted service. +
+- When using OpenCut, make sure you have the right to use any - content you import: -
-Because OpenCut is open source, you have additional rights:
++ View our source code and license on{" "} + + GitHub + + . +
+- OpenCut is provided free of charge. To the extent permitted - by law: -
-- Since your content stays on your device, we have no way to - recover lost projects. Consider exporting important videos - when finished editing. -
-+ When using OpenCut, make sure you have the right to use any content + you import: +
+We may update OpenCut and these terms:
-+ OpenCut is provided free of charge. To the extent permitted by law: +
++ Since your content stays on your device, we have no way to recover + lost projects. Consider exporting important videos when finished + editing. +
+- You can stop using OpenCut at any time: -
-We may update OpenCut and these terms:
+- Questions about these terms or need to report an issue? -
-- Contact us through our{" "} - - GitHub repository - - , email us at{" "} - - oss@opencut.app - - , or reach out on{" "} - - X (Twitter) - - . -
-- These terms are governed by applicable law in your - jurisdiction. We prefer to resolve disputes through friendly - discussion in our open-source community. -
-You can stop using OpenCut at any time:
+- Last updated: July 14, 2025 -
-Questions about these terms or need to report an issue?
++ Contact us through our{" "} + + GitHub repository + + , email us at{" "} + + oss@opencut.app + + , or reach out on{" "} + + X (Twitter) + + . +
++ These terms are governed by applicable law in your jurisdiction. We + prefer to resolve disputes through friendly discussion in our + open-source community. +
++ Last updated: July 14, 2025 +
+ + ); } diff --git a/apps/web/src/app/why-not-capcut/page.tsx b/apps/web/src/app/why-not-capcut/page.tsx deleted file mode 100644 index b05860a6..00000000 --- a/apps/web/src/app/why-not-capcut/page.tsx +++ /dev/null @@ -1,191 +0,0 @@ -import { Header } from "@/components/header"; - -export default function WhyNotCapcut() { - return ( -- Roasting time, so get ready motherfucker. -
-- You probably use CapCut and think your video editing is - special. You think your fucking TikTok with 47 transitions and - 12 different fonts is going to get you some viral fame. You - think loading up every goddamn effect in their library makes - your content better. Wrong, motherfucker. Let me describe what - CapCut actually gives you: -
-- Well guess what, motherfucker: -
-- You. Are. Getting. Scammed. Look at this shit. It's a fucking - video editor. Why the fuck do you need to pay $20/month just - to remove a goddamn watermark? You spent hours editing your - video and they slap their logo on it like they fucking made - it. -
-- This motherfucking dialog pops up more than ads on a pirated - movie site. Want to add a transition? Get Pro. Want to export - without their watermark? Get Pro. Want to use more than 2 - fonts? Get fucking Pro, peasant. -
-- Did you seriously think you could edit a video without seeing - this dialog 47 times? You click one button and BAM - there it - is again, asking for your credit card like a desperate ex - asking for money. -
-- You dumbass. You thought CapCut was free, but no. Free means - they let you open the app. Everything else costs money. Basic - shake effect? That'll be $20/month. A decent transition that - isn't "fade"? Pay up, motherfucker. -
-- Here's my favorite piece of bullshit: You import an MP3 file - - you know, AUDIO - and try to export. "Sorry, can't export - because you're using our premium extract audio feature!" -
-- - My MP3 was already fucking audio, you absolute morons. - -
-- But wait, there's more! If you drag that same MP3 to their - media panel first, then to the timeline, it magically works. - This isn't a bug, it's a fucking scam disguised as software - engineering. -
-- Look at this shit. You upload your content and they basically - say "thanks for the free content, we own it now, but if Disney - sues anyone, that's your problem." -
-- CapCut's Terms of Service: We get full rights - to use, modify, distribute, and monetize everything you upload - - permanently and without paying you shit. But you're still - responsible if anything goes wrong. -
-- Translation: "We'll make money off your viral video, you - handle the lawsuits." Brilliant legal strategy, you fucks. -
-- Here's the thing that makes me want to punch my monitor: the - actual video editor is fucking good. It's intuitive, powerful, - and anyone can figure it out. When it's not begging for money - every 30 seconds, it actually works well. -
-- Which makes everything else so much worse. They built - something people want to use, then turned it into a digital - slot machine. Every click might trigger a payment request. -
-- Like the person who's never used software that doesn't - constantly beg for money, you have no fucking idea what a - video editor should be. All you've ever seen are predatory - apps disguised as creative tools. -
-- A real video editor lets you edit videos. It doesn't steal - your content. It doesn't pop up payment dialogs every 5 - seconds. It doesn't charge you separately for basic features - that should be free. -
-- I'm not actually saying all video editors should be basic as - shit. What I'm saying is that all the problems we have with - video editing apps are{" "} - ones they create themselves. Video editors - aren't broken by default - they edit videos, export them, and - let you use basic features without constantly begging for - money. CapCut breaks them. They turn them into payment - processors with video editing as a side feature. -
-
- "Good software gets out of your way."
-
- Some smart motherfucker who definitely wasn't working
- at CapCut
-