# Anki development ## Packaged betas For non-developers who want to try beta versions, the easiest way is to use a packaged version - please see: https://betas.ankiweb.net/ ## Pre-built Python wheels Pre-built Python packages are available on PyPI. They are useful if you wish to: - Run Anki from a local Python installation without building it yourself - Get code completion when developing add-ons - Make command line scripts that modify .anki2 files via Anki's Python libraries You will need the 64 bit version of Python 3.9 or later installed. 3.9 is recommended, as Anki has only received minimal testing on 3.10+ so far, and some dependencies have not been fully updated yet. You can install Python from python.org or from your distro. For further instructions, please see https://betas.ankiweb.net/#via-pypipip. Note that in the provided commands, `--pre` tells pip to fetch alpha/beta versions. If you remove `--pre`, it will download the latest stable version instead. ## Building from source Clone the git repo into a folder of your choosing. The folder path must not contain spaces, and should not be too long if you are on Windows. On all platforms, you will need to install: - Rustup (https://rustup.rs/). The Rust version pinned in rust-toolchain.toml will be automatically downloaded if not yet installed. If removing that file to use a distro-provided Rust, newer Rust versions will typically work for building but may fail tests; older Rust versions may not work at all. - N2 or Ninja. On Linux/Mac, N2 gives better status output (run tools/install-n2). Ninja can be downloaded from https://github.com/ninja-build/ninja/releases/tag/v1.11.1 and placed on your path, or from your distro/homebrew if it's 1.10+. Platform-specific requirements: - [Windows](./windows.md) - [Mac](./mac.md) - [Linux](./linux.md) ## Running Anki during development From the top level of Anki's source folder: ``` ./run ``` (`.\run` on Windows) This will build Anki and run it in place. The first build will take a while, as it downloads and builds a bunch of dependencies. When the build is complete, Anki will automatically start. ## Running tests/checks To run all tests at once, from the top-level folder: ``` ./ninja check ``` (`tools\ninja check` on Windows). You can also run specific checks. For example, if you see during the checks that `check:svelte:editor` is failing, you can use `./ninja check:svelte:editor` to re-run that check, or `./ninja check:svelte` to re-run all Svelte checks. ## Fixing formatting When formatting issues are reported, they can be fixed with ``` ./ninja format ``` ## Fixing eslint/copyright header issues ``` ./ninja fix ``` ## Fixing clippy issues ``` cargo clippy --fix ``` ## Optimized builds The `./run` command will create a non-optimized build by default. This is faster to compile, but will mean Anki will run slower. To run Anki in optimized mode, use: ``` ./tools/runopt ``` Or set RELEASE=1. ## Building redistributable wheels The `./run` method described in the platform-specific instructions is a shortcut for starting Anki directly from the build folder. For regular study, it's recommended you build Python wheels and then install them into your own python venv. This is also a good idea if you wish to install extra tools from PyPi that Anki's build process does not use. To build wheels on Mac/Linux: ``` ./tools/build ``` (on Windows, `\tools\build.bat`) The generated wheels are in out/wheels. You can then install them by copying the paths into a pip install command. Follow the steps [on the beta site](https://betas.ankiweb.net/#via-pypipip), but replace the `pip install --upgrade --pre aqt[qt6]` line with something like: ``` /my/pyenv/bin/pip install --upgrade out/wheels/*.whl ``` (On Windows you'll need to list out the filenames manually instead of using a wildcard). You'll also need to install PyQt: ``` $ /my/pyenv/bin/pip install pyqt6 pyqt6-webengine ``` or ``` $ my/pyenv/bin/pip install pyqt5 pyqtwebengine ``` ## Cleaning up build files Apart from submodule checkouts, most build files go into the `out/` folder (and `node_modules` on Windows). You can delete that folder for a clean build, or to free space. Cargo, yarn and pip all cache downloads of dependencies in a shared cache that other builds on your system may use as well. If you wish to clear up those caches, they can be found in `~/.rustup`, `~/.cargo` and `~/.cache/{yarn,pip}`. If you invoke Rust outside of the build scripts (eg by running cargo, or with Rust Analyzer), output files will go into `target/` unless you have overriden the default output location. ## IDEs Please see [this separate page](./editing.md) for setting up an editor/IDE. ## Making changes to the build See [this page](./build.md) ## Environmental Variables If ANKIDEV is set before starting Anki, some extra log messages will be printed on stdout, and automatic backups will be disabled - so please don't use this except on a test profile. It is automatically enabled when using ./run. If TRACESQL is set, all SQL statements will be printed as they are executed. If LOGTERM is set before starting Anki, warnings and error messages that are normally placed in the collection2.log file will also be printed on stdout. If ANKI_PROFILE_CODE is set, Python profiling data will be written on exit. # Binary Bundles Anki's official binary packages are created with `./ninja bundle`. The bundling process was created specifically for the official builds, and is provided as-is; we are unfortunately not able to provide assistance with any issues you may run into when using it. ## Mixing development and study You may wish to create a separate profile with File>Switch Profile for use during development. You can pass the arguments "-p [profile name]" when starting Anki to load a specific profile. If you're using PyCharm: - right click on the "run" file in the root of the PyCharm Anki folder - click "Edit 'run'..." - in Script options and enter: "-p [dev profile name]" without the quotes - click "Ok"