# Kimu's video editor needs Postgres, Redis, Gemini and R2 before the first render

> trykimu/videoeditor is a React Router and FastAPI video editor built on Remotion, with a Gemini-backed assistant. This piece follows the three local processes, the production Docker stack, the environment keys, and the dual license that the README sends you to read.

**trykimu/videoeditor** — Your Creative Copilot for Video Editing

- Repository: https://github.com/trykimu/videoeditor
- Website: https://trykimu.com
- Stars: 2,289 · Forks: 260
- Language: TypeScript
- License: NOASSERTION
- Published: 2026-10-14 · Updated: 2026-10-30 · Language: en
- Canonical page: https://hysenlabs.com/projects/trykimu-videoeditor

## Three local processes sit behind one Vite port

The development setup runs four things. Postgres runs in Docker. The other three run directly on your machine, and the README says Vite handles proxying so no nginx is needed.

The commands are given in order:

```bash
# Install dependencies
pnpm i
cd backend && uv sync && cd ..

# 1. Start postgres
docker compose -f docker-compose.dev.yml up -d

# 2. Start FastAPI  (terminal 1)
cd backend && uv run uvicorn main:app --reload --port 3000

# 3. Start renderer  (terminal 2)
pnpm dlx tsx app/videorender/videorender.ts

# 4. Start frontend  (terminal 3)
pnpm dev
```

You then open http://localhost:5173. The Vite dev server routes /backend/* to FastAPI on port 3000, /renderer/* to the renderer on port 8000, and everything else to React Router SSR. The README lists the requirements as Node.js 20+, Python 3.12+, pnpm and Docker for Postgres only. That is three terminals, one container, and two package managers (pnpm and uv) before anything renders.

## The production stack is a single compose file behind nginx on ports 80 and 443

For production, the README says everything runs in Docker behind nginx, with one command:

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

A custom domain is passed through an environment variable:

```bash
PROD_DOMAIN=yourdomain.com docker compose up -d
```

