{"id":48355045,"url":"https://github.com/duriantaco/fyn","last_synced_at":"2026-04-21T00:01:29.867Z","repository":{"id":346325711,"uuid":"1189398033","full_name":"duriantaco/fyn","owner":"duriantaco","description":"Fyn is a fork of uv for fast Python package management, dependency resolution, virtual environments, and pyproject.toml workflows.","archived":false,"fork":false,"pushed_at":"2026-04-16T13:34:12.000Z","size":82286,"stargazers_count":304,"open_issues_count":1,"forks_count":4,"subscribers_count":3,"default_branch":"main","last_synced_at":"2026-04-16T14:25:08.548Z","etag":null,"topics":["dependency-management","fork","forked-repo","package-manager","packaging","pyproject-toml","python","resolver","uv"],"latest_commit_sha":null,"homepage":"https://duriantaco.github.io/fyn/","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/duriantaco.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE-APACHE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-23T09:29:33.000Z","updated_at":"2026-04-16T13:31:36.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/duriantaco/fyn","commit_stats":null,"previous_names":["duriantaco/fyn"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/duriantaco/fyn","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/duriantaco%2Ffyn","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/duriantaco%2Ffyn/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/duriantaco%2Ffyn/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/duriantaco%2Ffyn/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/duriantaco","download_url":"https://codeload.github.com/duriantaco/fyn/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/duriantaco%2Ffyn/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32071013,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-20T21:26:33.338Z","status":"ssl_error","status_checked_at":"2026-04-20T21:26:22.081Z","response_time":94,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["dependency-management","fork","forked-repo","package-manager","packaging","pyproject-toml","python","resolver","uv"],"created_at":"2026-04-05T11:00:25.738Z","updated_at":"2026-04-21T00:01:29.861Z","avatar_url":"https://github.com/duriantaco.png","language":"Rust","readme":"# fyn\n\nAn extremely fast Python package and project manager, written in Rust.\n\n**fyn** is an independent community fork of [uv](https://github.com/astral-sh/uv). It started on\nuv's foundation, but it now has its own commands, settings, defaults, and behavior, alongside\nreduced package-index request metadata, added features, and long-standing bug fixes. See\n[MANIFESTO.md](https://github.com/duriantaco/fyn/blob/main/MANIFESTO.md) for the full story.\n\n## Highlights\n\n- A single tool to replace `pip`, `pip-tools`, `pipx`, `poetry`, `pyenv`, `twine`, `virtualenv`, and\n  more.\n- 10-100x faster than `pip`.\n- Provides [comprehensive project management](#projects), with a universal lockfile.\n- Built-in [task runner](#task-runner) — define and run project tasks in `pyproject.toml`.\n- [Activates virtual environments](#shell-activation) with `fyn shell`.\n- [Upgrades dependencies](#upgrade-dependencies) in one command with `fyn upgrade`.\n- [Runs scripts](#scripts), with support for inline dependency metadata.\n- [Installs and manages](#python-versions) Python versions.\n- [Runs and installs](#tools) tools published as Python packages.\n- Includes a [pip-compatible interface](#the-pip-interface) for a performance boost with a familiar\n  CLI.\n- Supports Cargo-style workspaces for scalable projects.\n- Disk-space efficient, with a global cache for dependency deduplication.\n- Reduced package-index request metadata — compared with upstream uv, fyn sends a minimal\n  `fyn/\u003cversion\u003e` `User-Agent` header to package indexes such as PyPI, instead of `uv/\u003cversion\u003e`\n  plus the extra LineHaul environment metadata uv included. This reduces what is exposed in that\n  header, but package indexes still receive normal network and request information.\n- Supports macOS, Linux, and Windows.\n\n## Installation\n\nFrom [PyPI](https://pypi.org/project/fyn/):\n\n```bash\n# With pip.\npip install fyn\n```\n\n```bash\n# Or pipx.\npipx install fyn\n```\n\nOr build from source:\n\n```bash\ncargo install --path crates/fyn\n```\n\nSee the command line reference with `fyn help`.\n\n## Documentation\n\nThe live docs site is [duriantaco.github.io/fyn](https://duriantaco.github.io/fyn/). The source of\ntruth still lives in [`docs/`](https://github.com/duriantaco/fyn/tree/main/docs) in the repository.\n\nStart here:\n\n- [Documentation home](https://duriantaco.github.io/fyn/)\n- [Getting started](https://duriantaco.github.io/fyn/getting-started/first-steps/)\n- [Working on projects](https://duriantaco.github.io/fyn/guides/projects/)\n- [Running scripts](https://duriantaco.github.io/fyn/guides/scripts/)\n- [Command reference](https://duriantaco.github.io/fyn/reference/cli/)\n\nFor CLI-specific help, use `fyn help` or `fyn help \u003ccommand\u003e`.\n\n## Features\n\n### Projects\n\nfyn manages project dependencies and environments, with support for lockfiles, workspaces, and more,\nsimilar to `rye` or `poetry`:\n\n```console\n$ fyn init example\nInitialized project `example` at `/home/user/example`\n\n$ cd example\n\n$ fyn add ruff\nCreating virtual environment at: .venv\nResolved 2 packages in 170ms\nInstalled 2 packages in 1ms\n + ruff==0.5.0\n\n$ fyn run ruff check\nAll checks passed!\n\n$ fyn lock\nResolved 2 packages in 0.33ms\n\n$ fyn sync\nResolved 2 packages in 0.70ms\nChecked 1 package in 0.02ms\n```\n\n### Task runner\n\nDefine tasks in your `pyproject.toml` and run them with `fyn run`:\n\n```toml\n[tool.fyn.tasks]\ntest = { cmd = \"pytest -xvs\", env = { PYTHONWARNINGS = \"error\" } }\nlint = \"ruff check .\"\nformat = { cmd = \"ruff format .\", description = \"Format code\" }\ncheck = { chain = [\"lint\", \"test\"], description = \"Lint then test\" }\n```\n\n```console\n$ fyn run test\n# runs pytest -xvs\n\n$ fyn run check\n# runs lint, then test\n\n$ fyn run test -- -k mytest\n# extra args are passed through\n\n$ fyn run --list-tasks\nAvailable tasks:\n  check    Lint then test\n  format   Format code\n  lint     ruff check .\n  test     pytest -xvs\n```\n\nTask `env` values are applied to the spawned command. For chained tasks, parent `env` values are\ninherited by child tasks, and child task values take precedence. Extra arguments are supported for\n`cmd` tasks, but not for chained tasks.\n\n### Shell activation\n\nActivate the project's virtual environment in a new shell:\n\n```console\n$ fyn shell\nsuccess: Activated virtual environment at .venv\nType exit to deactivate.\n```\n\nWorks with bash, zsh, fish, nushell, powershell, and cmd.\n\nIf you pass a path, `fyn shell` activates that environment directly. Otherwise it uses `VIRTUAL_ENV`\nwhen set, then the discovered project environment, then a local `.venv`. Use `--no-project` to skip\nproject discovery and only check the current directory.\n\n### Upgrade dependencies\n\nUpgrade all or specific dependencies in one command:\n\n```console\n$ fyn upgrade\ninfo: Upgrading all dependencies...\nsuccess: Dependencies upgraded successfully.\n\n$ fyn upgrade requests flask\ninfo: Upgrading: requests, flask\nsuccess: Dependencies upgraded successfully.\n```\n\nSupports `--dry-run` and `--no-sync`.\n\n`fyn upgrade` is the convenience form of running `fyn lock --upgrade` and then `fyn sync`.\n\n### Project status\n\nInspect the current project and environment state:\n\n```console\n$ fyn status\ncurrent directory: /home/user/example\nproject directory: /home/user/example\nmanaged project: yes\nworkspace root: /home/user/example\npyproject.toml: yes\nfyn.lock: yes\npip-in-project: warn\nenvironment: /home/user/example/.venv\npython: /home/user/example/.venv/bin/python3 (3.12.0)\n```\n\nUse `--check` to fail when obvious project checks do not pass, or `--json` for scripting and editor\nintegrations.\n\n### PyTorch backend diagnosis\n\nInspect the current machine and environment before installing or reinstalling PyTorch:\n\n```console\n$ fyn torch doctor\nPyTorch doctor\nrecommended backend: cu130\n\nnext command:\n  fyn pip install torch torchvision torchaudio --torch-backend=cu130\n```\n\nUse `--json` for scripting. `fyn torch doctor` reports the recommendation and current package state,\nbut does not modify `pyproject.toml`.\n\n### Scripts\n\nfyn manages dependencies and environments for single-file scripts.\n\nCreate a new script and add inline metadata declaring its dependencies:\n\n```console\n$ echo 'import requests; print(requests.get(\"https://example.com\"))' \u003e example.py\n\n$ fyn add --script example.py requests\nUpdated `example.py`\n```\n\nThen, run the script in an isolated virtual environment:\n\n```console\n$ fyn run example.py\nReading inline script metadata from: example.py\nInstalled 5 packages in 12ms\n\u003cResponse [200]\u003e\n```\n\n### Tools\n\nfyn executes and installs command-line tools provided by Python packages, similar to `pipx`.\n\nRun a tool in an ephemeral environment using `fynx` (an alias for `fyn tool run`):\n\n```console\n$ fynx pycowsay 'hello world!'\nResolved 1 package in 167ms\nInstalled 1 package in 9ms\n  \"\"\"\n\n  ------------\n\u003c hello world! \u003e\n  ------------\n   \\   ^__^\n    \\  (oo)\\_______\n       (__)\\       )\\/\\\n           ||----w |\n           ||     ||\n```\n\nInstall a tool with `fyn tool install`:\n\n```console\n$ fyn tool install ruff\nResolved 1 package in 6ms\nInstalled 1 package in 2ms\n + ruff==0.5.0\nInstalled 1 executable: ruff\n\n$ ruff --version\nruff 0.5.0\n```\n\n### Python versions\n\nfyn installs Python and allows quickly switching between versions.\n\nInstall multiple Python versions:\n\n```console\n$ fyn python install 3.12 3.13 3.14\nInstalled 3 versions in 972ms\n + cpython-3.12.12-macos-aarch64-none\n + cpython-3.13.9-macos-aarch64-none\n + cpython-3.14.0-macos-aarch64-none\n```\n\nUse a specific Python version in the current directory:\n\n```console\n$ fyn python pin 3.11\nPinned `.python-version` to `3.11`\n```\n\n### The pip interface\n\nfyn provides a fast, pip-compatible interface for common `pip`, `pip-tools`, and `virtualenv`\nworkflows.\n\nFor many common workflows, you can switch to the `fyn pip` interface with minimal changes and keep\nthe same overall workflow shape, while getting a 10-100x speedup.\n\nCompile requirements into a platform-independent requirements file:\n\n```console\n$ fyn pip compile requirements.in \\\n   --universal \\\n   --output-file requirements.txt\nResolved 43 packages in 12ms\n```\n\nCreate a virtual environment:\n\n```console\n$ fyn venv\nUsing Python 3.12.3\nCreating virtual environment at: .venv\nActivate with: source .venv/bin/activate\n```\n\nInstall the locked requirements:\n\n```console\n$ fyn pip sync requirements.txt\nResolved 43 packages in 11ms\nInstalled 43 packages in 208ms\n + babel==2.15.0\n + certifi==2024.7.4\n ...\n```\n\n### Cache size limit\n\nKeep your cache from growing unbounded:\n\n```bash\nexport UV_CACHE_MAX_SIZE=2G\n```\n\nOldest entries are automatically pruned after every command when the cache exceeds the limit.\nSupports `K`, `M`, `G`, and `T` suffixes.\n\n### Custom lockfile name\n\nUse different lockfiles for different environments:\n\n```bash\nUV_LOCKFILE=linux.lock fyn lock\nUV_LOCKFILE=macos.lock fyn lock\n```\n\n### Private index support\n\nEnvironment variables work in index URLs — useful for private indexes with credentials:\n\n```toml\n[[tool.fyn.index]]\nname = \"private\"\nurl = \"https://${PYPI_TOKEN}@pypi.example.com/simple/\"\n```\n\nExplicit indexes are also respected for transitive dependencies, so you don't have to list every\ninternal package as a direct dependency.\n\n## Migrating from uv\n\nfyn is close to uv, but not a zero-edit rename. Most command-line workflows and `UV_*` environment\nvariables carry over, but project metadata and lockfile names differ.\n\n```bash\n# 1. Rename your lockfile\nmv uv.lock fyn.lock\n\n# 2. In pyproject.toml, rename [tool.uv] to [tool.fyn]\nsed -i 's/\\[tool\\.uv\\]/[tool.fyn]/' pyproject.toml\n\n# 3. Use fyn instead of uv\nfyn sync\nfyn run pytest\nfynx ruff check .\n```\n\n## Contributing\n\nWe are passionate about supporting contributors of all levels of experience and would love to see\nyou get involved in the project. See the\n[contributing guide](https://github.com/duriantaco/fyn/blob/main/CONTRIBUTING.md) to get started.\n\n## FAQ\n\n#### What platforms does fyn support?\n\nThe same ones as uv: macOS, Linux, and Windows, across x86_64 and aarch64.\n\n#### Is fyn compatible with uv?\n\nAt the workflow level, often yes, but not as a drop-in replacement. Many commands and `UV_*`\nenvironment variables carry over, but fyn now has fork-specific commands, config, defaults, and\nbehavior. Projects still need `[tool.uv]` renamed to `[tool.fyn]` and `uv.lock` renamed to\n`fyn.lock` unless you override the lockfile name.\n\n#### What's different from uv?\n\nSee [MANIFESTO.md](https://github.com/duriantaco/fyn/blob/main/MANIFESTO.md) for the fuller\ncomparison, or the table below for some of the larger user-visible differences:\n\n| Area                          | uv                                    | fyn                                           |\n| ----------------------------- | ------------------------------------- | --------------------------------------------- |\n| Config namespace and lockfile | `[tool.uv]`, `uv.lock`                | `[tool.fyn]`, `fyn.lock`                      |\n| Package index User-Agent      | `uv/\u003cversion\u003e` plus LineHaul metadata | Minimal `fyn/\u003cversion\u003e`                       |\n| Task runner                   | No `[tool.uv.tasks]`                  | `[tool.fyn.tasks]`                            |\n| `shell` command               | No `uv shell`                         | `fyn shell`                                   |\n| `upgrade` command             | No `uv upgrade`                       | `fyn upgrade`                                 |\n| `status` command              | No `uv status`                        | `fyn status`                                  |\n| `torch doctor` command        | No `uv torch doctor`                  | `fyn torch doctor`                            |\n| Managed-project `pip` policy  | No `pip-in-project` setting           | `pip-in-project`: `warn`, `error`, or `allow` |\n| Cache size limit              | No `UV_CACHE_MAX_SIZE`                | `UV_CACHE_MAX_SIZE`                           |\n| Custom lockfile name          | No `UV_LOCKFILE`                      | `UV_LOCKFILE`                                 |\n\n## Acknowledgements\n\nfyn's dependency resolver uses [PubGrub](https://github.com/pubgrub-rs/pubgrub) under the hood.\nWe're grateful to the PubGrub maintainers, especially [Jacob Finkelman](https://github.com/Eh2406),\nfor their support.\n\nfyn started as a fork of [uv](https://github.com/astral-sh/uv) by Astral and still shares\nsubstantial ancestry with it.\n\nSome of fyn's workflow UX, especially around task-running and future workflow ergonomics, has also\nbeen informed by [Hatch](https://github.com/pypa/hatch).\n\nfyn's Git implementation is based on [Cargo](https://github.com/rust-lang/cargo).\n\nSome of fyn's optimizations are inspired by the great work we've seen in [pnpm](https://pnpm.io/),\n[Orogene](https://github.com/orogene/orogene), and [Bun](https://github.com/oven-sh/bun). We've also\nlearned a lot from Nathaniel J. Smith's [Posy](https://github.com/njsmith/posy) and adapted its\ntrampoline for Windows support.\n\n## License\n\nfyn is licensed under either of\n\n- Apache License, Version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or\n  \u003chttps://www.apache.org/licenses/LICENSE-2.0\u003e)\n- MIT license ([LICENSE-MIT](LICENSE-MIT) or \u003chttps://opensource.org/licenses/MIT\u003e)\n\nat your option.\n\nUnless you explicitly state otherwise, any contribution intentionally submitted for inclusion in fyn\nby you, as defined in the Apache-2.0 license, shall be dually licensed as above, without any\nadditional terms or conditions.\n","funding_links":[],"categories":["Rust"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fduriantaco%2Ffyn","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fduriantaco%2Ffyn","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fduriantaco%2Ffyn/lists"}