All relevant build tasks are implemented in git:// and for CI or IDE integration a small Makefile wrapper is available. If you are not familiar with Makefiles, we recommend to read gnu-make introduction.

The usage is simple, just type make {target-name} to build a target. Calling the help target gives a first overview (make help):

  rebuild ./utils/brand.env
  push.translations: push translation changes from SearXNG to Weblate's counterpart
  to.translations: Update 'translations' branch with last additions from Weblate.
  all       : update searx/ and ./data/*
  languages : update searx/data/engines_languages.json & searx/
  useragents: update searx/data/useragents.json with the most recent versions of Firefox.
  html      : build HTML documentation
  live      : autobuild HTML documentation while editing
  gh-pages  : deploy on gh-pages branch
  prebuild  : build reST include files (./build/docs/includes)
  clean     : clean documentation build
  build     : build docker image
  push      : build and push docker image
  download & install geckodriver if not already installed (required for
  env       : download & install npm dependencies locally
  clean     : drop npm installations
  build     : Build python packages at ./dist
  clean     : delete virtualenv and intermediate py files
  install   : developer install of searx into virtualenv
  uninstall : uninstall developer installation
  cmd ...   : run command ... in virtualenv
  OK        : test if virtualenv is OK
  Upload python packages to PyPi (to test use pypi.upload.test)
  pylint    : lint PYLINT_FILES, searx/engines, searx & tests
  pep8      : pycodestyle (pep8) for all files except PYLINT_FILES
  unit      : run unit tests
  coverage  : run unit tests with coverage
  robot     : run robot test
  clean     : clean intermediate test stuff
  all       : build all themes
  oscar     : build oscar theme
  simple    : build simple theme
  less      : build LESS files for pygments  [build] /static
  commit    : build & commit /static folder
  drop      : drop last commit if it was previously done by
  restore   : git restore of the /static folder (after themes.all)
run            - run developer instance
install        - developer install of SearxNG into virtualenv
uninstall      - uninstall developer installation
clean          - clean up working tree
search.checker - check search engines
test           - run shell & CI tests     - test shell scripts
ci.test        - run CI tests

Python Environment (make install)

We do no longer need to build up the virtualenv manually. Jump into your git working tree and release a make install to get a virtualenv with a developer install of SearXNG (git://

$ cd ~/searx-clone
$ make install
PYENV     [virtualenv] installing ./requirements*.txt into local/py3
PYENV     [install] pip install -e 'searx[test]'
Successfully installed argparse-1.4.0 searx
BUILDENV  INFO:searx:load the default settings from ./searx/settings.yml
BUILDENV  INFO:searx:Initialisation done
BUILDENV  build utils/brand.env

If you release make install multiple times the installation will only rebuild if the sha256 sum of the requirement files fails. With other words: the check fails if you edit the requirements listed in git://requirements-dev.txt and git://requirements.txt).

$ make install
PYENV     [virtualenv] requirements.sha256 failed
          [virtualenv] - 6cea6eb6def9e14a18bf32f8a3e...  ./requirements-dev.txt
          [virtualenv] - 471efef6c73558e391c3adb35f4...  ./requirements.txt
PYENV     [virtualenv] installing ./requirements*.txt into local/py3
PYENV     [install] pip install -e 'searx[test]'
Successfully installed argparse-1.4.0 searx
BUILDENV  INFO:searx:load the default settings from ./searx/settings.yml
BUILDENV  INFO:searx:Initialisation done
BUILDENV  build utils/brand.env

If you think, something goes wrong with your ./local environment or you change the git:// file, you have to call make clean.

make buildenv

Rebuild instance’s environment with the modified settings from the brand: and server: section of your settings.yml.

We have all SearXNG setups are centralized in the settings.yml file. This setup is available as long we are in a installed instance. E.g. the installed instance on the server or the installed developer instance at ./local (the later one is created by a make install or make run).

Tasks running outside of an installed instance, especially those tasks and scripts running at (pre-) installation time do not have access to the SearXNG setup (from a installed instance). Those tasks need a build environment.

The make buildenv target will update the build environment in:

Tasks running outside of an installed instance, need the following settings from the YAML configuration:

make run

To get up a running a developer instance simply call make run. This enables debug option in git://searx/settings.yml, starts a ./searx/ instance, disables debug option again and opens the URL in your favorite WEB browser (xdg-open):

$ make run
SEARXNG_DEBUG=1 ./ pyenv.cmd python ./searx/
INFO:werkzeug: * Running on (Press CTRL+C to quit)

make clean

Drop all intermediate files, all builds, but keep sources untouched. Before calling make clean stop all processes using Python Environment (make install).

$ make clean
CLEAN     pyenv
PYENV     [virtualenv] drop ./local/py3
CLEAN     docs -- ./build/docs ./dist/docs
CLEAN     locally installed npm dependencies
CLEAN     test stuff
CLEAN     common files

make docs docs.autobuild docs.clean

We describe the usage of the doc.* targets in the How to contribute / Documentation section. If you want to edit the documentation read our live build section. If you are working in your own brand, adjust your Global Settings.


To deploy on first adjust your Global Settings. For any further read deploy on

make test

Runs a series of tests: make test.pylint, test.pep8, test.unit and test.robot. You can run tests selective, e.g.:

$ make test.pep8 test.unit
TEST      test.pep8 OK
TEST      test.unit OK


Lint shell scripts / if you have changed some bash scripting run this test before commit.

make test.pylint

Pylint is known as one of the best source-code, bug and quality checker for the Python programming language. The pylint profile used in the SearXNG project is found in project’s root folder git://.pylintrc.

search.checker.{engine name}

To check all engines:

make search.checker

To check a engine with whitespace in the name like google news replace space by underline:

make search.checker.google_news

To see HTTP requests and more use SEARXNG_DEBUG:

make SEARXNG_DEBUG=1 search.checker.google_news

To filter out HTTP redirects (3xx):

make SEARXNG_DEBUG=1 search.checker.google_news | grep -A1 "HTTP/1.1\" 3[0-9][0-9]"
Engine google news                   Checking "GET /search?q=life&hl=en&lr=lang_en&ie=utf8&oe=utf8&ceid=US%3Aen&gl=US HTTP/1.1" 302 0 "GET /search?q=life&hl=en-US&lr=lang_en&ie=utf8&oe=utf8&ceid=US:en&gl=US HTTP/1.1" 200 None
-- "GET /search?q=computer&hl=en&lr=lang_en&ie=utf8&oe=utf8&ceid=US%3Aen&gl=US HTTP/1.1" 302 0 "GET /search?q=computer&hl=en-US&lr=lang_en&ie=utf8&oe=utf8&ceid=US:en&gl=US HTTP/1.1" 200 None

make pybuild

Build Python packages in ./dist/py:

$ make pybuild
BUILD     pybuild
running sdist
running egg_info
running bdist_wheel

$ ls  ./dist
searx-0.18.0-py3-none-any.whl  searx-0.18.0.tar.gz

To upload packages to PyPi, there is also a pypi.upload target (to test use pypi.upload.test). Since you are not the owner of PyPi: searx you will never need to upload.