In this blog series, I will explain how to develop your own Chromium fork with fingerprint mimicry.
Our goal is to be able to edit basic fingerprints, like the user-agent, the CPU core counts, but also more complicated entropy sources such as canvas fingerprinting.
In the previous installment of this series, we talked about how to choose the right hardware for Chromium development.
Here, we will talk about how to clone the codebase!
Cloning the Chromium codebase
Installing depot_tools
Before we actually start to download Chromium, we need to install depot_tools, a set of scripts to interact with and build the Chromium codebase.
Chromium uses a package of scripts, the depot_tools, to manage interaction with the Chromium source code repository and the Chromium development process.
Here is how it’s done:
# Clone depot_toolsrm -rf src/depot_tools || truegit clone --depth=1 https://chromium.googlesource.com/chromium/tools/depot_tools.git src/depot_tools
# Add to PATH (choose your shell)# For bash:echo "export PATH=\$PATH:$PWD/src/depot_tools" >> ~/.bashrcsource ~/.bashrc
# For zsh:echo "export PATH=\$PATH:$PWD/src/depot_tools" >> ~/.zshrcsource ~/.zshrc
# For fish:fish_add_path $PWD/src/depot_toolsecho "fish_add_path $PWD/src/depot_tools" >> ~/.config/fish/config.fish
# Initialize depot_toolsensure_bootstrapOnce depot_tools are cloned, initialized and bootstrapped, we can move on to actually downloading Chromium’s source repository.
Fetching Chromium’s source code
The following snippet downloads the Chromium source code.
It takes a long time (hours), so it’s advised to run it overnight.
mkdir -p src/chromiumcd src/chromiumfetch --nohooks chromiumThere is also the option of running fetch --nohooks --nohistory which will not download the full git history.
I can’t quite remember why, but I didn’t get much success with that, so I decided to keep the full history this time, and it’s been going great.
Unless you’re in a rush, I’d suggest keeping the full history.
Note: If the download gets interrupted, just run fetch --nohooks chromium again from the src/chromium directory.
Running gclient hooks
This downloads build dependencies like clang, binaries, and other tools needed for building.
cd src/chromiumgclient runhooksChecking out the right version of Chromium
You usually won’t want to work on the bleeding edge, because you’ll need a version of Chromium that’s widely used to bypass antibots.
That’s why we are going to check out an older version of Chromium.
First, we need to know what version: open your existing legit Chrome browser,
and navigate to chrome://version.
Copy and paste the version you have.
Then, we’re going to check it out:
cd src/chromium/src# Make sure everything is downloadedgclient sync --with_branch_heads --with_tags# Fetch latest tags from remotegit fetch --tags# Create a branch with your target taggit checkout -B my_local_143.0.7499.170 143.0.7499.170# Download dependencies with the right versions# (each Chromium revision uses e.g. a different version of v8,# which is another project entirely)gclient sync --with_branch_heads --with_tags(you can see more details about these instructions in this blog post)
Bonus advice: using Snapper
You are likely to totally mess up your Chromium tree at some point, and will need to download everything again.
Don’t ask me how, but in an earlier iteration of this series, I downloaded the Chromium source three times before getting a dev environment that I liked!
One tip that saved me from downloading it a fourth time was to use Snapper.
Snapper is a tool for Linux file system snapshot management. Apart from the obvious creation and deletion of snapshots it can compare snapshots and revert differences between them. In simple terms, this allows root and non-root users to view older versions of files and revert changes.
It’s like what Time Machine should’ve been.
Once configured, it will take periodic snapshots of your home directory.
E.g. archinstall configured my instance of snapper to take a snapshot every hour:
cami@onigiri ~/c/bitboom.tech (main)> sudo snapper -c home list # │ Type │ Pre # │ Date │ User │ Cleanup │ Descriptio────┼────────┼───────┼─────────────────────────────────┼──────┼──────────┼─────────── 0 │ single │ │ │ root │ │ current 1 │ single │ │ Fri 30 Jan 2026 07:00:10 PM +07 │ root │ timeline │ timeline 11 │ single │ │ Mon 02 Feb 2026 02:00:02 PM +07 │ root │ timeline │ timeline158 │ single │ │ Wed 11 Feb 2026 05:39:09 AM +07 │ root │ timeline │ timeline │... snip ...323 │ single │ │ Fri 20 Feb 2026 12:00:00 AM +07 │ root │ timeline │ timeline │324 │ single │ │ Fri 20 Feb 2026 01:00:01 AM +07 │ root │ timeline │ timeline │325 │ single │ │ Fri 20 Feb 2026 02:00:01 AM +07 │ root │ timeline │ timeline │(it also has some retention policies so that I can go back far away in time, without having super fine granularity though)
If I want to access what /home/cami looked like one hour ago, I can look into
the list above for a corresponding snapshot… in our case, it’s snapshot ID 324!
I can then navigate to my /home/cami like it was one hour ago:
cami@onigiri ~/c/bitboom.tech (main)> sudo suroot@onigiri /h/c/c/bitboom.tech (main)# ls /home/.snapshots/324/snapshot/cami/code/rafale/args.gn Containerfile init.sh plans/ src/ccache.conf Containerfile.build justfile podman-compose.yaml tmp/chromium.md docs/ justfile.old README.mdCLAUDE.md ENVIRONMENT_MODIFICATIONS.md patches/ SETUP_STATUS.mdWell, as you can see, my Chromium development repo was still messy one hour ago.
Snapper is a bit painful to set up (unless you have archinstall doing it for you), but it’s definitely super nice to have when
you accidentally delete a file.
It’s even possible to create a handy shell alias to create a snapshot right before doing something risky:
alias snap="sudo snapper -c home create"Who even needs git in 2026, when we got Snapper?
What’s next?
Once you’re ready, you can move on to part 3: configuring and compiling Chromium.