nginx routes /backend/* to FastAPI, /renderer/* to the renderer for video rendering, and everything else to the React Router frontend. HTTP is on port 80 and redirects to HTTPS, and HTTPS is on 443.

The docker-compose.yml shows what that command starts: a redis:7-alpine service with appendonly persistence, an nginx:alpine service that mounts nginx.conf and /etc/letsencrypt read-only, and a frontend and a backend built from Dockerfile.frontend and Dockerfile.backend. The nginx service waits for healthy redis, frontend and backend containers.

Two details deserve a check before you deploy. The compose file mounts /etc/letsencrypt, so certificates must already exist on the host. And the frontend service sets BETTER_AUTH_URL to https://trykimu.com in its environment block, so a self-hosted copy has to override that value.

## Redis is required, even though the local steps never mention it

The local development section says only Postgres runs in Docker and lists no Redis step. The .env.example file disagrees in one line: REDIS_URL, with the comment redis://localhost:6379/0, is marked as required for the render queue. The package.json dependency list includes bullmq, which is a Redis-backed job queue, and the compose file starts Redis with a health check using redis-cli ping.

The README does not explain the connection between these facts. What the files show is that rendering goes through a queue and the queue needs Redis. A developer who follows the README literally has Postgres, FastAPI, the renderer and the frontend running, and no Redis at the address REDIS_URL expects.

The consequence is that editing and preview may work while export fails. The README does not say which features break without Redis, so verify by starting a render on a fresh setup. The simplest fix is to run a local Redis on port 6379 yourself, or to add it to the development compose file.

## Six keys block sign-in, storage or the AI assistant

The README tells you to copy .env.example to .env. The README's own example sets DATABASE_URL to postgresql://videoeditor:videoeditor@localhost:5432/videoeditor for local or Docker Postgres, with a Supabase Session Pooler form as the cloud alternative. DATABASE_SSL must be set to "true" for Supabase or any remote database requiring SSL, and left unset for local Postgres.

Authentication uses BetterAuth. BETTER_AUTH_SECRET is a random secret used to sign sessions, generated with openssl rand -hex 32. BETTER_AUTH_URL is the public URL of the app and is used for OAuth callbacks, https://yourdomain.com in production or http://localhost:5173 for dev. GOOGLE_CLIENT_ID and GOOGLE_CLIENT_SECRET come from the Google Cloud console.

GEMINI_API_KEY is described as required for AI-powered video editing features. Without it the Vibe AI Assistant that the README advertises has nothing to call.

.env.example also lists five Cloudflare R2 keys: R2_ACCOUNT_ID, R2_ACCESS_KEY_ID, R2_SECRET_ACCESS_KEY, R2_ASSETS_BUCKET and R2_RENDERS_BUCKET. The README text does not explain them, but the AWS S3 client packages in package.json fit an S3-compatible store, so plan on buckets for assets and for renders.

## Sign-in is Google OAuth only, which rules out an offline install

The only provider named anywhere in the README or .env.example is Google. There is no username and password path in the documentation, and no instruction to disable authentication. The project describes OAuth based security among its extras.

For a self-hoster that has a cost. You need a Google Cloud project with OAuth credentials and a reachable callback URL before you can log in at all, even on localhost, where BETTER_AUTH_URL is http://localhost:5173. Running the editor on an air-gapped machine is not covered, and the Gemini dependency is another outbound call.

The README also lists Cloud-Synced Projects as a feature, so projects and assets are tied to Postgres and R2 rather than to files on disk. It names an offline datastore among the extras, but gives no detail on how that works or where it stores data. If your goal is a local editor that opens a file and exports an MP4, this repository describes a hosted-style web application, and nothing in it says it works that way.

## Remotion does the rendering, and its license still applies

The package.json pins Remotion packages at exactly 4.0.523: bundler, captions, cli, media-parser, player, renderer and transitions. Pinned versions mean the editor tracks one Remotion release and does not float with upstream. The TODO section says the team plans to integrate all Remotion APIs and that a proper roadmap will be added.

The license section is short and consequential. The project is licensed under a dual license, and readers are sent to LICENSE.md. The Remotion license also applies to the relevant parts of the project. The repository holds LICENSE.md and LICENSE-AGPL3.md side by side, and package.json says SEE LICENSE IN LICENSE.md. GitHub's metadata reports the license as NOASSERTION, meaning it could not identify a single standard license.

The terms themselves are not in the README, so this article does not state them. Anyone planning commercial use needs to read both files and the Remotion license, since which parts fall under which is not spelled out in the text.

## Maintenance: no releases, and the roadmap is a promise

The repository is not archived and the last push was on 2026-09-10. There are no GitHub releases, so no tagged versions exist to pin, and the only way to track the project is by commit. The default branch is main, and package.json marks the package private.

The README is the only roadmap there is. The TODO section says there is a lot of work and that a proper roadmap will be added soon, with updates on Discord. The feature list uses marketing phrasing, such as unlimited tracks, instant preview with no rendering, and fast export, and gives no numbers or limits. Treat those as claims to check in the running app.

Quality gates are in place: package.json defines typecheck, lint, format:check and a combined check script, and a .pre-commit-config.yaml sits at the top level. The repository also carries CONTRIBUTING.md, CODE_OF_CONDUCT.md and SECURITY.md for people who want to contribute or report a problem.

## Conclusion

Self-host Kimu if you want to read or extend a Remotion-based editor and can run Postgres, Redis, a FastAPI service, a renderer and a Gemini key. Skip it if you need a desktop app you can install and open, because every path in the README starts from pnpm, uv and Docker. First open LICENSE.md and LICENSE-AGPL3.md, since the project is dual-licensed and Remotion's own license applies to parts of it, and then run the local development steps once to see which services fail to start.

## FAQ

### What do I need to run Kimu video editor locally?

Node.js 20+, Python 3.12+, pnpm and Docker for Postgres. The README then starts FastAPI, a renderer and the Vite frontend in three terminals.

### Does Kimu video editor need an API key?

Yes for the AI features. GEMINI_API_KEY is described as required for AI-powered video editing, and sign-in uses Google OAuth credentials.

### What license does Kimu video editor use?

It is dual-licensed, with details in LICENSE.md, and the repository also contains LICENSE-AGPL3.md. The Remotion license applies to the relevant parts.

## Sources

- [Issues](https://github.com/trykimu/videoeditor/issues)
- [Project website](https://trykimu.com)
- [README](https://github.com/trykimu/videoeditor/blob/main/README.md)
- [trykimu/videoeditor on GitHub](https://github.com/trykimu/videoeditor)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/trykimu-videoeditor
