Skip to content

fyn

An extremely fast Python package and project manager, written in Rust.

Start here

Pick the path that matches how you use fyn:

Performance depends on the workload, platform, filesystem, and cache state. See the benchmarks reference for the current methodology and caveats.

Highlights

fyn started as an independent community fork of uv and now has its own commands and configuration surface.

Installation

Install fyn with pipx:

$ pipx install fyn

Then, check out the first steps or read on for a brief overview.

Tip

fyn may also be installed with standalone release assets, Homebrew, and more. See all of the methods on the installation page.

Projects

fyn manages project dependencies and environments, with support for lockfiles, workspaces, and more, similar to rye or poetry:

$ fyn init example
Initialized project `example` at `/home/user/example`

$ cd example

$ fyn add ruff
Creating virtual environment at: .venv
Resolved 2 packages in 170ms
   Built example @ file:///home/user/example
Prepared 2 packages in 627ms
Installed 2 packages in 1ms
 + example==0.1.0 (from file:///home/user/example)
 + ruff==0.5.4

$ fyn run ruff check
All checks passed!

$ fyn lock
Resolved 2 packages in 0.33ms

$ fyn sync
Resolved 2 packages in 0.70ms
Checked 1 package in 0.02ms

Inspecting and entering the project environment

Use fyn status to see whether fyn considers the current directory a managed project, whether fyn.lock is present, and which environment and Python interpreter it is using:

$ fyn status
current directory: /home/user/example
project directory: /home/user/example
managed project: yes
workspace root: /home/user/example
pyproject.toml: yes
fyn.lock: yes
pip-in-project: warn
environment: /home/user/example/.venv
python: /home/user/example/.venv/bin/python3 (3.12.0)

Use fyn upgrade to refresh all dependencies or only the packages you name:

$ fyn upgrade
$ fyn upgrade requests flask

Use fyn shell to open a new shell with the project environment activated:

$ fyn shell
success: Activated virtual environment at .venv
Type exit to deactivate.

When you need to choose a PyTorch backend for the current machine without rewriting project metadata, use fyn torch doctor:

$ fyn torch doctor
PyTorch doctor
recommended backend: cu130

See the project guide to get started.

fyn also supports building and publishing projects, even if they're not managed with fyn. See the packaging guide to learn more.

Scripts

fyn manages dependencies and environments for single-file scripts.

Create a new script and add inline metadata declaring its dependencies:

$ echo 'import requests; print(requests.get("https://astral.sh"))' > example.py

$ fyn add --script example.py requests
Updated `example.py`

Then, run the script in an isolated virtual environment:

$ fyn run example.py
Reading inline script metadata from: example.py
Installed 5 packages in 12ms
<Response [200]>

See the scripts guide to get started.

Tools

fyn executes and installs command-line tools provided by Python packages, similar to pipx.

Run a tool in an ephemeral environment using fynx (an alias for fyn tool run):

$ fynx pycowsay 'hello world!'
Resolved 1 package in 167ms
Installed 1 package in 9ms
 + pycowsay==0.0.0.2
  """

  ------------
< hello world! >
  ------------
   \   ^__^
    \  (oo)\_______
       (__)\       )\/\
           ||----w |
           ||     ||

Install a tool with fyn tool install:

$ fyn tool install ruff
Resolved 1 package in 6ms
Installed 1 package in 2ms
 + ruff==0.5.4
Installed 1 executable: ruff

$ ruff --version
ruff 0.5.4

See the tools guide to get started.

Python versions

fyn installs Python and allows quickly switching between versions.

Install multiple Python versions:

$ fyn python install 3.10 3.11 3.12
Searching for Python versions matching: Python 3.10
Searching for Python versions matching: Python 3.11
Searching for Python versions matching: Python 3.12
Installed 3 versions in 3.42s
 + cpython-3.10.14-macos-aarch64-none
 + cpython-3.11.9-macos-aarch64-none
 + cpython-3.12.4-macos-aarch64-none

Download Python versions as needed:

$ fyn venv --python 3.12.0
Using CPython 3.12.0
Creating virtual environment at: .venv
Activate with: source .venv/bin/activate

$ fyn run --python pypy@3.8 -- python
Python 3.8.16 (a9dbdca6fc3286b0addd2240f11d97d8e8de187a, Dec 29 2022, 11:45:30)
[PyPy 7.3.11 with GCC Apple LLVM 13.1.6 (clang-1316.0.21.2.5)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>>

Use a specific Python version in the current directory:

$ fyn python pin 3.11
Pinned `.python-version` to `3.11`

See the installing Python guide to get started.

The pip interface

fyn provides a fast, pip-compatible interface for common pip, pip-tools, and virtualenv workflows.

fyn extends their interfaces with advanced features, such as dependency version overrides, platform-independent resolutions, reproducible resolutions, alternative resolution strategies, and more.

For many common workflows, you can switch to the fyn pip interface with minimal changes and keep the same overall workflow shape, while getting a 10-100x speedup.

Mutating fyn pip commands operate directly on the selected environment. They do not update pyproject.toml or fyn.lock; for managed project workflows, use fyn add, fyn remove, fyn sync, or fyn upgrade instead.

Compile requirements into a platform-independent requirements file:

$ fyn pip compile requirements.in \
   --universal \
   --output-file requirements.txt
Resolved 43 packages in 12ms

Create a virtual environment:

$ fyn venv
Using CPython 3.12.3
Creating virtual environment at: .venv
Activate with: source .venv/bin/activate

Install the locked requirements:

$ fyn pip sync requirements.txt
Resolved 43 packages in 11ms
Installed 43 packages in 208ms
 + babel==2.15.0
 + black==24.4.2
 + certifi==2024.7.4
 ...

See the pip interface documentation to get started.

Learn more

See the first steps or jump straight to the guides to start using fyn.