Need help with baulk?
Click the “chat” button below for chat support from the developer who created it, or find similar developers for support.

About the developer

232 Stars 15 Forks MIT License 674 Commits 2 Opened issues


baulk - Minimal Package Manager for Windows

Services available


Need anything else?

Contributors list

Baulk - Minimal Package Manager for Windows

license badge Master Branch Status Latest Release Downloads Total Downloads Version Open in Visual Studio Code


A minimalist Windows package manager, installation-free, without modifying system environment variables, easy to use, can be integrated with Windows Terminal, can be added to the right-click menu...

Get Started

Download the latest version of Baulk:, You can choose to download the installation program corresponding to the Windows platform. The installation program provided by Baulk can be run without administrator rights. You can install it to any directory with non-administrator rights. You can check to create a desktop shortcut:

Or you can download the compressed package and unzip it to any directory, click on

to run Windows Terminal.

baulk update
# install some package which your need
baulk install baulktar baulk7z neovim curl wget ripgrep
# now you can run curl under Windows Terminal
curl -V
# update bucket metadata
baulk update
# upgrade all upgradeable packages
baulk upgrade
# uninstall specific packages
baulk uninstall wget

This is the most basic operation. If you need to know more about baulk, you can continue to read the introduction below.

Baulk Usage and Details

The baulk command is the core of the Baulk package manager, which implements functions such as installation, upgrade, and uninstallation of various reports. The command line parameters of baulk are roughly divided into three parts. The first part is

, which is used to specify or set some variables; the second part is
, which is the baulk subcommand, including installation and uninstallation, upgrade, update, freeze, unfreeze, etc. Command; the third part is the args following the command.
baulk - Minimal Package Manager for Windows
Usage: baulk [option]  []
  -h|--help        Show usage text and quit
  -v|--version     Show version number and quit
  -V|--verbose     Make the operation more talkative
  -Q|--quiet       Make the operation more quiet
  -F|--force       Turn on force mode. such as force update frozen package
  -P|--profile     Set profile path. default: $0\config\baulk.json
  -A|--user-agent  Send User-Agent  to server
  -k|--insecure    Allow insecure server connections when using SSL
  -T|--trace       Turn on trace mode. track baulk execution details.
  --https-proxy    Use this proxy. Equivalent to setting the environment variable 'HTTPS_PROXY'
  --force-delete   When uninstalling the package, forcefully delete the related directories

Command: version Show version number and quit list List installed packages based on package names search Search in package descriptions info Show package information install Install specific packages. upgrade if already installed. (alias: i) uninstall Uninstall specific packages. (alias: r) update Update bucket metadata upgrade Upgrade all upgradeable packages freeze Freeze specific package unfreeze UnFreeze specific package b3sum Calculate the BLAKE3 checksum of a file sha256sum Calculate the SHA256 checksum of a file cleancache Cleanup download cache bucket Add, delete or list buckets untar Extract files in a tar archive. support: tar.xz tar.bz2 tar.gz tar.zstd unzip Extract compressed files in a ZIP archive

Alias: i install r uninstall u update and upgrade

See 'baulk help ' to read usage a specific subcommand.

|Command|Description|Remarks| |---|---|---| |list|View installed packages|N/A| |search|Search for packages available in Bucket|baulk search command supports file name matching mode, for example

baulk search *
will search all packages in Bucket| |info|Show package information|N/A| |install|Install specific packages|install also has other features, when the package has been installed will rebuild the launcher, when there is a new version of the package will upgrade it,
will upgrade the frozen package| |uninstall|Uninstall a specific package|N/A| |update|update bucket metadata|similar to Ubuntu apt update command| |upgrade|Update packages with new versions|
can upgrade frozen packages| |freeze|Freeze specific packages|Frozen packages cannot be upgraded in regular mode| |unfreeze|Unfreeze the package|N/A| |b3sum|Calculate the BLAKE3 hash of the file|N/A| |sha256sum|Calculate the SHA256 hash of the file|N/A| |cleancache|cleanup download cache|30 days expired, all cached download file will remove when add
flag|| |bucket|add, delete or list buckets|N/A| |untar|built-in tar file extraction support |support tar/tar.gz/tar.bz2/tar.xz/tar.zst/| |unzip|built-in zip file extraction support |zip method support deflate/deflate64/bzip2/lzma/zstd/ppmd
Support file name encoding detection to avoid file name garbled when decompressing. |


baulk list
baulk search *w
baulk info wget
baulk freeze python
baulk unfreeze python
baulk update
baulk upgrade


baulk help 
to read usage a specific subcommand.

Baulk configuration file

The default path of the baulk configuration file is

, which can be specified by setting the parameter
. Unless you need to customize the bucket or some other operation, otherwise do not need to modify the configuration file.

Bucket management

In the bucket configuration file, we need to set

