From ed02ba872c02eafed45f406c68d389d0a1112a4e Mon Sep 17 00:00:00 2001 From: cashmere Date: Thu, 30 Jul 2026 18:17:45 +0200 Subject: feat: Electron desktop app, native ffmpeg export, fully static web - apps/desktop: Electron shell serving the static web build over a privileged opencut:// protocol; exports stream frames over IPC to a bundled ffmpeg (libx264/libvpx-vp9, BT.709 tagged) with backpressure. electron-builder packaging: AppImage, deb, rpm. - apps/web: dead backend deleted (better-auth, drizzle/pg, upstash, botid, freesound proxy, blog, rss, env validation); next build emits a zero-env static export; /editor/[project_id] -> /editor?project=. - Native exporter mirrors SceneExporter; activates when the preload bridge is present; web keeps the mediabunny path. - Docker self-hosting now builds and serves the static export via nginx. - Release workflow: v* tags publish static web tarball + Linux packages. - Changelog 0.4.0; README/AGENTS/CONTRIBUTING/roadmap updated. - GPUI/Rust rewrite parked on branch rust-rewrite. --- .github/CONTRIBUTING.md | 144 +++++------------------------------------- .github/workflows/bun-ci.yml | 11 ---- .github/workflows/release.yml | 56 ++++++++++++++++ 3 files changed, 72 insertions(+), 139 deletions(-) create mode 100644 .github/workflows/release.yml (limited to '.github') diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 5edc56fb..504c2f78 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -1,152 +1,40 @@ # 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/) -- Rust toolchain (only needed for `apps/desktop`) +- Rust toolchain (only needed when editing `rust/`) -> **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! +No env files, no database, no Docker — the editor is fully client-side; all state lives in IndexedDB. ### 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 +3. Install dependencies: `bun install` +4. Start the development server from the repo root: `bun dev:web` - # 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` +The editor is at [http://localhost:3000](http://localhost:3000). > **Note:** Web development uses the published `opencut-wasm` package by default, so a fresh clone does not need a local WASM build. > > If you are editing `rust/wasm`, run `bun run build:wasm`, then `cd rust/wasm/pkg && bun link`, then `cd ../../../apps/web && bun link opencut-wasm`. -### Desktop setup - -Only needed if you're working on `apps/desktop`. See [`apps/desktop/README.md`](../apps/desktop/README.md) — it's a two-step process: Rust toolchain first via `script/setup-rust`, then desktop native dependencies via `apps/desktop/script/setup`. - -## 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 - ``` +### Desktop -5. Run database migrations: `bun run db:migrate` -6. Start the development server: `bun run dev` +Only needed if you're working on `apps/desktop` (Electron shell): -### Desktop +```bash +bun build:web # static export -> apps/web/out +bun run --cwd apps/desktop copy:web # bundle it into the desktop app +bun run --cwd apps/desktop dev # run the shell +``` -Working on `apps/desktop`? See [`apps/desktop/README.md`](../apps/desktop/README.md) for setup. Web-only contributors can ignore this entirely. +`bun run --cwd apps/desktop dist` builds AppImage, `.deb`, and `.rpm` into `apps/desktop/release/`. ## How to Contribute @@ -168,15 +56,15 @@ Working on `apps/desktop`? See [`apps/desktop/README.md`](../apps/desktop/README 2. Make your changes 3. Run the relevant checks for the area you touched: - - Web changes: from `apps/web`, run `bun run lint` and `bun run format` - - Desktop changes: run `./apps/desktop/script/setup` if your environment isn't set up yet + - Web changes: from `apps/web`, run `bun run lint` and `bun run format`; from the repo root, `bun test` and `bunx tsc --noEmit --project apps/web` + - Desktop changes: `bun run --cwd apps/desktop build` 4. Commit your changes with a descriptive message 5. Push to your fork and create a pull request ## Code Style -- We use ESLint for linting and Prettier for formatting +- We use ESLint for linting and Prettier for formatting (tabs) - Run `bun run format` 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 diff --git a/.github/workflows/bun-ci.yml b/.github/workflows/bun-ci.yml index 8f702f72..ed79742f 100644 --- a/.github/workflows/bun-ci.yml +++ b/.github/workflows/bun-ci.yml @@ -21,17 +21,6 @@ jobs: 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" - NEXT_PUBLIC_MARBLE_API_URL: "https://placeholder.example.com" - MARBLE_WORKSPACE_KEY: "placeholder" - FREESOUND_CLIENT_ID: "placeholder" - FREESOUND_API_KEY: "placeholder" - steps: - name: Checkout repository uses: actions/checkout@v4 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 00000000..0469fc3a --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,56 @@ +name: Release + +on: + push: + tags: + - "v*" + +permissions: + contents: write + +jobs: + build: + runs-on: ubuntu-latest + + 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('bun.lock') }} + + - name: Install dependencies + run: bun install --frozen-lockfile + + - name: Build web app (static export) + run: bun build:web + + - name: Package static web bundle + working-directory: apps/web + run: tar -czf ../../opencut-web-static.tar.gz -C out . + + - name: Copy web bundle into desktop app + working-directory: apps/desktop + run: bun run copy:web + + - name: Build desktop packages (AppImage, deb, rpm) + working-directory: apps/desktop + run: bun run dist + + - name: Upload release assets + uses: softprops/action-gh-release@v2 + with: + generate_release_notes: true + files: | + opencut-web-static.tar.gz + apps/desktop/release/OpenCut-*-linux-*.AppImage + apps/desktop/release/OpenCut-*-linux-*.deb + apps/desktop/release/OpenCut-*-linux-*.rpm -- cgit v1.3.1