{"id":47236991,"url":"https://github.com/outpoot/editmash","last_synced_at":"2026-03-13T23:14:49.578Z","repository":{"id":334250250,"uuid":"1106523824","full_name":"outpoot/editmash","owner":"outpoot","description":"A multiplayer video editor where players compete to have their edit survive until the end — all edits compile into a final video.","archived":false,"fork":false,"pushed_at":"2026-01-23T20:31:23.000Z","size":2844,"stargazers_count":22,"open_issues_count":7,"forks_count":4,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-01-24T07:22:33.232Z","etag":null,"topics":["editmash","facedev","ffmpeg","game","gamedev","multiplayer","react","video","videoeditor","website"],"latest_commit_sha":null,"homepage":"https://editmash.com","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/outpoot.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-11-29T12:26:55.000Z","updated_at":"2026-01-24T00:52:03.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/outpoot/editmash","commit_stats":null,"previous_names":["outpoot/editmash"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/outpoot/editmash","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/outpoot%2Feditmash","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/outpoot%2Feditmash/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/outpoot%2Feditmash/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/outpoot%2Feditmash/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/outpoot","download_url":"https://codeload.github.com/outpoot/editmash/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/outpoot%2Feditmash/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30479116,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-13T20:45:58.186Z","status":"ssl_error","status_checked_at":"2026-03-13T20:45:20.133Z","response_time":60,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["editmash","facedev","ffmpeg","game","gamedev","multiplayer","react","video","videoeditor","website"],"created_at":"2026-03-13T23:14:44.142Z","updated_at":"2026-03-13T23:14:49.565Z","avatar_url":"https://github.com/outpoot.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cimg style=\"width: 128px; height: 128px\" src=\"public/favicon.svg\" /\u003e\u003ch1 style=\"font-size: 48px\"\u003e\u003ca href=\"https://editmash.com\"\u003eEditMash.com\u003c/a\u003e - the multiplayer video editor.\u003c/h1\u003e\n\n[Privacy Policy](https://editmash.com/legal/privacy) | [Terms of Service](https://editmash.com/legal/terms) | [License](LICENSE)\n\n## About\n\nEditMash is a multiplayer collaborative video editor where hundreds of players join timed \"matches\" to create videos together on a shared timeline. When time expires, the final timeline is rendered and uploaded to the viewable Library.\n\n## Features\n\n- 🎬 **Real-time Multiplayer Editing** - Multiple players edit the same timeline simultaneously\n- ⏱️ **Timed Matches** - Lobby-based gameplay with configurable match durations (5s, 30s, 60s max)\n- 🎨 **Multi-track Timeline** - Support for up to 100 video and audio tracks\n- 🎵 **Audio \u0026 Video Support** - Upload and edit video clips with separate audio control\n- 🔧 **Match Configuration** - Customizable parameters including:\n  - Timeline duration\n  - Clip size limits (min/max duration for \"blobs\")\n  - Audio volume ceiling (max dB)\n  - Maximum track count\n  - Player limit (supports hundreds to (probably) thousands of concurrent players)\n- 🎮 **Timeline Tools** - Move, trim, split, and snap alignmen\n- 📺 **Live Preview** - Real-time 1920x1080 canvas rendering\n- 🚀 **YouTube Upload** - Automatic rendering and upload of completed collaborative videos\n- 💬 **Match Chat** - In-match communication between players\n\n![Preview](public/thumbnail.png)\n![Preview 2](public/preview.png)\n\n## Development Setup\n\n### Prerequisites\n\nBefore you begin, make sure you have the following installed:\n\n- [Node.js](https://nodejs.org/) (v18 or higher, LTS recommended)\n- [Bun](https://bun.sh/) (for WebSocket server)\n- [Docker](https://www.docker.com/) (for running Redis and the project itself)\n- [FFmpeg](https://ffmpeg.org/) (for video rendering)\n\n### Getting Started\n\n1. **Clone the repository**\n\n   ```bash\n   git clone https://github.com/outpoot/editmash.git\n   cd editmash\n   ```\n\n2. **Set up Redis**\n\n   Redis is used for session management and real-time state synchronization.\n\n   Create a Redis Docker container:\n   ```bash\n   docker run -d --name editmash-redis -p 6379:6379 -v editmash_redisdata:/data --restart unless-stopped redis:8-alpine redis-server --save 60 1\n   ```\n\n   **Alternative:** You can also [download and install Redis directly](https://redis.io/downloads/) or use a managed Redis service such as [Redis Cloud](https://redis.com/cloud/).\n\n3. **Set up PostgreSQL**\n\n   PostgreSQL stores user data, match history, media metadata, and lobby configurations.\n\n   - **Run Postgres locally with Docker:**\n     ```bash\n     docker run -d --name editmash-postgres -e POSTGRES_USER=pguser -e POSTGRES_PASSWORD=pgpass -e POSTGRES_DB=editmash -p 5432:5432 -v editmash_pgdata:/var/lib/postgresql/data --restart unless-stopped postgres:16\n     ```\n\n   - **Use a managed cloud Postgres provider:**\n     Services like [Supabase](https://supabase.com/), [Neon](https://neon.tech/), or [Railway](https://railway.app/) provide managed PostgreSQL instances with free tiers.\n\n   After your database is running, update your `DATABASE_URL` in the `.env` file to point to your Postgres instance.\n\n   Run database migrations:\n   ```bash\n   npx drizzle-kit push\n   ```\n\n4. **Set up Backblaze B2 Storage**\n\n   EditMash uses Backblaze B2 for storing user-uploaded media files (video and audio clips).\n\n   - Create a [Backblaze account](https://www.backblaze.com/b2/sign-up.html)\n   - Create a new B2 bucket (note the bucket name and region)\n   - Generate application keys (Application Key ID and Application Key)\n   - Configure CORS rules for your bucket:\n     ```bash\n     # Install B2 CLI: https://www.backblaze.com/docs/cloud-storage-command-line-tools\n     b2 bucket update --cors-rules \"$(cat ./cors-rules.json)\" \u003cbucketName\u003e allPublic\n     ```\n\n5. **Configure Google OAuth**\n\n   - Go to [Google Cloud Console](https://console.cloud.google.com/apis/credentials)\n   - Create OAuth 2.0 credentials:\n     - Application type: \"Web application\"\n     - Authorized redirect URIs:\n       - `http://localhost:3000/api/auth/callback/google` (development)\n       - `https://YOUR_WEBSITE.com/api/auth/callback/google` (optional - production)\n\n7. **Configure Environment Variables**\n\n   Create a `.env` file in the root directory:\n\n   ```bash\n   cp .env.example .env\n   ```\n\n   Edit `.env` with your values:\n\n   ```ini\n   # --- Database ---\n   DATABASE_URL=postgres://pguser:pgpass@localhost:5432/editmash\n\n   # --- Redis ---\n   REDIS_URL=redis://localhost:6379\n\n   # --- Auth ---\n   BETTER_AUTH_SECRET=your_random_secret_here_minimum_32_chars\n   BETTER_AUTH_URL=http://localhost:3000  # Change to your production URL in production\n\n   # --- Google OAuth ---\n   GOOGLE_CLIENT_ID=your_google_client_id\n   GOOGLE_CLIENT_SECRET=your_google_client_secret\n\n   # --- Backblaze B2 Storage ---\n   B2_APPLICATION_KEY_ID=your_b2_key_id\n   B2_APPLICATION_KEY=your_b2_application_key\n   B2_BUCKET_NAME=your_bucket_name\n   B2_BUCKET_ID=your_bucket_id\n   B2_REGION=us-west-004  # Your bucket region\n\n   # --- WebSocket Server ---\n   NEXT_PUBLIC_WS_URL=ws://localhost:8080\n   ```\n\n8. **Configure WebSocket Server Environment**\n\n   Create a `.env` file in the `websocket/` directory:\n\n   ```bash\n   cd websocket\n   cp .env.example .env\n   cd ..\n   ```\n\n   Edit `websocket/.env` with your values:\n\n   ```ini\n   # --- WebSocket Server ---\n   WS_PORT=8080\n   WS_API_KEY=your_secure_random_key_here  # Must match the key used by Next.js app\n\n   # --- Database (same as root .env) ---\n   DATABASE_URL=postgres://pguser:pgpass@localhost:5432/editmash\n\n   # --- Redis (same as root .env) ---\n   REDIS_URL=redis://localhost:6379\n\n   # --- Your website URL ---\n   NEXT_PUBLIC_API_URL=http://localhost:3000\n   ```\n\n   **Important Notes:**\n   - `WS_API_KEY` is used to secure internal HTTP endpoints (e.g., `/notify/lobbies`) - generate a secure random string\n   - Database and Redis URLs should match your root `.env` configuration\n\n9. **Install Dependencies**\n\n   Install dependencies for the main application:\n   ```bash\n   npm install\n   ```\n\n   Set up the WebSocket server:\n   ```bash\n   cd websocket\n   bun install\n   cd ..\n   ```\n\n### Running the Application\n\n1. **Start the WebSocket server** (in one terminal)\n\n   The WebSocket server handles real-time collaboration between players:\n   ```bash\n   cd websocket\n   bun run server.ts\n   ```\n\n2. **Start the Next.js application** (in another terminal)\n\n   ```bash\n   npm run dev\n   ```\n\n   The development server will be available at http://localhost:3000\n\n3. **Verify FFmpeg Installation**\n\n   EditMash requires FFmpeg for rendering final videos. Verify it's installed:\n   ```bash\n   ffmpeg -version\n   ```\n\n   If not installed, download from [ffmpeg.org](https://ffmpeg.org/download.html) or use a package manager:\n   - **Windows**: `choco install ffmpeg` or `winget install ffmpeg`\n   - **macOS**: `brew install ffmpeg`\n   - **Linux**: `apt install ffmpeg` or `yum install ffmpeg`\n\n### Production Deployment\n\n1. **Configure production environment variables**\n\n   Update `.env` with production values (database URLs, domains, etc.)\n\n2. **Build and start:**\n\n   ```bash\n   ./build.sh\n   ```\n\n3. The app will be available at http://localhost:3002\n\n## License\n\nThis project is licensed under the **Creative Commons Attribution-NonCommercial 4.0 International** License (**CC BY-NC 4.0**). See the [LICENSE](LICENSE) file for details.\n\nMade by [FaceDev](https://youtube.com/@FaceDevStuff) (:\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foutpoot%2Feditmash","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Foutpoot%2Feditmash","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foutpoot%2Feditmash/lists"}