Model or dataset
noahgsolomon/brainrot.js avatar
noahgsolomon/brainrot.js

brainrot.js: a Docker-based text-to-video pipeline for talking-head shorts

Text to video generator in the brainrot form. Learn about any topic from your favorite personalities 😼.

960 stars135 forksPythonMIT

At a glance

What is it?
brainrot.js turns a topic and a set of cloned voice IDs into a rendered vertical video, using a Groq/OpenAI script stage, Speechify voices and a Remotion composition. It is a self-hosted build, not a hosted service, and the local path costs a 5.5GB image and 10 to 20 minutes per video.
Who is it for?
Adopt brainrot.js if you already have Speechify voice clones for the characters you want and you are comfortable with a Docker image around 5.5GB and a 10 to 20 minute render per video. Do not adopt it if you need a hosted API, a supported rap mode workflow, or a pipeline whose rollback and upgrade path is documented; the README does not cover those.
Can I use it commercially?
Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 144 days ago.
What is it written in?
Mainly Python, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on September 15, 2026, and from our analysis. They are not legal advice.

DEEP OPEN-SOURCE ANALYSIS

What brainrot.js actually produces

brainrot.js generates a short vertical video from a topic, in the format the project calls brainrot: a scripted monologue delivered in a cloned voice, rendered as a composition. The README frames it as "Learn about any topic from your favorite personalities", and the repository topics list text-to-video, youtubeshorts and remotion, which tells you the intended output shape is a short-form video rather than a general editing tool.

The people who benefit are developers who want to experiment with generated talking-head shorts and are willing to run the whole stack themselves. The setup assumes you can obtain API keys from Groq, OpenAI and Speechify, and that you can train voice clones on your own Speechify account using the audio in training_audio/. There is no hosted endpoint in the README, so this is not a tool you call from a script and forget about. The repository also contains a Next.js application at the top level, with Clerk, tRPC, Drizzle and SST in package.json, so the codebase is larger than the generator alone.

The pipeline: keys in, script and audio out, Remotion renders

The generation flow is split across two layers. The generate/ directory holds the rendering pipeline, and localBuild.ts is the entry point. The README says regular mode "executes the localBuild.ts script, and outputs a video in the out directory", while studio mode "executes the localBuild.ts script, but doesn't render the video" and instead produces the audio and context files and runs `bun run start` outside the container so you can edit src/Composition.tsx and see changes live.

The environment file generate/.env is where the pipeline gets its credentials. Each character is a separate variable holding a Speechify voice ID, alongside GROQ_API_KEY, OPENAI_API_KEY and SPEECHIFY_API_KEY. That layout is the clearest signal of the architecture: the script stage is driven by Groq and OpenAI, speech comes from Speechify voices you train yourself, and Remotion assembles the result. The README instructs you to change what gets generated by editing "the variable values at the top in localBuild.ts", which means the topic and the voice selection are code-level inputs, not form fields. There is no documented queue, retry policy or job store for the generation step.

Installing brainrot.js and rendering a first video

The README states you must have Docker installed before anything else. The first real step is creating generate/.env with the character voice IDs and the three API keys. The variable names below are copied from the README; the values are yours to fill in.

bash
JORDAN_PETERSON_VOICE_ID=your speechify api key here
JOE_ROGAN_VOICE_ID=your speechify api key here
BARACK_OBAMA_VOICE_ID=your speechify api key here
GROQ_API_KEY=YOUR GROQ API KEY HERE
OPENAI_API_KEY=YOUR OPEN AI API KEY HERE
SPEECHIFY_API_KEY=YOUR SPEECHIFY API KEY HERE

Note that the README uses the phrase "your speechify api key here" for the per-character variables even though the variable names end in VOICE_ID. Treat those as voice identifiers from your own Speechify account, not as copies of the same API key.

Next, make the scripts executable and build the image. The README warns the build takes 5 to 15 minutes and produces an image around 5.5GB.

bash
cd generate
chmod +x scripts/start.sh
chmod +x scripts/build.sh
./scripts/build.sh
bun install

Then start the container. Regular mode renders a video into the out directory; studio mode skips rendering so you can edit the composition.

bash
./scripts/start.sh
MODE=studio ./scripts/start.sh

The README says generation takes 10 to 20 minutes, so a first run that appears to hang is expected behaviour rather than a failure. To change the topic or the voice, edit the variable values at the top of localBuild.ts before starting.

Where brainrot.js breaks down

