![Brave Browser](./docs/images/brave.svg)

# 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**. <br> **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. <br> **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.
