summaryrefslogtreecommitdiff
path: root/README.md
blob: 4702f926abf0fe6ccbaa4d22fd4dcbac6466db34 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# OpenCut

Offline-first, privacy-first video editor. Your projects and media never leave your device.

Continues the abandoned [opencut-app/OpenCut](https://github.com/opencut-app/OpenCut) codebase: the editor was already fully client-side, so the dead backend (auth, database, blog) was ripped out. The web app is now a fully static site, and there is a self-contained Linux desktop app with native ffmpeg exports.

## Variants

- **Desktop (Linux)**: self-contained app — AppImage, `.deb`, `.rpm` on the [releases page](https://github.com/cashmeredev/opencut/releases). Exports are encoded by a bundled ffmpeg (libx264 / libvpx-vp9) instead of the browser encoder, so MP4 quality settings are actually honored and colors are correctly tagged BT.709.
- **Web**: fully static site, host it anywhere. Grab `opencut-web-static.tar.gz` from releases and serve it with any static file server.

## Project structure

- `apps/web/`: Next.js editor, built as a static export (`next build` → `out/`). All state lives in IndexedDB.
- `apps/desktop/`: Electron shell. Serves the static web build over a privileged `opencut://` protocol and bridges exports to a bundled ffmpeg over IPC.
- `rust/`: wgpu compositor, effects, masks, and time primitives compiled to WASM (`opencut-wasm`).

## Development

Prerequisites: [Bun](https://bun.sh/docs/installation). No env files, no database, no Docker.

```bash
bun install
bun dev:web
```

The editor is at [http://localhost:3000](http://localhost:3000).

### 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
```

Package for Linux (AppImage, deb, rpm into `apps/desktop/release/`):

```bash
bun run --cwd apps/desktop dist
```

### Local WASM development

Only needed if you're editing `rust/wasm` and want the web app to use your local build instead of the published package. Requires a Rust toolchain, `wasm-pack`, and `cargo-watch`:

```bash
bun run build:wasm        # build once
cd rust/wasm/pkg && bun link
cd apps/web && bun link opencut-wasm
bun dev:wasm              # rebuild on changes
```

Switch back to the published package with `cd apps/web && bun add opencut-wasm`.

### Self-hosting the web app

```bash
docker compose up -d
```

Serves the static build at [http://localhost:3000](http://localhost:3000). Any static file server works — the build output is `apps/web/out/`.

## Releases

Tags (`v*`) trigger the GitHub release workflow: static web tarball plus AppImage, `.deb`, and `.rpm`.

## License

[MIT LICENSE](LICENSE)