Here is how to use the mkp224o utility to generate a vanity URL based on your specified filter.

Step 1 — Prepare Server

These instructions are for a Linux server running a recent version of Debian or Ubuntu.

Get your server package lists up to date:

sudo apt update

Upgrade to the latest version of all your existing packages:

sudo apt upgrade

Install the prerequisites for compiling mkp224o from source:

sudo apt install git build-essential autoconf libsodium-dev

Step 2 — Compile Mkp224o

Make a directory for downloads, and change into it:

mkdir ~/Downloads

cd ~/Downloads

Get the source code for mkp224o from Github:

git clone

Change into the mkp224o source directory:

cd mkp224o

Generate the configure script:


Run the configure script:


Compile mkp224o from source:


Step 3 — Run Mkp224o

Make the output directory for the generated address possibilities. We will name this directory as possible:

mkdir possible

Now run mkp224o and send its output to the directory named possible. We use the option -d to specify the output directory, and we select only onion domain names that begin with the characters blog. Of course, you can change possible and blog in the example to names of your own choosing.

./mkp224o -d possible blog

For the 4-character filter blog, on my machine, mkp224o generated one possible onion domain name every 5 seconds. Onion v3 addresses may have one of 32 different characters in each position. Extrapolating to length 5, we might expect it to generate one possible domain name every 2 minutes 40 seconds. Extrapolating to length 6, we would expect a possible onion domain name every 1.5 hours. For a filter of length 7, we would expect a possible onion domain name every 2 days. For length 8, you might get a single possibility roughly every 64 days.

When you are satisfied with the number of possibilities generated, press Ctrl+c on your computer keyboard to stop the mkp224o process.

Now list the results in the directory named possible:

ls -l possible

Choose one of the generated domain names. List the contents of that domain name’s directory. For example:

ls -l possible/blogiwuasytomnunoj642gv7pswvacsnil4pr465mtz2wrlqf2mac5ad.onion

You will see that the directory contains three files:

  • hostname
  • hs_ed25519_public_key
  • hs_ed25519_secret_key

Step 4 — Implement Onion Address

You will need to copy the three files above into your /var/lib/tor/hidden_service directory. For example, if you use the word blog as your hidden service directory name:

sudo mkdir /var/lib/tor/blog

sudo cp possible/blogiwuasytomnunoj642gv7pswvacsnil4pr465mtz2wrlqf2mac5ad.onion/* /var/lib/tor/blog

sudo chown -R debian-tor:debian-tor /var/lib/tor/blog

sudo chmod 700 /var/lib/tor/blog

Now turn to the post for sample Tor and Nginx onion website configuration files.