duriantaco/fyn: Fyn is a privacy-first fork of uv for fast Python package management, dependency resolution, virtual environments, and pyproject.toml workflows. · GitHub

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

fin is a free Python package manager built on the foundation of UV, with telemetry removed, new features added, and long-standing bugs fixed. See MANIFESTO.md for the full story.

  • same tool to change pip, pip-tools, pipx, poetry, pyenv, twine, virtualenvand more.
  • 10-100 times faster than pip.
  • Provides comprehensive project management with universal lockfile.
  • Built-in task runner – define and run project tasks pyproject.toml.
  • activates the virtual environment with fyn shell.
  • Upgrades dependencies in one command fyn upgrade.
  • Runs scripts with support for inline dependency metadata.
  • Installs and manages Python versions.
  • Runs and installs tools published as Python packages.
  • Includes a PIP-compliant interface to boost performance with a familiar CLI.
  • Supports cargo-style workspaces for scalable projects.
  • Disk-space efficient with global cache for dependency deduplication.
  • No telemetry – your install is your business.
  • Supports MacOS, Linux and Windows.

From PEPI:

# With pip.
pip install fyn
# Or pipx.
pipx install fyn

Or build from source:

cargo install --path crates/fyn

View command line reference documentation fyn help.

fyn manages project dependencies and environments with support for lockfiles, workspaces, and more 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
Installed 2 packages in 1ms
 + ruff==0.5.0

$ 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

Define your tasks pyproject.toml and run with them fyn run: :

[tool.fyn.tasks]
test = "pytest -xvs"
lint = "ruff check ."
format = { cmd = "ruff format .", description = "Format code" }
check = { chain = ["lint", "test"], description = "Lint then test" }
$ fyn run test
# runs pytest -xvs

$ fyn run test -- -k mytest
# extra args are passed through

$ fyn run --list-tasks
Available tasks:
  check    Lint then test
  format   Format code
  lint     ruff check .
  test     pytest -xvs

Activate the project’s virtual environment in a new shell:

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

Works with bash, zsh, fish, nushell, powershell and cmd.

Upgrade all or specific dependencies in one command:

$ fyn upgrade
info: Upgrading all dependencies...
success: Dependencies upgraded successfully.

$ fyn upgrade requests flask
info: Upgrading: requests, flask
success: Dependencies upgraded successfully.

Support --dry-run And --no-sync.

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://example.com"))' > 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

fyn Executes and installs command-line tools provided by Python packages pipx.

Run a device in a transient environment using fynx (a nickname for fyn tool run):

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

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

install a device with fyn tool install: :

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

$ ruff --version
ruff 0.5.0

fyn installs Python and allows to quickly switch between versions.

Install multiple Python versions:

$ fyn python install 3.12 3.13 3.14
Installed 3 versions in 972ms
 + cpython-3.12.12-macos-aarch64-none
 + cpython-3.13.9-macos-aarch64-none
 + cpython-3.14.0-macos-aarch64-none

Use a specific Python version in the current directory:

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

fyn provides a drop-in replacement for the normal pip, pip-toolsAnd virtualenv Order.

Migrate to fyn without changing your existing workflow – and experience 10-100x speedups – with fyn pip interface.

Compile the 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 Python 3.12.3
Creating virtual environment at: .venv
Activate with: source .venv/bin/activate

Install Locked Requirements:

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

Prevent your cash from growing unlimited:

export UV_CACHE_MAX_SIZE=2G

The oldest entries are automatically truncated after each command when the cache exceeds the limit. Support K, M, GAnd T Suffix.

Use different lockfiles for different environments:

UV_LOCKFILE=linux.lock fyn lock
UV_LOCKFILE=macos.lock fyn lock

Environment variables work in index URLs – useful for private indexes with credentials:

[[tool.fyn.index]]
name = "private"
url = "https://${PYPI_TOKEN}@pypi.example.com/simple/"

Explicit indexes for transitive dependencies are also respected – you no longer need to list every internal package as a direct dependency.

fyn is a drop-in replacement for UV. Same configuration files, same pyproject.toml settings, same
fyn.lock format, same UV_* Environment Variables. The only change is the binary name.

# before
uv sync
uv run pytest
uvx ruff check .

# after
fyn sync
fyn run pytest
fynx ruff check .

We are eager to support contributors of all levels of experience and would love to see you join the project. Check out the Contribute Guide to get started.

What platforms does fyn support?

Same as uv: on macOS, Linux, and Windows, x86_64 and aarch64.

Is fyn compatible with uv?

Yes. Same configuration format, same lockfile, same environment variables. You can freely switch between them on the same project.

What is different from UV?

See MANIFESTO.md for a full comparison, or see the table below for a quick summary:

Speciality ultraviolet fin
Telemetry (Linehaul) Sends OS, Python, CI information nobody
task runner not available [tool.fyn.tasks]
shell Permission not available fyn shell
upgrade Permission Must create a chain of two orders fyn upgrade
cache size limit no limit UV_CACHE_MAX_SIZE
custom lockfile name not available UV_LOCKFILE
Explicit index for transitive depot broken fixed
Env var in index URL only in require.txt everywhere

fyn’s dependency resolver uses PubGrub under the hood. We are grateful to the PubGrub maintainers, especially Jacob Finkelman, for their support.

The core of fyn is derived from uv by astral.

The Git implementation of fyn is based on cargo.

Some of the optimizations of fyn are inspired by the great work we’ve seen at pnpm, Orogene, and bun. We have Nathaniel J. Smith’s also learned a lot from Posi and adapted its Trampoline for Windows support.

fyn is licensed under one of

At your option.

Unless you explicitly state otherwise, any Contribution you intentionally submit for inclusion in FIN will be dual-licensed as set forth above, without any additional terms or conditions, as defined in the Apache-2.0 License.



<a href

Leave a Comment