, which is used to store the source data of the baulk installation software. Buckets currently only support storage on git code hosting platforms, such as Github. To install software using baulk, there must be at least one
. The default bucket of baulk is The bucket configuration is as follows:


    "bucket": [
            "description": "Baulk default bucket",
            "name": "Baulk",
            "url": "",
            "weights": 100


, we designed the
mechanism. In different
, if there is a package with the same name and the package version is the same, we will compare the
The larger ones will be installed.

baulk bucket add
usage: baulk bucket add URL
       baulk bucket add BucketName URL
       baulk bucket add BucketName URL Weights
       baulk bucket add BucketName URL Weights Description

Delete some bucket:

baulk bucket delete BucketName

List buckets:

baulk bucket list

To synchronize buckets, you can run the

baulk update
command. This is similar to
apt update
. The baulk synchronization bucket adopts the RSS synchronization mechanism, which is to obtain the latest commit information by requesting the bucket repository, compare the latest commitId with the last commitId recorded locally, and download the git archive to decompress it locally if they are inconsistent. The advantage of this mechanism is that it can support synchronization without installing git.

Package management

baulk uses the bucket to record the download address of the package, the file hash, and the initiator that needs to be created. The default bucket repository is, of course, you can also create a bucket according to the layout of the

repository. Baulk bucket actually draws on Scoop to a certain extent, but baulk does not force the use of file hash verification, but only supports SHA256 during verification It is different from BLAKE3 and Baulk's installation mechanism.

The commands for the baulk management package include

, and
. Installing software using baulk is very simple, the command is as follows:
# Install cmake git and 7z
baulk install cmake git 7z

baulk install
will install specific packages. During the installation process, baulk will read the metadata of the specific packages from the bucket. The format of these metadata is generally as follows:
    "description": "CMake is an open-source, cross-platform family of tools designed to build, test and package software",
    "version": "3.17.2",
    "url": [
    "url.hash": "SHA256:66a68a1032ad1853bcff01778ae190cd461d174d6a689e1c646e3e9886f01e0a",
    "url64": [
    "url64.hash": "SHA256:cf82b1eb20b6fbe583487656fcd496490ffccdfbcbba0f26e19f1c9c63b0b041",
    "extension": "zip",
    "links": [

baulk downloads the compressed package according to the URL set in the list. If there is a compressed package with the same name and the hash value matches locally, the local cache is used. baulk uses WinHTTP to download the compressed package. Currently it can better support HTTP Proxy, of course, it can also be passed Set the environment variables and command line parameters to set the proxy. baulk allows no hashes to be set in the list. The hash of baulk is set to

format. If there is no hash prefix, the default is
. The following table is the hash algorithm supported by baulk.

|Hash algorithm|Prefix|Remarks| |---|---|---| |SHA224|

|| |SHA256|
|| |SHA384|
|| |SHA512|
|| |SHA3-224|
|| |SHA3-256|
prefix specific ☞
| |SHA3-384|
|| |SHA3-512|
|| |BLAKE3|

In baulk,

, and baulk executes the corresponding decompression program according to the type of
. The extended decompression procedure is as follows:

|Extended|Unzip Program|Limited| |---|---|---| |

|-|-| |
|Built-in|Support deflate/bzip2/zstd/deflate64/xz/ppmd, Not support encryption| |
|Built-in, based on MSI API|-| |
|Priority:baulk7z - Baulk distribution7z - installed by baulk7z - find in
|decompress format support by 7-zip| |
|Built-in|Support gzip/xz/zstd/bzip/brotli|

In the manifest file, there may also be

, and baulk will create symbolic links for specific files according to the settings of
. With Visual Studio installed, baulk will create a launcher based on the
setting, if If Visual Studio is not installed, it will use
to create an analog launcher. If baulk runs on Windows x64 or ARM64 architecture, there will be some small differences, that is, the platform-related URL/Launchers/Links is preferred, as follows:

|Architecture|URL|Launchers|Links|Remarks| |---|---|---|---|---| |x86|url|launchers|links|-| |x64|url64, url|launchers64, launchers|links64, links|If the launchers/links of different architectures have the same goal, you don’t need to set them separately| |ARM64|urlarm64, url|launchersarm64, launchers|linksarm64, links|If launchers/links of different architectures have the same goal, you don’t need to set them separately|

Tips: In Windows, after starting the process, we can use

to get the binary file path of the process, but when the process starts from the symbolic link, the path of the symbolic link will be used. If we only use
in baulk to create symbolic links to the
directory, there may be a problem that a specific
cannot be loaded, so here we use the
mechanism to solve this problem.

When running

baulk install
, if the software has already been installed, there may be two situations. The first is that the software has not been updated, then
will rebuild
, which is applicable to different packages. In the same
installation, overwriting needs to be restored. If there is an update to the software, baulk will install the latest version of the specified package.

baulk uninstall
will remove the package and the created launcher, symbolic link.
baulk upgrade
By searching for already installed packages, if a new version of the corresponding package exists, install the new version.

There is also a

command in baulk.
baulk freeze
will freeze specific packages. Using
baulk install/baulk upgrade
will skip the upgrade of these packages. However, if
baulk install/baulk upgrade
is used The
parameter will force the upgrade of the corresponding package. We can also use
baulk unfreeze
to unfreeze specific packages.

In baulk, we can use

baulk search pattern
to search for packages added in the bucket, where
is based on file name matching, and the rules are similar to POSIX fnmatch. Running
baulk search *
will list all packages.

In baulk, we can use

baulk list
to list all installed packages, and
baulk list pkgname
to list specific packages.


Baulk provides sha256sum b3sum two commands to help users calculate file hashes.

Baulk Virtual environment mechanism

In order to install different versions of the same software at the same time, baulk implements a virtual environment mechanism. By specifying

in baulkterminal or baulk-exec to load a specific package environment, for example,
loads openjdk15,
can load Openjdk14, these packages need to be configured in the bucket warehouse. In addition, baulk-dock can be switched graphically. Unlike baulk-exec, baulk-exec can load multiple VENVs at the same time, while baulk-dock only supports one.

Baulk executor

baulk provides the

command, which is a special launcher. Through this command, we can initialize the isolated baulk environment variable context and start a new process. The new process inherits the baulk isolated environment variable context. The tool enables baulk to install multiple versions of the same software in parallel, and releases provided by different manufacturers do not need to take into account environmental variables to interfere with each other. The advantage of using baulk-exec is that there is no need to modify the system environment variables, the environment variable context is temporary, and the process is destroyed when it exits. At present, the Baulk Terminal we run is also implemented by baulk-exec, and baulk-exec can also be widely used in various CI pipelines.

baulk-exec usage:

baulk-exec - Baulk extend executor
Usage: baulk-exec [option]  [] ...
  -h|--help            Show usage text and quit
  -v|--version         Show version number and quit
  -V|--verbose         Make the operation more talkative
  -C|--cleanup         Create clean environment variables to avoid interference
  -W|--cwd             Set the command startup directory
  -A|--arch            Select a specific arch, use native architecture by default
  -E|--venv            Choose to load a specific package virtual environment
  --vs                 Load Visual Studio related environment variables
  --vs-preview         Load Visual Studio (Preview) related environment variables
  --clang              Add Visual Studio's built-in clang to the PATH environment variable
  --time               Summarize command system resource usage

example: baulk-exec -V --vs TUNNEL_DEBUG=1 pwsh

Baulk Windows Terminal integration

Baulk also provides the

program, which is highly integrated with Windows Terminal and can start Windows Terminal after setting the Baulk environment variable, which solves the problem of avoiding conflicts caused by tool modification of system environment variables and anytime. In addition, Baulk added a custom installation option integrated into the Windows Terminal plug-in during the installation process. You can also use Fragments.bat to manually integrate Baulk into Windows Terminal.

baulkterminal usage:

baulkterminal - Baulk Terminal Launcher
Usage: baulkterminal [option] ...
               Show usage text and quit
               Show version number and quit
               Make the operation more talkative
               Create clean environment variables to avoid interference
               The shell you want to start. allowed: pwsh, bash, cmd, wsl
               Set the shell startup directory
               Select a specific arch, use native architecture by default
               Choose to load one/more specific package virtual environment
               Load Visual Studio related environment variables
               Load Visual Studio (Preview) related environment variables
               Use conhost not Windows terminal
               Add Visual Studio's built-in clang to the PATH environment variable

In addition to starting Windows Terminal through baulktermainl, you can also modify the command line of the default terminal of Windows Terminal and use baulk-exec to start the shell, so that the newly created shell has the environment variable context of baulk. For example, change the command line of Powershell Core to:

C:\Dev\baulk\bin\baulk-exec.exe --vs --clang pwsh

Baulk Dock

Baulk upgrade

At present, we use the Github Release Latest mechanism to upgrade Baulk itself. When executing Github Actions, when new tags are pushed, Github Actions will automatically create a release version and upload the binary compressed package. In this process, the tag information will be compiled into the baulk program. When running

locally (please note that baulk update is to update the bucket and baulk-update are not the same command), it will check whether the local baulk is in the tag, If it is not built on Github Actions, the next step will not be checked unless the
parameter is set. If it is a tag built on Github Actions, check whether it is consistent with Github Release Latest, inconsistently download the binary of the corresponding platform, and then Update Baulk.


《Baulk - 开发一个简单的包管理工具历程》


Baulk Icons made by Smashicons from

We use cookies. If you continue to browse the site, you agree to the use of cookies. For more information on our use of cookies please see our Privacy Policy.