
# Brave Core
Brave Core is a set of changes, APIs, and scripts used for customizing Chromium
to make the Brave browser. Please also check
https://github.com/brave/brave-browser which only holds the issues, releases and
the wiki.
## Overview
This repository holds the build tools needed to build the Brave desktop browser
for all platforms. In particular, it fetches and syncs code from the projects
defined in `package.json` and `src/brave/DEPS`:
- [Chromium](https://chromium.googlesource.com/chromium/src.git)
- Fetches code via `depot_tools`.
- Sets the branch for Chromium (ex: 65.0.3325.181).
- [brave-core](https://github.com/brave/brave-core)
- Mounted at `src/brave`.
- Maintains patches for 3rd party Chromium code.
- [adblock-rust](https://github.com/brave/adblock-rust)
- Implements Brave's adblock engine.
- Linked through
[brave/adblock-rust-ffi](https://github.com/brave/brave-core/tree/master/components/adblock_rust_ffi).
## Resources
- [Documentation and guides](https://github.com/brave/brave-core/blob/master/docs/README.md)
- [Issues](https://github.com/brave/brave-browser/issues)
- [Releases](https://github.com/brave/brave-browser/releases)
- [Wiki](https://github.com/brave/brave-browser/wiki)
## Downloads
You can [visit our website](https://brave.com/download) to get the latest stable
release.
## Contributing
Please see the [contributing guidelines](./CONTRIBUTING.md).
Our [Wiki](https://github.com/brave/brave-browser/wiki) also has some useful
technical information, especially about setting the development environment.
## Security Policy
Please see the [security policy](./SECURITY.md).
## Community
[Join the Q&A community](https://community.brave.app/) if you'd like to get more
involved with Brave. You can
[ask for help](https://community.brave.app/c/support-and-troubleshooting),
[discuss features you'd like to see](https://community.brave.app/c/brave-feature-requests),
and a lot more. We'd love to have your help so that we can continue improving
Brave.
You can also ask questions and interact in the
[`community-guest`](https://bravesoftware.slack.com) channel on Brave Software's
Slack.
Help us translate Brave to your language by submitting translations at
https://explore.transifex.com/brave/brave_en/.
Follow [@brave](https://x.com/brave) on X for important news and announcements.
## Install prerequisites
Follow the instructions for your platform:
- [Android](https://github.com/brave/brave-browser/wiki/Android-Development-Environment)
- [Linux](https://github.com/brave/brave-browser/wiki/Linux-Development-Environment)
- [iOS](https://github.com/brave/brave-browser/wiki/iOS-Development-Environment)
- [macOS](https://github.com/brave/brave-browser/wiki/macOS-Development-Environment)
- [Windows](https://github.com/brave/brave-browser/wiki/Windows-Development-Environment)
## Clone and initialize
Once you have the prerequisites installed, you can get the code and initialize
the build environment.
```bash
git clone git@github.com:brave/brave-core.git path-to-your-project-folder/src/brave
cd path-to-your-project-folder/src/brave
npm install
# the Chromium source is downloaded, which has a large history (gigabytes of data)
# this might take really long to finish depending on internet speed
npm run init
```
brave-core based android builds should use
`npm run init -- --target_os=android --target_arch=arm` (or whichever CPU type
you want to build for) brave-core based iOS builds should use
`npm run init -- --target_os=ios`
You can also set the target_os and target_arch for init and build using:
```
npm config set target_os android
npm config set target_arch arm
```
Additional config needed to build are documented at
https://github.com/brave/brave-browser/wiki/Build-configuration
Internal developers can find more information at
https://github.com/brave/internal/wiki/Build-configuration
## Build Brave
The default build type is component.
```
# start the component build compile
npm run build
```
To do a release build:
```
# start the release compile
npm run build Release
```
brave-core based android builds should use
`npm run build -- --target_os=android --target_arch=arm` or set the npm config
variables as specified above for `init`
brave-core based iOS builds should use the Xcode project found in
`ios/brave-ios/App`. You can open this project directly or run
`npm run ios_bootstrap -- --open_xcodeproj` to have it opened in Xcode. See the
[iOS Developer Environment](https://github.com/brave/brave-browser/wiki/iOS-Development-Environment#Building)
for more information on iOS builds.
### Build Configurations
Running a release build with `npm run build Release` can be very slow and use a
lot of RAM, especially on Linux with the Gold LLVM plugin.
To run a statically linked build (takes longer to build, but starts faster):
```bash
npm run build -- Static
```
To run a debug build (Component build with is_debug=true):
```bash
npm run build -- Debug
```
NOTE: the build will take a while to complete. Depending on your processor and
memory, it could potentially take a few hours.
## Run Brave
To start the build:
`npm start [Release|Component|Static|Debug]`
## Update Brave
`npm run sync -- [--force] [--init] [--create] [brave_core_ref]`
**This will attempt to stash your local changes in brave-core, but it's safer to
commit local changes before running this**
`npm run sync` will (depending on the below flags):
1. 📥 Update sub-projects (chromium, brave-core) to latest commit of a git ref
(e.g. tag or branch)
2. 🤕 Apply patches
3. 🔄 Update gclient DEPS dependencies
4. ⏩ Run hooks (e.g. to perform `npm install` on child projects)
| flag | Description |
| ------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `[no flags]` | updates chromium if needed and re-applies patches. If the chromium version did not change, it will only re-apply patches that have changed. Will update child dependencies **only if any project needed updating during this script run**.
**Use this if you want the script to manage keeping you up to date instead of pulling or switching branches manually. ** |
| `--force` | updates both _Chromium_ and _brave-core_ to the latest remote commit for the current brave-core branch and the _Chromium_ ref specified in brave-core/package.json (e.g. `master` or `74.0.0.103`). Will re-apply all patches. Will force update all child dependencies.
**Use this if you're having trouble and want to force the branches back to a known state. ** |
| `--init` | force update both _Chromium_ and _brave-core_ to the versions specified in brave-core/package.json and force updates all dependent repos - same as `npm run init` |
| `--sync_chromium (true/false)` | Will force or skip the chromium version update when applicable. Useful if you want to avoid a minor update when not ready for the larger build time a chromium update may result in. A warning will be output about the current code state expecting a different chromium version. Your build may fail as a result. |
| `-D, --delete_unused_deps` | Will delete from the working copy any dependencies that have been removed since the last sync. Mimics `gclient sync -D`. |
Run `npm run sync brave_core_ref` to checkout the specified _brave-core_ ref and
update all dependent repos including chromium if needed.
## Scenarios
#### Create a new branch:
```bash
> cd src/brave
src/brave> git checkout -b branch_name
```
#### Checkout an existing branch or tag:
```bash
src/brave> git fetch origin
src/brave> git checkout [-b] branch_name
src/brave> npm run sync
...Updating 2 patches...
...Updating child dependencies...
...Running hooks...
```
#### Update the current branch to the latest remote:
```bash
src/brave> git pull
src/brave> npm run sync
...Updating 2 patches...
...Updating child dependencies...
...Running hooks...
```
#### Reset to latest brave-core master (via `init`, will always result in a longer build and will remove any pending changes in your brave-core working directory):
```bash
src/brave> git checkout master
src/brave> git pull
src/brave> npm run sync -- --init
```
#### When you know that DEPS didn't change, but .patch files did (quickest attempt to perform a mini-sync before a build):
```bash
src/brave> git checkout featureB
src/brave> git pull
src/brave> npm run apply_patches
...Applying 2 patches...
```
## Enabling third-party APIs
1. **Google Safe Browsing**: Get an API key with SafeBrowsing API enabled from
https://console.developers.google.com/. Update the `GOOGLE_API_KEY`
environment variable with your key as per
https://www.chromium.org/developers/how-tos/api-keys to enable Google
SafeBrowsing.
## Development
- [Security rules from Chromium](https://chromium.googlesource.com/chromium/src/+/refs/heads/main/docs/security/rules.md)
- [IPC review guidelines](https://chromium.googlesource.com/chromium/src/+/HEAD/docs/security/ipc-reviews.md)
(in particular
[this reference](https://docs.google.com/document/d/1Kw4aTuISF7csHnjOpDJGc7JYIjlvOAKRprCTBVWw_E4/edit#heading=h.84bpc1e9z1bg))
- [Brave's internal security guidelines](https://github.com/brave/internal/wiki/Pull-request-security-audit-checklist)
(for employees only)
- [Rust usage](https://github.com/brave/brave-core/blob/master/docs/rust.md)
## Troubleshooting
See
[Troubleshooting](https://github.com/brave/brave-browser/wiki/Troubleshooting)
for solutions to common problems.