The storage requirement is the first hard constraint, and it is stated twice in conflicting terms. The README says the image is around 5.5GB in the build step, then lists "You don't have enough storage (the image will be around 12.6GB)" under common problems. Plan for the larger figure, since the smaller one describes the image alone and the larger one appears to account for the working set.

Voice availability is the second constraint. The pipeline depends on Speechify voice IDs that you train yourself from the clips in training_audio/. If your account has no trained voice for a character, that variable has nothing valid to point at, and the README does not describe a fallback voice or a default.

Rap mode is documented as unfinished. The README states you can run it but that it does not yet cover how to, and that documentation will be added later. Anyone who needs that mode is reading source code, not documentation.

Finally, the project is a local build tool. The README gives no hosted endpoint, no authentication model for a shared deployment, and no rollback procedure for a failed render. If you need an API you can call from a backend service, this is the wrong shape of tool.

brainrot.js versus writing Remotion compositions by hand

The honest alternative is Remotion itself. brainrot.js is built on Remotion, and studio mode exists precisely so you can edit src/Composition.tsx directly, which means the project is a scaffold around a composition rather than a replacement for one.

The difference is in what each side owns. If you write the composition yourself, you control the script generation, the voice provider and the render orchestration, and you take on the work of wiring Groq, OpenAI and Speechify together. brainrot.js makes those choices for you: a fixed set of character voice variables, a fixed localBuild.ts entry point, and a Docker image that carries the dependencies. You get a working pipeline faster and you inherit its opinions, including the storage footprint and the 10 to 20 minute render time. If your output is not a talking-head short in this format, the scaffold is overhead you would have to remove.

Maintenance, licensing and what an upgrade costs you

The repository is not archived, and the last push was on 2026-04-25. The most recent tagged release is v.3.0 from 2024-05-15, with v.2.0 and v.1.0 before it, so the release cadence is slow relative to the commit activity. There is a changelog file at the top level, and the README itself notes that rap mode documentation is still pending, which is a fair signal of where the documentation stands.

The licence is MIT, which permits commercial use and modification provided the copyright notice and permission notice are retained. That is a statement about the licence text, not legal advice; if you plan to publish generated videos at scale, check the terms of the Groq, OpenAI and Speechify accounts you use, since those govern the inputs and outputs of the pipeline independently of the MIT grant.

The upgrade cost is dominated by the Docker image. A rebuild takes 5 to 15 minutes according to the README, and any change to the dependency set in generate/ means paying that again. Because the API keys live in generate/.env, a rebuilt container needs that file present; the repository also ships a .env.gpg file, which suggests the maintainers keep an encrypted copy, but the README does not explain how to use it.

Editorial conclusion

Adopt brainrot.js if you already have Speechify voice clones for the characters you want and you are comfortable with a Docker image around 5.5GB and a 10 to 20 minute render per video. Do not adopt it if you need a hosted API, a supported rap mode workflow, or a pipeline whose rollback and upgrade path is documented; the README does not cover those. Verify first that your Speechify account has trained voices for each *_VOICE_ID variable you plan to set, and that you have storage for the image, which the README says grows to around 12.6GB.

Frequently asked questions

What do I need before running brainrot.js locally?

You need Docker installed, a generate/.env file containing your Groq, OpenAI and Speechify credentials plus a voice ID for each character, and enough disk space for the image. The README lists the image as around 5.5GB during the build and around 12.6GB under common problems.

How long does brainrot.js take to generate a video?

The README says the video generation process can take 10 to 20 minutes and asks you to be patient. Building the Docker image beforehand takes 5 to 15 minutes on its own.

What is the difference between regular mode and studio mode in brainrot.js?

Regular mode runs localBuild.ts and outputs a video in the out directory. Studio mode runs the same script but skips rendering, generating the audio and context files instead and running bun run start outside the container so you can edit src/Composition.tsx and see updates live.

How do I change the topic or the voice brainrot.js uses?

The README says you change what video is generated by changing the variable values at the top in localBuild.ts. Character voices are selected through the per-character VOICE_ID variables in generate/.env.

Where do the brainrot.js voice IDs come from?

They come from your own Speechify account. The README tells you to sign up for Speechify text-to-speech API access and then train your own voices using the audio in the training_audio/ folder.

Can brainrot.js run in rap mode?

The README states you can run rap mode but that it does not yet cover how to, and that documentation will be added later. Until then, that mode is undocumented.

Official sources

  1. License: MIT
  2. noahgsolomon/brainrot.js on GitHub
  3. Project website
  4. README
  5. Releases
Community notes

Community notes