fix: update brand name

This commit is contained in:
Stanley Cheung 2026-02-11 15:56:48 +08:00
parent 4f983387ac
commit 4c67ec6209
50 changed files with 117 additions and 806 deletions

View File

@ -1,188 +0,0 @@
# Contributing to OpenCut
⚠️ We are currently NOT accepting feature PRs while we build out the core editor.
If you want to contribute:
1. Open an issue first to discuss
2. Wait for maintainer approval
3. Only then start coding
Critical bug fixes may be accepted on a case-by-case basis.
Thank you for your interest in contributing to OpenCut! This document provides guidelines and instructions for contributing.
## Getting Started
### Prerequisites
- [Node.js](https://nodejs.org/en/) (v18 or later)
- [Bun](https://bun.sh/docs/installation)
(for `npm` alternative)
- [Docker](https://docs.docker.com/get-docker/) and [Docker Compose](https://docs.docker.com/compose/install/)
> **Note:** Docker is optional, but it's essential for running the local database and Redis services. If you're planning to contribute to frontend features, you can skip the Docker setup. If you have followed the steps below in [Setup](#setup), you're all set to go!
### Setup
1. Fork the repository
2. Clone your fork locally
3. Navigate to the web app directory: `cd apps/web`
4. Copy `.env.example` to `.env.local`:
```bash
# Unix/Linux/Mac
cp .env.example .env.local
# Windows Command Prompt
copy .env.example .env.local
# Windows PowerShell
Copy-Item .env.example .env.local
```
5. Install dependencies: `bun install`
6. Start the development server: `bun run dev`
> **Note:** If you see an error like `Unsupported URL Type "workspace:*"` when running `npm install`, you have two options:
>
> 1. Upgrade to a recent npm version (v9 or later), which has full workspace protocol support.
> 2. Use an alternative package manager such as **bun** or **pnpm**.
## What to Focus On
**🎯 Good Areas to Contribute:**
- Timeline functionality and UI improvements
- Project management features
- Performance optimizations
- Bug fixes in existing functionality
- UI/UX improvements
- Documentation and testing
**⚠️ Areas to Avoid:**
- Preview panel enhancements (text fonts, stickers, effects)
- Export functionality improvements
- Preview rendering optimizations
**Why?** We're currently planning a major refactor of the preview system. The current preview renders DOM elements (HTML), but we're moving to a binary rendering approach similar to CapCut. This new system will ensure consistency between preview and export, and provide much better performance and quality.
The current HTML-based preview is essentially a prototype - the binary approach will be the "real deal." To avoid wasted effort, please focus on other areas of the application until this refactor is complete.
If you're unsure whether your idea falls into the preview category, feel free to ask us [directly in discord](https://discord.gg/zmR9N35cjK) or create a GitHub issue!
## Development Setup
### Local Development
1. Start the database and Redis services:
```bash
# From project root
docker-compose up -d
```
2. Navigate to the web app directory:
```bash
cd apps/web
```
3. Copy `.env.example` to `.env.local`:
```bash
# Unix/Linux/Mac
cp .env.example .env.local
# Windows Command Prompt
copy .env.example .env.local
# Windows PowerShell
Copy-Item .env.example .env.local
```
4. Configure required environment variables in `.env.local`:
**Required Variables:**
```bash
# Database (matches docker-compose.yaml)
DATABASE_URL="postgresql://opencut:opencut@localhost:5432/opencut"
# Generate a secure secret for Better Auth
BETTER_AUTH_SECRET="your-generated-secret-here"
NEXT_PUBLIC_SITE_URL="http://localhost:3000"
# Redis (matches docker-compose.yaml)
UPSTASH_REDIS_REST_URL="http://localhost:8079"
UPSTASH_REDIS_REST_TOKEN="example_token"
# Development
NODE_ENV="development"
```
**Generate BETTER_AUTH_SECRET:**
```bash
# Unix/Linux/Mac
openssl rand -base64 32
# Windows PowerShell (simple method)
[System.Web.Security.Membership]::GeneratePassword(32, 0)
# Cross-platform (using Node.js)
node -e "console.log(require('crypto').randomBytes(32).toString('base64'))"
# Or use an online generator: https://generate-secret.vercel.app/32
```
5. Run database migrations: `bun run db:migrate`
6. Start the development server: `bun run dev`
## How to Contribute
### Reporting Bugs
- Use the bug report template
- Include steps to reproduce
- Provide screenshots if applicable
### Suggesting Features
- Use the feature request template
- Explain the use case
- Consider implementation details
### Code Contributions
1. Create a new branch: `git checkout -b feature/your-feature-name`
2. Make your changes
3. Navigate to the web app directory: `cd apps/web`
4. Run the linter: `bun run lint`
5. Format your code: `bunx biome format --write .`
6. Commit your changes with a descriptive message
7. Push to your fork and create a pull request
## Code Style
- We use Biome for code formatting and linting
- Run `bunx biome format --write .` from the `apps/web` directory to format code
- Run `bun run lint` from the `apps/web` directory to check for linting issues
- Follow the existing code patterns
## Pull Request Process
1. Fill out the pull request template completely
2. Link any related issues
3. Ensure CI passes
4. Request review from maintainers
5. Address any feedback
## Community
- Be respectful and inclusive
- Follow our Code of Conduct
- Help others in discussions and issues
Thank you for contributing!

View File

@ -1,42 +0,0 @@
name: Feature request
description: Suggest an idea for OpenCut
title: "[FEATURE] "
labels: enhancement
body:
- type: markdown
attributes:
value: Please make sure that no duplicated issues has already been delivered.
- type: textarea
id: problem
attributes:
label: Problem
placeholder: Is your feature request related to a problem? Please describe.
description: A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
validations:
required: true
- type: textarea
id: solution
attributes:
label: Solution
placeholder: Describe the solution you'd like.
description: A clear and concise description of what you want to happen.
validations:
required: true
- type: textarea
id: alternative
attributes:
label: Alternative
placeholder: Describe alternatives you've considered.
description: A clear and concise description of any alternative solutions or features you've considered.
validations:
required: true
- type: textarea
id: additional-context
attributes:
label: Anything else?
description: |
Links? References? Anything that will give us more context about the issue you are encountering!
Tip: You can attach images or log files by clicking this area to highlight it and then dragging files in.
validations:
required: false

28
.github/SECURITY.md vendored
View File

@ -1,28 +0,0 @@
# Security Policy
## Supported Versions
| Version | Supported |
| ------- | ------------------ |
| 1.x.x | :white_check_mark: |
## Reporting a Vulnerability
We take security vulnerabilities seriously. If you discover a security vulnerability within OpenCut, please send an email to security@opencut.app. All security vulnerabilities will be promptly addressed.
Please do not report security vulnerabilities through public GitHub issues.
### What to include in your report
- Description of the vulnerability
- Steps to reproduce
- Potential impact
- Any suggested fixes
### Response timeline
- We will acknowledge receipt within 48 hours
- We will provide a detailed response within 5 business days
- We will keep you updated on our progress
Thank you for helping keep OpenCut secure!

27
.github/SUPPORT.md vendored
View File

@ -1,27 +0,0 @@
# Getting Help
Thanks for using OpenCut! If you need help, here are your options:
## Documentation
- Check our [README](../README.md) for basic setup instructions
- Review the [Contributing Guidelines](CONTRIBUTING.md) for development setup
## Issues
- **Bug reports**: Use the bug report template
- **Feature requests**: Use the feature request template
- **Questions**: Use GitHub Discussions for general questions
## Community
- Join our discussions on GitHub
- Follow the [Code of Conduct](CODE_OF_CONDUCT.md)
## Response Times
- Issues are typically triaged within 2-3 business days
- Feature requests may take longer to evaluate
- Security issues are handled with priority
We appreciate your patience and contributions to making OpenCut better!

View File

@ -1,95 +0,0 @@
name: Bun CI
concurrency:
group: bun-ci-${{ github.ref }}
cancel-in-progress: true
on:
push:
branches: [main]
paths-ignore:
- "*.md"
pull_request:
branches: [main]
paths-ignore:
- "*.md"
jobs:
build:
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
env:
DATABASE_URL: "postgresql://opencut:opencut@localhost:5432/opencut"
BETTER_AUTH_SECRET: "supersecret"
NEXT_PUBLIC_SITE_URL: "http://localhost:3000"
UPSTASH_REDIS_REST_URL: "https://your-upstash-redis-url"
UPSTASH_REDIS_REST_TOKEN: "your-upstash-redis-token"
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Install Bun
uses: oven-sh/setup-bun@735343b667d3e6f658f44d0eca948eb6282f2b76
with:
bun-version: 1.2.18
- name: Cache Bun modules
uses: actions/cache@v4
with:
path: ~/.bun/install/cache
key: ${{ runner.os }}-bun-1.2.18-${{ hashFiles('apps/web/bun.lock') }}
- name: Install dependencies
working-directory: apps/web
run: bun install
- name: Build
working-directory: apps/web
run: bun run build
- name: Run tests
working-directory: apps/web
run: bun run test
coverage:
runs-on: ubuntu-latest
env:
DATABASE_URL: "postgresql://opencut:opencut@localhost:5432/opencut"
BETTER_AUTH_SECRET: "supersecret"
NEXT_PUBLIC_SITE_URL: "http://localhost:3000"
UPSTASH_REDIS_REST_URL: "https://your-upstash-redis-url"
UPSTASH_REDIS_REST_TOKEN: "your-upstash-redis-token"
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Install Bun
uses: oven-sh/setup-bun@735343b667d3e6f658f44d0eca948eb6282f2b76
with:
bun-version: 1.2.18
- name: Cache Bun modules
uses: actions/cache@v4
with:
path: ~/.bun/install/cache
key: ubuntu-bun-1.2.18-${{ hashFiles('apps/web/bun.lock') }}
- name: Install dependencies
working-directory: apps/web
run: bun install
- name: Generate coverage
working-directory: apps/web
run: bun run test:coverage
- name: Upload coverage artifact
uses: actions/upload-artifact@v4
with:
name: web-coverage-lcov
path: apps/web/coverage

View File

@ -1,7 +0,0 @@
Copyright 2025 OpenCut
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

183
README.md
View File

@ -1,183 +0,0 @@
<table width="100%">
<tr>
<td align="left" width="120">
<img src="apps/web/public/logos/opencut/1k/logo-white-black.png" alt="OpenCut Logo" width="100" />
</td>
<td align="right">
<h1>OpenCut</span></h1>
<h3 style="margin-top: -10px;">A free, open-source video editor for web, desktop, and mobile.</h3>
</td>
</tr>
</table>
## Why?
- **Privacy**: Your videos stay on your device
- **Free features**: Most basic CapCut features are now paywalled
- **Simple**: People want editors that are easy to use - CapCut proved that
## Features
- Timeline-based editing
- Multi-track support
- Real-time preview
- No watermarks or subscriptions
- Analytics provided by [Databuddy](https://www.databuddy.cc?utm_source=opencut), 100% Anonymized & Non-invasive.
- Blog powered by [Marble](https://marblecms.com?utm_source=opencut), Headless CMS.
## Project Structure
- `apps/web/` Main Next.js web application
- `src/components/` UI and editor components
- `src/hooks/` Custom React hooks
- `src/lib/` Utility and API logic
- `src/stores/` State management (Zustand, etc.)
- `src/types/` TypeScript types
## Getting Started
### Prerequisites
Before you begin, ensure you have the following installed on your system:
- [Node.js](https://nodejs.org/en/) (v18 or later)
- [Bun](https://bun.sh/docs/installation)
(for `npm` alternative)
- [Docker](https://docs.docker.com/get-docker/) and [Docker Compose](https://docs.docker.com/compose/install/)
> **Note:** Docker is optional, but it's essential for running the local database and Redis services. If you're planning to run the frontend or want to contribute to frontend features, you can skip the Docker setup. If you have followed the steps below in [Setup](#setup), you're all set to go!
### Setup
1. Fork the repository
2. Clone your fork locally
3. Navigate to the web app directory: `cd apps/web`
4. Copy `.env.example` to `.env.local`:
```bash
# Unix/Linux/Mac
cp .env.example .env.local
# Windows Command Prompt
copy .env.example .env.local
# Windows PowerShell
Copy-Item .env.example .env.local
```
5. Install dependencies: `bun install`
6. Start the development server: `bun dev`
## Development Setup
### Local Development
1. Start the database and Redis services:
```bash
# From project root
docker-compose up -d
```
2. Navigate to the web app directory:
```bash
cd apps/web
```
3. Copy `.env.example` to `.env.local`:
```bash
# Unix/Linux/Mac
cp .env.example .env.local
# Windows Command Prompt
copy .env.example .env.local
# Windows PowerShell
Copy-Item .env.example .env.local
```
4. Configure required environment variables in `.env.local`:
**Required Variables:**
```bash
# Database (matches docker-compose.yaml)
DATABASE_URL="postgresql://opencut:opencut@localhost:5432/opencut"
# Generate a secure secret for Better Auth
BETTER_AUTH_SECRET="your-generated-secret-here"
BETTER_AUTH_URL="http://localhost:3000"
# Redis (matches docker-compose.yaml)
UPSTASH_REDIS_REST_URL="http://localhost:8079"
UPSTASH_REDIS_REST_TOKEN="example_token"
# Marble Blog
MARBLE_WORKSPACE_KEY=cm6ytuq9x0000i803v0isidst # example organization key
NEXT_PUBLIC_MARBLE_API_URL=https://api.marblecms.com
# Development
NODE_ENV="development"
```
**Generate BETTER_AUTH_SECRET:**
```bash
# Unix/Linux/Mac
openssl rand -base64 32
# Windows PowerShell (simple method)
[System.Web.Security.Membership]::GeneratePassword(32, 0)
# Cross-platform (using Node.js)
node -e "console.log(require('crypto').randomBytes(32).toString('base64'))"
# Or use an online generator: https://generate-secret.vercel.app/32
```
5. Run database migrations: `bun run db:migrate` from (inside apps/web)
6. Start the development server: `bun run dev` from (inside apps/web)
The application will be available at [http://localhost:3000](http://localhost:3000).
## Contributing
We welcome contributions! While we're actively developing and refactoring certain areas, there are plenty of opportunities to contribute effectively.
**🎯 Focus areas:** Timeline functionality, project management, performance, bug fixes, and UI improvements outside the preview panel.
**⚠️ Avoid for now:** Preview panel enhancements (fonts, stickers, effects) and export functionality - we're refactoring these with a new binary rendering approach.
See our [Contributing Guide](.github/CONTRIBUTING.md) for detailed setup instructions, development guidelines, and complete focus area guidance.
**Quick start for contributors:**
- Fork the repo and clone locally
- Follow the setup instructions in CONTRIBUTING.md
- Create a feature branch and submit a PR
## Sponsors
Thanks to [Vercel](https://vercel.com?utm_source=github-opencut&utm_campaign=oss) and [fal.ai](https://fal.ai?utm_source=github-opencut&utm_campaign=oss) for their support of open-source software.
<a href="https://vercel.com/oss">
<img alt="Vercel OSS Program" src="https://vercel.com/oss/program-badge.svg" />
</a>
<a href="https://fal.ai">
<img alt="Powered by fal.ai" src="https://img.shields.io/badge/Powered%20by-fal.ai-000000?style=flat&logo=data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTEyIDJMMTMuMDkgOC4yNkwyMCAxMEwxMy4wOSAxNS43NEwxMiAyMkwxMC45MSAxNS43NEw0IDEwTDEwLjkxIDguMjZMMTIgMloiIGZpbGw9IndoaXRlIi8+Cjwvc3ZnPgo=" />
</a>
---
[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2FOpenCut-app%2FOpenCut&project-name=opencut&repository-name=opencut)
## License
[MIT LICENSE](LICENSE)
---
![Star History Chart](https://api.star-history.com/svg?repos=opencut-app/opencut&type=Date)

View File

@ -10,7 +10,7 @@ NEXT_PUBLIC_MARBLE_API_URL=https://api.marblecms.com
NEXT_PUBLIC_AUTH_API_BASE_URL=http://localhost:3001/api
# Server
DATABASE_URL="postgresql://opencut:opencut@localhost:5432/opencut"
DATABASE_URL="postgresql://vibecut:vibecut@localhost:5432/vibecut"
BETTER_AUTH_SECRET=your_better_auth_secret
UPSTASH_REDIS_REST_URL=http://localhost:8079
@ -24,6 +24,6 @@ FREESOUND_API_KEY=your_api_key_here
CLOUDFLARE_ACCOUNT_ID=your_account_id_here
R2_ACCESS_KEY_ID=your_access_key_here
R2_SECRET_ACCESS_KEY=your_secret_key_here
R2_BUCKET_NAME=opencut-transcription # whatever you named your r2 bucket
R2_BUCKET_NAME=vibecut-transcription # whatever you named your r2 bucket
MODAL_TRANSCRIPTION_URL=your_modal_url_here

View File

@ -1,6 +1,6 @@
import type { Config } from "drizzle-kit";
import * as dotenv from "dotenv";
import { webEnv } from "@opencut/env/web";
import { webEnv } from "@vibecut/env/web";
// Load the right env file based on environment
if (webEnv.NODE_ENV === "production") {

View File

@ -2,7 +2,7 @@ import { expect, test } from "@playwright/test";
test("login loads backend projects list on /projects", async ({ context, page }) => {
await page.addInitScript(() => {
window.localStorage.setItem("opencut_workspace_id", "ws-1");
window.localStorage.setItem("vibecut_workspace_id", "ws-1");
});
await context.addCookies([

View File

@ -176,7 +176,7 @@ test.beforeEach(async ({ context, page }) => {
]);
await page.addInitScript(() => {
window.localStorage.setItem("opencut_workspace_id", "ws-1");
window.localStorage.setItem("vibecut_workspace_id", "ws-1");
});
});

View File

@ -1,5 +1,5 @@
{
"name": "@opencut/web",
"name": "@vibecut/web",
"version": "0.1.0",
"private": true,
"packageManager": "bun@1.2.18",
@ -33,8 +33,8 @@
"@hugeicons/core-free-icons": "^3.1.1",
"@hugeicons/react": "^1.1.4",
"@huggingface/transformers": "^3.8.1",
"@opencut/env": "workspace:*",
"@opencut/ui": "workspace:*",
"@vibecut/env": "workspace:*",
"@vibecut/ui": "workspace:*",
"@radix-ui/react-dialog": "^1.1.15",
"@radix-ui/react-select": "^2.2.6",
"@radix-ui/react-separator": "^1.1.8",

View File

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 10 KiB

View File

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

View File

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 22 KiB

View File

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 4.7 KiB

View File

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 22 KiB

View File

Before

Width:  |  Height:  |  Size: 4.1 KiB

After

Width:  |  Height:  |  Size: 4.1 KiB

View File

Before

Width:  |  Height:  |  Size: 51 KiB

After

Width:  |  Height:  |  Size: 51 KiB

View File

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

View File

Before

Width:  |  Height:  |  Size: 53 KiB

After

Width:  |  Height:  |  Size: 53 KiB

View File

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 10 KiB

View File

Before

Width:  |  Height:  |  Size: 362 B

After

Width:  |  Height:  |  Size: 362 B

View File

@ -1,5 +1,5 @@
{
"name": "OpenCut",
"name": "VibeCut",
"description": "A simple but powerful video editor that gets the job done. In your browser.",
"display": "standalone",
"start_url": "/",

View File

@ -1,4 +1,4 @@
import { webEnv } from "@opencut/env/web";
import { webEnv } from "@vibecut/env/web";
import { type NextRequest, NextResponse } from "next/server";
import { z } from "zod";
import { checkRateLimit } from "@/lib/rate-limit";

View File

@ -2,7 +2,7 @@
import Link from "next/link";
import { useRouter, useSearchParams } from "next/navigation";
import { useEffect, useState } from "react";
import { Suspense, useEffect, useState } from "react";
import { Button } from "@/components/ui/button";
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
import { Input } from "@/components/ui/input";
@ -10,6 +10,14 @@ import { Label } from "@/components/ui/label";
import { useAuthStore } from "@/stores/auth-store";
export default function LoginPage() {
return (
<Suspense fallback={null}>
<LoginContent />
</Suspense>
);
}
function LoginContent() {
const router = useRouter();
const searchParams = useSearchParams();
const nextPath = searchParams.get("next") || "/projects";

View File

@ -2,7 +2,7 @@
import Link from "next/link";
import { useRouter, useSearchParams } from "next/navigation";
import { useEffect, useState } from "react";
import { Suspense, useEffect, useState } from "react";
import { Button } from "@/components/ui/button";
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
import { Input } from "@/components/ui/input";
@ -10,6 +10,14 @@ import { Label } from "@/components/ui/label";
import { useAuthStore } from "@/stores/auth-store";
export default function RegisterPage() {
return (
<Suspense fallback={null}>
<RegisterContent />
</Suspense>
);
}
function RegisterContent() {
const router = useRouter();
const searchParams = useSearchParams();
const nextPath = searchParams.get("next") || "/projects";

View File

@ -5,7 +5,7 @@ import { Toaster } from "../components/ui/sonner";
import { TooltipProvider } from "../components/ui/tooltip";
import { baseMetaData } from "./metadata";
import { BotIdClient } from "botid/client";
import { webEnv } from "@opencut/env/web";
import { webEnv } from "@vibecut/env/web";
import { Inter } from "next/font/google";
import { AuthProvider } from "@/components/providers/auth-provider";
import { AuthGuard } from "@/components/auth/auth-guard";

View File

@ -17,7 +17,7 @@ export const baseMetaData: Metadata = {
url: SITE_INFO.openGraphImage,
width: 1200,
height: 630,
alt: "OpenCut Wordmark",
alt: "VibeCut Wordmark",
},
],
},
@ -25,7 +25,7 @@ export const baseMetaData: Metadata = {
card: "summary_large_image",
title: SITE_INFO.title,
description: SITE_INFO.description,
creator: "@opencutapp",
creator: "@vibecutapp",
images: [SITE_INFO.twitterImage],
},
pinterest: {

View File

@ -10,13 +10,13 @@ import { Separator } from "@/components/ui/separator";
import { SOCIAL_LINKS } from "@/constants/site-constants";
export const metadata: Metadata = {
title: "Privacy Policy - OpenCut",
title: "Privacy Policy - VibeCut",
description:
"Learn how OpenCut handles your data and privacy. Our commitment to protecting your information while you edit videos.",
"Learn how VibeCut handles your data and privacy. Our commitment to protecting your information while you edit videos.",
openGraph: {
title: "Privacy Policy - OpenCut",
title: "Privacy Policy - VibeCut",
description:
"Learn how OpenCut handles your data and privacy. Our commitment to protecting your information while you edit videos.",
"Learn how VibeCut handles your data and privacy. Our commitment to protecting your information while you edit videos.",
type: "website",
},
};
@ -65,10 +65,10 @@ export default function PrivacyPage() {
<p className="mt-4">
Questions? Email us at{" "}
<a
href="mailto:oss@opencut.app"
href="mailto:oss@vibecut.app"
className="text-primary hover:underline"
>
oss@opencut.app
oss@vibecut.app
</a>
</p>
</AccordionContent>
@ -172,7 +172,7 @@ export default function PrivacyPage() {
Databuddy
</a>{" "}
for completely anonymized and non-invasive analytics to understand how
people use OpenCut.
people use VibeCut.
</p>
<p>
This helps us improve the editor, but we never collect personal
@ -197,7 +197,7 @@ export default function PrivacyPage() {
<section className="flex flex-col gap-3">
<h2 className="text-2xl font-semibold">Third-Party Services</h2>
<p>OpenCut integrates with these services:</p>
<p>VibeCut integrates with these services:</p>
<ul className="list-disc space-y-2 pl-6">
<li>
<strong>Google OAuth:</strong> For optional Google sign-in (governed
@ -226,7 +226,7 @@ export default function PrivacyPage() {
<section className="flex flex-col gap-3">
<h2 className="text-2xl font-semibold">Open Source Transparency</h2>
<p>
OpenCut is completely open source. You can review our code, see
VibeCut is completely open source. You can review our code, see
exactly how we handle data, and even self-host the application if you
prefer.
</p>
@ -259,10 +259,10 @@ export default function PrivacyPage() {
</a>
, email us at{" "}
<a
href="mailto:oss@opencut.app"
href="mailto:oss@vibecut.app"
className="text-primary hover:underline"
>
oss@opencut.app
oss@vibecut.app
</a>
, or reach out on{" "}
<a

View File

@ -44,7 +44,7 @@ import {
ArrowDown02Icon,
InformationCircleIcon,
} from "@hugeicons/core-free-icons";
import { OcVideoIcon } from "@opencut/ui/icons";
import { OcVideoIcon } from "@vibecut/ui/icons";
import { Label } from "@/components/ui/label";
import { useAuthStore } from "@/stores/auth-store";
import { backendAuthApi } from "@/lib/auth/api-client";

View File

@ -10,13 +10,13 @@ import { Separator } from "@/components/ui/separator";
import { SOCIAL_LINKS } from "@/constants/site-constants";
export const metadata: Metadata = {
title: "Terms of Service - OpenCut",
title: "Terms of Service - VibeCut",
description:
"OpenCut's Terms of Service. Fair, transparent terms for our free and open-source video editor.",
"VibeCut's Terms of Service. Fair, transparent terms for our free and open-source video editor.",
openGraph: {
title: "Terms of Service - OpenCut",
title: "Terms of Service - VibeCut",
description:
"OpenCut's Terms of Service. Fair, transparent terms for our free and open-source video editor.",
"VibeCut's Terms of Service. Fair, transparent terms for our free and open-source video editor.",
type: "website",
},
};
@ -52,7 +52,7 @@ export default function TermsPage() {
Free for personal and commercial use with no watermarks or
restrictions
</li>
<li>Don't use OpenCut for illegal activities or harassment</li>
<li>Don't use VibeCut for illegal activities or harassment</li>
<li>
Service provided "as is" - we can't guarantee perfect uptime
</li>
@ -68,10 +68,10 @@ export default function TermsPage() {
<p className="mt-4">
Questions? Email us at{" "}
<a
href="mailto:oss@opencut.app"
href="mailto:oss@vibecut.app"
className="text-primary hover:underline"
>
oss@opencut.app
oss@vibecut.app
</a>
</p>
</AccordionContent>
@ -81,11 +81,11 @@ export default function TermsPage() {
<section className="flex flex-col gap-3">
<h2 className="text-2xl font-semibold">Your Content, Your Rights</h2>
<p>
<strong>You own everything you create.</strong> OpenCut processes
<strong>You own everything you create.</strong> VibeCut 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.
projects, or any content you create using VibeCut.
</p>
<ul className="list-disc space-y-2 pl-6">
<li>
@ -97,25 +97,25 @@ export default function TermsPage() {
content
</li>
<li>You can export and use your content however you choose</li>
<li>No watermarks, no licensing restrictions from OpenCut</li>
<li>No watermarks, no licensing restrictions from VibeCut</li>
</ul>
</section>
<section className="flex flex-col gap-3">
<h2 className="text-2xl font-semibold">How You Can Use OpenCut</h2>
<p>OpenCut is free for personal and commercial use. You can:</p>
<h2 className="text-2xl font-semibold">How You Can Use VibeCut</h2>
<p>VibeCut is free for personal and commercial use. You can:</p>
<ul className="list-disc space-y-2 pl-6">
<li>
Create videos for personal, educational, or commercial purposes
</li>
<li>Use OpenCut for client work and paid projects</li>
<li>Share and distribute videos created with OpenCut</li>
<li>Use VibeCut for client work and paid projects</li>
<li>Share and distribute videos created with VibeCut</li>
<li>
Modify and distribute the OpenCut software (under MIT license)
Modify and distribute the VibeCut software (under MIT license)
</li>
</ul>
<p>
<strong>What we ask:</strong> Don't use OpenCut for illegal
<strong>What we ask:</strong> Don't use VibeCut for illegal
activities, harassment, or creating harmful content. Be respectful of
others and follow applicable laws.
</p>
@ -126,7 +126,7 @@ export default function TermsPage() {
AI Features and Data Processing
</h2>
<p>
OpenCut offers optional AI-powered features that require server
VibeCut offers optional AI-powered features that require server
processing:
</p>
<ul className="list-disc space-y-2 pl-6">
@ -160,17 +160,17 @@ export default function TermsPage() {
<li>You can delete your account at any time</li>
</ul>
<p>
OpenCut is provided "as is" without warranties. While we strive for
VibeCut is provided "as is" without warranties. While we strive for
reliability, we can't guarantee uninterrupted service.
</p>
</section>
<section className="flex flex-col gap-3">
<h2 className="text-2xl font-semibold">Open Source Benefits</h2>
<p>Because OpenCut is open source, you have additional rights:</p>
<p>Because VibeCut is open source, you have additional rights:</p>
<ul className="list-disc space-y-2 pl-6">
<li>Review our code to see exactly how we handle your data</li>
<li>Self-host OpenCut on your own servers</li>
<li>Self-host VibeCut on your own servers</li>
<li>Modify the software to suit your needs</li>
<li>Contribute improvements back to the community</li>
</ul>
@ -191,7 +191,7 @@ export default function TermsPage() {
<section className="flex flex-col gap-3">
<h2 className="text-2xl font-semibold">Third-Party Content</h2>
<p>
When using OpenCut, make sure you have the right to use any content
When using VibeCut, make sure you have the right to use any content
you import:
</p>
<ul className="list-disc space-y-2 pl-6">
@ -209,7 +209,7 @@ export default function TermsPage() {
<section className="flex flex-col gap-3">
<h2 className="text-2xl font-semibold">Limitations and Liability</h2>
<p>
OpenCut is provided free of charge. To the extent permitted by law:
VibeCut is provided free of charge. To the extent permitted by law:
</p>
<ul className="list-disc space-y-2 pl-6">
<li>We're not liable for any loss of data or content</li>
@ -229,7 +229,7 @@ export default function TermsPage() {
<section className="flex flex-col gap-3">
<h2 className="text-2xl font-semibold">Service Changes</h2>
<p>We may update OpenCut and these terms:</p>
<p>We may update VibeCut and these terms:</p>
<ul className="list-disc space-y-2 pl-6">
<li>We'll notify you of significant changes to these terms</li>
<li>Continued use means you accept any updates</li>
@ -240,11 +240,11 @@ export default function TermsPage() {
<section className="flex flex-col gap-3">
<h2 className="text-2xl font-semibold">Termination</h2>
<p>You can stop using OpenCut at any time:</p>
<p>You can stop using VibeCut at any time:</p>
<ul className="list-disc space-y-2 pl-6">
<li>Delete your account through your profile settings</li>
<li>Clear your browser data to remove local projects</li>
<li>Your content remains yours even if you stop using OpenCut</li>
<li>Your content remains yours even if you stop using VibeCut</li>
<li>We may suspend accounts for violations of these terms</li>
</ul>
</section>
@ -264,10 +264,10 @@ export default function TermsPage() {
</a>
, email us at{" "}
<a
href="mailto:oss@opencut.app"
href="mailto:oss@vibecut.app"
className="text-primary hover:underline"
>
oss@opencut.app
oss@vibecut.app
</a>
, or reach out on{" "}
<a

View File

@ -1,135 +0,0 @@
"use client";
import { ArrowRightIcon } from "lucide-react";
import { useState } from "react";
import ReactMarkdown from "react-markdown";
import { SOCIAL_LINKS } from "@/constants/site-constants";
import { useLocalStorage } from "@/hooks/storage/use-local-storage";
import { Button } from "../ui/button";
import { Dialog, DialogBody, DialogContent, DialogTitle } from "../ui/dialog";
export function Onboarding() {
const [step, setStep] = useState(0);
const [hasSeenOnboarding, setHasSeenOnboarding] = useLocalStorage({
key: "hasSeenOnboarding",
defaultValue: false,
});
const isOpen = !hasSeenOnboarding;
const handleNext = () => {
setStep(step + 1);
};
const handleClose = () => {
setHasSeenOnboarding({ value: true });
};
const getStepTitle = () => {
switch (step) {
case 0:
return "Welcome to OpenCut Beta! 🎉";
case 1:
return "⚠️ This is a super early beta!";
case 2:
return "🦋 Have fun testing!";
default:
return "OpenCut Onboarding";
}
};
const renderStepContent = () => {
switch (step) {
case 0:
return (
<div className="space-y-5">
<div className="space-y-3">
<Title title="Welcome to OpenCut Beta! 🎉" />
<Description description="You're among the first to try OpenCut - the fully open source CapCut alternative." />
</div>
<NextButton onClick={handleNext}>Next</NextButton>
</div>
);
case 1:
return (
<div className="space-y-5">
<div className="space-y-3">
<Title title={getStepTitle()} />
<Description description="There's still a ton of things to do to make this editor amazing." />
<Description description="A lot of features are still missing. We're working hard to build them out!" />
<Description description="If you're curious, check out our latest updates in [GitHub discussions](https://github.com/OpenCut-app/OpenCut/discussions)." />
</div>
<NextButton onClick={handleNext}>Next</NextButton>
</div>
);
case 2:
return (
<div className="space-y-5">
<div className="space-y-3">
<Title title={getStepTitle()} />
<Description
description={`Join our [Discord](${SOCIAL_LINKS.discord}), chat with cool people and share feedback to help make OpenCut the best editor ever.`}
/>
</div>
<NextButton onClick={handleClose}>Finish</NextButton>
</div>
);
default:
return null;
}
};
return (
<Dialog open={isOpen} onOpenChange={handleClose}>
<DialogContent className="sm:max-w-[425px]">
<DialogTitle>
<span className="sr-only">{getStepTitle()}</span>
</DialogTitle>
<DialogBody>{renderStepContent()}</DialogBody>
</DialogContent>
</Dialog>
);
}
function Title({ title }: { title: string }) {
return <h2 className="text-lg font-bold md:text-xl">{title}</h2>;
}
function Description({ description }: { description: string }) {
return (
<div className="text-muted-foreground">
<ReactMarkdown
components={{
p: ({ children }) => <p className="mb-0">{children}</p>,
a: ({ href, children }) => (
<a
href={href}
target="_blank"
rel="noopener noreferrer"
className="text-foreground hover:text-foreground/80 underline"
>
{children}
</a>
),
}}
>
{description}
</ReactMarkdown>
</div>
);
}
function NextButton({
children,
onClick,
}: {
children: React.ReactNode;
onClick: () => void;
}) {
return (
<Button onClick={onClick} variant="default" className="w-full">
{children}
<ArrowRightIcon className="size-4" />
</Button>
);
}

View File

@ -37,12 +37,12 @@ export function Footer() {
<div className="mb-4 flex items-center justify-start gap-2">
<Image
src={DEFAULT_LOGO_URL}
alt="OpenCut"
alt="VibeCut"
width={24}
height={24}
className="invert dark:invert-0"
/>
<span className="text-lg font-bold">OpenCut</span>
<span className="text-lg font-bold">VibeCut</span>
</div>
<p className="text-muted-foreground mb-5 text-sm md:text-left">
The privacy-first video editor that feels simple to use.
@ -110,7 +110,7 @@ export function Footer() {
<div className="flex flex-col items-start justify-between gap-4 pt-2 md:flex-row">
<div className="text-muted-foreground flex items-center gap-4 text-sm">
<span>
© {new Date().getFullYear()} OpenCut, All Rights Reserved
© {new Date().getFullYear()} VibeCut, All Rights Reserved
</span>
</div>
</div>

View File

@ -28,7 +28,7 @@ export function Header() {
<Link href="/" className="flex items-center gap-3">
<Image
src={DEFAULT_LOGO_URL}
alt="OpenCut Logo"
alt="VibeCut Logo"
className="invert dark:invert-0"
width={32}
height={32}

View File

@ -1,9 +1,9 @@
import { OcDataBuddyIcon, OcMarbleIcon, } from "@opencut/ui/icons";
import { OcDataBuddyIcon, OcMarbleIcon, } from "@vibecut/ui/icons";
export const SITE_URL = "https://opencut.app";
export const SITE_URL = "https://vibecut.app";
export const SITE_INFO = {
title: "OpenCut",
title: "VibeCut",
description:
"A simple but powerful video editor that gets the job done. In your browser.",
url: SITE_URL,
@ -23,23 +23,23 @@ export const EXTERNAL_TOOLS: ExternalTool[] = [
{
name: "Marble",
description:
"Modern headless CMS for content management and the blog for OpenCut",
url: "https://marblecms.com?utm_source=opencut",
"Modern headless CMS for content management and the blog for VibeCut",
url: "https://marblecms.com?utm_source=vibecut",
icon: OcMarbleIcon,
},
{
name: "Databuddy",
description: "GDPR compliant analytics and user insights for OpenCut",
url: "https://databuddy.cc?utm_source=opencut",
description: "GDPR compliant analytics and user insights for VibeCut",
url: "https://databuddy.cc?utm_source=vibecut",
icon: OcDataBuddyIcon,
},
];
export const DEFAULT_LOGO_URL = "/logos/opencut/svg/logo.svg";
export const DEFAULT_LOGO_URL = "/logos/vibecut/svg/logo.svg";
export const SOCIAL_LINKS = {
x: "https://x.com/opencutapp",
github: "https://github.com/OpenCut-app/OpenCut",
x: "https://x.com/vibecutapp",
github: "https://github.com/VibeCut-app/VibeCut",
discord: "https://discord.com/invite/Mu3acKZvCp",
};
@ -53,14 +53,14 @@ export type Sponsor = {
export const SPONSORS: Sponsor[] = [
{
name: "Fal.ai",
url: "https://fal.ai?utm_source=opencut",
url: "https://fal.ai?utm_source=vibecut",
logo: "/logos/others/fal.svg",
description: "Generative image, video, and audio models all in one place.",
},
{
name: "Vercel",
url: "https://vercel.com?utm_source=opencut",
url: "https://vercel.com?utm_source=vibecut",
logo: "/logos/others/vercel.svg",
description: "Platform where we deploy and host OpenCut.",
description: "Platform where we deploy and host VibeCut.",
},
];

View File

@ -6,7 +6,7 @@ import {
TextIcon,
} from "@hugeicons/core-free-icons";
import { HugeiconsIcon } from "@hugeicons/react";
import { OcVideoIcon } from "@opencut/ui/icons";
import { OcVideoIcon } from "@vibecut/ui/icons";
export const TRACK_COLORS: Record<TrackType, { background: string }> = {
video: {

View File

@ -1,5 +1,5 @@
import { createAuthClient } from "better-auth/react";
import { webEnv } from "@opencut/env/web";
import { webEnv } from "@vibecut/env/web";
export const { signIn, signUp, useSession } = createAuthClient({
baseURL: webEnv.NEXT_PUBLIC_SITE_URL,

View File

@ -2,7 +2,7 @@ import { betterAuth, type RateLimit } from "better-auth";
import { drizzleAdapter } from "better-auth/adapters/drizzle";
import { Redis } from "@upstash/redis";
import { db } from "@/lib/db";
import { webEnv } from "@opencut/env/web";
import { webEnv } from "@vibecut/env/web";
const redis = new Redis({
url: webEnv.UPSTASH_REDIS_REST_URL,
@ -36,7 +36,7 @@ export const auth = betterAuth({
},
},
baseURL: webEnv.NEXT_PUBLIC_SITE_URL,
appName: "OpenCut",
appName: "VibeCut",
trustedOrigins: [webEnv.NEXT_PUBLIC_SITE_URL],
});

View File

@ -6,7 +6,7 @@ export const getBackendApiBaseUrl = () => {
);
};
const WORKSPACE_STORAGE_KEY = "opencut_workspace_id";
const WORKSPACE_STORAGE_KEY = "vibecut_workspace_id";
export const getSelectedWorkspaceId = (): string | null => {
if (typeof window === "undefined") return null;

View File

@ -1,7 +1,7 @@
import { drizzle } from "drizzle-orm/postgres-js";
import postgres from "postgres";
import * as schema from "./schema";
import { webEnv } from "@opencut/env/web";
import { webEnv } from "@vibecut/env/web";
let _db: ReturnType<typeof drizzle> | null = null;

View File

@ -1,6 +1,6 @@
import { Ratelimit } from "@upstash/ratelimit";
import { Redis } from "@upstash/redis";
import { webEnv } from "@opencut/env/web";
import { webEnv } from "@vibecut/env/web";
const redis = new Redis({
url: webEnv.UPSTASH_REDIS_REST_URL,

View File

@ -144,7 +144,7 @@ export const useKeybindingsStore = create<KeybindingsState>()(
},
}),
{
name: "opencut-keybindings",
name: "vibecut-keybindings",
version: CURRENT_VERSION,
partialize: (state) => ({
keybindings: state.keybindings,

View File

@ -3,7 +3,7 @@
"configVersion": 0,
"workspaces": {
"": {
"name": "opencut",
"name": "vibecut",
"dependencies": {
"@types/react": "^19.2.10",
"@types/react-dom": "^19.2.3",
@ -16,7 +16,7 @@
},
},
"apps/web": {
"name": "@opencut/web",
"name": "@vibecut/web",
"version": "0.1.0",
"dependencies": {
"@ffmpeg/core": "^0.12.10",
@ -27,8 +27,8 @@
"@hugeicons/core-free-icons": "^3.1.1",
"@hugeicons/react": "^1.1.4",
"@huggingface/transformers": "^3.8.1",
"@opencut/env": "workspace:*",
"@opencut/ui": "workspace:*",
"@vibecut/env": "workspace:*",
"@vibecut/ui": "workspace:*",
"@radix-ui/react-dialog": "^1.1.15",
"@radix-ui/react-select": "^2.2.6",
"@radix-ui/react-separator": "^1.1.8",
@ -106,7 +106,7 @@
},
},
"packages/env": {
"name": "@opencut/env",
"name": "@vibecut/env",
"version": "0.0.0",
"dependencies": {
"zod": "^4.0.5",
@ -119,7 +119,7 @@
},
},
"packages/ui": {
"name": "@opencut/ui",
"name": "@vibecut/ui",
"version": "0.0.0",
"dependencies": {
"@iconify/react": "^6.0.2",
@ -366,11 +366,11 @@
"@noble/hashes": ["@noble/hashes@2.0.1", "", {}, "sha512-XlOlEbQcE9fmuXxrVTXCTlG2nlRXa9Rj3rr5Ue/+tX+nmkgbX720YHh0VR3hBF9xDvwnb8D2shVGOwNx+ulArw=="],
"@opencut/env": ["@opencut/env@workspace:packages/env"],
"@vibecut/env": ["@vibecut/env@workspace:packages/env"],
"@opencut/ui": ["@opencut/ui@workspace:packages/ui"],
"@vibecut/ui": ["@vibecut/ui@workspace:packages/ui"],
"@opencut/web": ["@opencut/web@workspace:apps/web"],
"@vibecut/web": ["@vibecut/web@workspace:apps/web"],
"@pkgjs/parseargs": ["@pkgjs/parseargs@0.11.0", "", {}, "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg=="],
@ -1606,7 +1606,7 @@
"@joshwooding/vite-plugin-react-docgen-typescript/magic-string": ["magic-string@0.27.0", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.13" } }, "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA=="],
"@opencut/web/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="],
"@vibecut/web/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="],
"@radix-ui/react-accordion/@radix-ui/primitive": ["@radix-ui/primitive@1.1.2", "", {}, "sha512-XnbHrrprsNqZKQhStrSwgRUQzoCI1glLzdw79xiZPoofhGICeZRSQ3dIxAKH1gb3OHfNf4d6f+vAv3kil2eggA=="],

View File

@ -1,24 +1,24 @@
{
"name": "opencut",
"name": "vibecut",
"packageManager": "bun@1.2.18",
"workspaces": [
"apps/*",
"packages/*"
],
"scripts": {
"dev:web": "turbo run dev --filter=@opencut/web",
"build:web": "turbo run build --filter=@opencut/web",
"dev:web": "turbo run dev --filter=@vibecut/web",
"build:web": "turbo run build --filter=@vibecut/web",
"dev:storybook": "bun run --cwd apps/web storybook",
"build:storybook": "bun run --cwd apps/web build:storybook",
"dev:tools": "turbo run dev --filter=@opencut/tools",
"build:tools": "turbo run build --filter=@opencut/tools",
"start:tools": "turbo run start --filter=@opencut/tools",
"dev:tools": "turbo run dev --filter=@vibecut/tools",
"build:tools": "turbo run build --filter=@vibecut/tools",
"start:tools": "turbo run start --filter=@vibecut/tools",
"lint:web": "biome lint apps/web/src --max-diagnostics=1000",
"lint:web:fix": "biome lint apps/web/src --write --max-diagnostics=1000",
"format:web": "biome format apps/web/src/services/renderer --write --max-diagnostics=1000",
"test": "bun test",
"test:web": "turbo run test --filter=@opencut/web",
"test:web:coverage": "turbo run test:coverage --filter=@opencut/web",
"test:web": "turbo run test --filter=@vibecut/web",
"test:web:coverage": "turbo run test:coverage --filter=@vibecut/web",
"test:e2e:web": "bun run --cwd apps/web test:e2e",
"test:e2e:web:ui": "bun run --cwd apps/web test:e2e:ui"
},

View File

@ -1,7 +1,7 @@
{
"name": "@opencut/env",
"name": "@vibecut/env",
"version": "0.0.0",
"description": "Environment package for OpenCut",
"description": "Environment package for VibeCut",
"main": "./src/index.ts",
"types": "./src/index.ts",
"exports": {

View File

@ -1,7 +1,7 @@
{
"name": "@opencut/ui",
"name": "@vibecut/ui",
"version": "0.0.0",
"description": "UI package for OpenCut",
"description": "UI package for VibeCut",
"main": "./src/index.ts",
"types": "./src/index.ts",
"exports": {