Skip to main content
Pre-release

This release is a pre-release and may not be stable for production use.

Pyfaro

One command-line workflow for Python projects.
Fast, opinionated, built with Rust.

crates.io version CI status License: Apache-2.0 Documentation

Pyfaro brings project creation, dependencies, Python versions, linting, formatting, type checking and testing under a single pyfaro command. It does not replace the tools you already trust: it orchestrates uv, Ruff, ty and pytest behind one consistent, scriptable interface, so a new contributor, a CI job and a git hook all run exactly the same commands.

Beta software. Pyfaro is under active development and interfaces may still change before 1.0. See Project status.

Why Pyfaro

  • One entry point. create, sync, add, check, test and more, instead of remembering four tools and their flags.
  • pyfaro check is your quality gate. Format check, lint and type check in one run, with a clear summary and an honest exit code. It writes files only when you pass --fix.
  • From scaffold to running server. pyfaro create fastapi generates a typed FastAPI app, and pyfaro dev runs it with Uvicorn and auto-reload, supervised: Ctrl-C stops the whole process tree and nothing is left behind.
  • Tasks without a second tool. Name the commands you run often in [tool.pyfaro.tasks] and run them with pyfaro run <task>, with no implicit shell and the same behavior on Linux, macOS and Windows.
  • No second ecosystem. Standard pyproject.toml and uv's uv.lock. Pyfaro adds a tiny [tool.pyfaro] table and leaves everything else alone.
  • Adopt it in place. pyfaro init previews what it would change before touching your existing project.
  • Predictable by design. Nothing syncs, installs or downloads behind your back. doctor explains what is wrong and how to fix it.
  • A single native binary written in Rust.

Demo

$ pyfaro create lib textkit
Created library at ~/projects/textkit
$ cd textkit
$ pyfaro sync
Using CPython 3.13.11
Creating virtual environment at: .venv
Resolved 12 packages in 93ms
...
$ pyfaro check
4 files already formatted
All checks passed!
All checks passed!

== pyfaro check summary ==
format: ok
lint: ok
type: ok
check: ok
$ pyfaro test
============================= test session starts ==============================
...
collected 1 item

tests/test_library.py .                                                  [100%]

============================== 1 passed in 0.01s ===============================

Installation

Pyfaro needs uv 0.9.26 or newer at runtime. Pyfaro never installs uv or Python for you.

Install script for Linux and macOS. It downloads the newest release for your machine over HTTPS, verifies it against SHA256SUMS and installs it to ~/.local/bin, without sudo and without touching your shell profile:

curl --proto '=https' --tlsv1.2 -LsSf https://pyfaro.dev/install.sh | sh

On Windows, in PowerShell:

powershell -ExecutionPolicy ByPass -c "irm https://pyfaro.dev/install.ps1 | iex"

Prefer to read a script before running it? Download it first with curl ... -o install.sh (or irm ... -OutFile install.ps1), inspect it, then run the file. Run the script again to upgrade; set PYFARO_VERSION to pin a version.

From PyPI, without a Rust toolchain (from 0.5.0b1; Pyfaro's 0.5.0-beta.1 is 0.5.0b1 in Python's version format):

uv tool install pyfaro      # or: pipx install pyfaro / pip install pyfaro

Every published version is still a pre-release, and installers fall back to the newest pre-release when there is no stable one, so these commands work as they are. To pin one, name it (uv tool install pyfaro==0.5.0b1). Once a stable version exists, add --prerelease allow (uv) or --pre (pip, and pipx install --pip-args=--pre) to keep following the pre-releases.

From crates.io (Rust 1.90 or newer):

cargo install pyfaro --version 0.5.0-beta.1 --locked

While every published version is a pre-release, Cargo needs the explicit --version; a bare cargo install pyfaro finds no stable release.

Prebuilt binaries for Linux (x86_64, aarch64), macOS (arm64, x86_64) and Windows (x86_64) are attached to each GitHub Release, together with a SHA256SUMS file and a build provenance attestation for each asset. The archives are not code-signed: verify them against SHA256SUMS (and, with the GitHub CLI, gh attestation verify <file> --repo pyfaro/pyfaro), extract, and put pyfaro on your PATH.

Check the installation, and the toolchain around it:

pyfaro --version
pyfaro doctor      # explains a missing or outdated uv and how to fix it

More detail: Installation.

Quick start

pyfaro create lib my-lib      # or: create cli my-app, create fastapi my-api
cd my-lib
pyfaro sync                   # create .venv and uv.lock
pyfaro add "requests>=2"      # then: pyfaro sync
pyfaro check                  # format check, lint, type check
pyfaro test                   # run pytest

Building an API? A FastAPI project is ready to serve right after sync (published in 0.4.0-alpha.1):

pyfaro create fastapi my-api
cd my-api
pyfaro sync
pyfaro dev                    # Uvicorn with reload on http://127.0.0.1:8000

The FastAPI guide goes from install to a running app and a passing CI workflow.

Adopting an existing project? Preview first, then apply (Linux only for now):

pyfaro init                   # preview, writes nothing
pyfaro init --apply

Walk through it step by step in First steps, or follow a full workflow.

Commands

Command What it does
create Scaffold a packaged library (lib), command-line app (cli) or FastAPI app (fastapi)
init Preview or apply Pyfaro initialization of an existing project
sync Create or update .venv and uv.lock through uv
add / remove Edit dependencies and dependency groups through uv
run Run a program, or a named task, in the project environment
dev Run the development server or process with supervision
python List, install and pin Python versions through uv
build Build a source distribution and a wheel through uv, with the project's own build backend
tools Show the resolved path and version of uv, Ruff, ty and pytest
doctor Diagnose configuration, environment and tools
lint / fmt Lint and format with Ruff
type Type-check with ty
check Format check, lint and type check in one run; --fix applies safe fixes
test Run pytest in the project environment
completions Print the tab-completion script for Bash, Zsh, Fish or PowerShell

Recipes live in the workflows section: a new library, a new CLI, a FastAPI app, adopting an existing project, CI and troubleshooting.

How it works

Pyfaro owns the command line, configuration, orchestration and diagnostics. Everything else stays with the tool built for it.

Responsibility Owner
CLI, configuration, orchestration, diagnostics Pyfaro
Python, environments, resolution, dependencies, packaging uv
Linting and formatting Ruff
Static typing ty
Test execution pytest

There is no second resolver, lock file format, package manager, linter or test engine: Pyfaro calls the real tools and passes their output and exit status through. Read more in How it works and the architecture decision record.

Project status

Pyfaro is beta. The latest version is 0.5.0-beta.1 (0.5.0b1 on PyPI). Interfaces may still change before 1.0.

  • Tested versions: uv 0.9.26, Ruff 0.16.10, ty 0.0.85, pytest 9.1.1.
  • Platforms: Linux, macOS and Windows are built and tested in CI. init --apply is Linux-only for now; on macOS and Windows init previews but does not apply.
  • Implemented: create, init, sync, add, remove, run, dev, python, build, tools, doctor, lint, fmt, type, check, test and completions.

See the changelog for what each release contains.

Roadmap

Planned, not yet available: workspaces. Milestones are planning targets, not release announcements. Follow the roadmap board, milestones and issues.

Contributing

Contributions are welcome. Read the contribution guide and the code of conduct; report vulnerabilities as described in the security policy. Questions are welcome in Discussions.

To build from source you need Rust (the toolchain is pinned in rust-toolchain.toml):

git clone https://github.com/pyfaro/pyfaro.git
cd pyfaro
cargo build --locked
cargo run --locked -- --help

License

Pyfaro is licensed under Apache-2.0.

Metadata

Release files for pyfaro 0.5.0b1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for pyfaro 0.5.0b1
File Size Uploaded Provenance Actions
pyfaro-0.5.0b1.tar.gz 240.9 kB With provenance Details for pyfaro-0.5.0b1.tar.gz

Built distributions (wheels)

Table of built distributions (wheels) for pyfaro 0.5.0b1
File Actions
pyfaro-0.5.0b1-py3-none-win_amd64.whl Python 3 none Windows x86-64 Details for pyfaro-0.5.0b1-py3-none-win_amd64.whl
pyfaro-0.5.0b1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl Python 3 none Linux glibc 2.17+ x86-64 Details for pyfaro-0.5.0b1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
pyfaro-0.5.0b1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl Python 3 none Linux glibc 2.17+ ARM64 Details for pyfaro-0.5.0b1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
pyfaro-0.5.0b1-py3-none-macosx_11_0_arm64.whl Python 3 none macOS 11.0+ ARM64 Details for pyfaro-0.5.0b1-py3-none-macosx_11_0_arm64.whl
pyfaro-0.5.0b1-py3-none-macosx_10_12_x86_64.whl Python 3 none macOS 10.12+ x86-64 Details for pyfaro-0.5.0b1-py3-none-macosx_10_12_x86_64.whl

Total release size: 5.1 MB

Release files / pyfaro-0.5.0b1.tar.gz

Download URL pyfaro-0.5.0b1.tar.gz
Size 240.9 kB
Tags Source
SHA-256 checksum
How to use checksums
461b686928f59fc222204660b48326af0ec5c3ec744caa119d490da8587c66ca
BLAKE2b-256 checksum
How to use checksums
28dd7227c4a66a4d8b7b95af6789b3dcaf940108ebda7e5cfac1a8707adf6674
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 25, 2026.

Transparency log

Release files / pyfaro-0.5.0b1-py3-none-win_amd64.whl

Download URL pyfaro-0.5.0b1-py3-none-win_amd64.whl
Size 936.5 kB
Tags Python 3 Windows x86-64
SHA-256 checksum
How to use checksums
d5a0d798ccc039fb8a52407438619ce5aa1d26dc163ac2881b8afc70d5289576
BLAKE2b-256 checksum
How to use checksums
458b650bf3ed134e82f756fd7c658c968127d2bc030017220de279e08097f47a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 25, 2026.

Transparency log

Release files / pyfaro-0.5.0b1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL pyfaro-0.5.0b1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Size 1.0 MB
Tags Linux glibc 2.17+ x86-64 Python 3
SHA-256 checksum
How to use checksums
2bb8f0c045ceb052705363e60acedfb323da08eb117fac6602e9f3cde35a24cb
BLAKE2b-256 checksum
How to use checksums
96ac6a9857cb0028af8fd4ea1d529beaa88175286cb9de8b4097ef9f69ccd719
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 25, 2026.

Transparency log

Release files / pyfaro-0.5.0b1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl

Download URL pyfaro-0.5.0b1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Size 974.3 kB
Tags Linux glibc 2.17+ ARM64 Python 3
SHA-256 checksum
How to use checksums
fa005465c8770a51724521579c7b63e67adb934592a17df6e961da7d0f26f439
BLAKE2b-256 checksum
How to use checksums
22102ab5b55ed3ed47916b7367d456d5e863e948deab7c0b0c978ddc2e91a92f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 25, 2026.

Transparency log

Release files / pyfaro-0.5.0b1-py3-none-macosx_11_0_arm64.whl

Download URL pyfaro-0.5.0b1-py3-none-macosx_11_0_arm64.whl
Size 974.8 kB
Tags Python 3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
d53831b5f9882fb2da0ce67c91420e28c7250cc4a75ef2ff96977ff64d1cb30d
BLAKE2b-256 checksum
How to use checksums
3c5e536ae135c01a691a01b53726d5c3020d10c83dd4276b5b337f19519b6ab0
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 25, 2026.

Transparency log

Release files / pyfaro-0.5.0b1-py3-none-macosx_10_12_x86_64.whl

Download URL pyfaro-0.5.0b1-py3-none-macosx_10_12_x86_64.whl
Size 1.0 MB
Tags Python 3 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
aa3317365420f495ba6aaea3b93e0ff56e1cf00da62d305512fe9c0b1ae03722
BLAKE2b-256 checksum
How to use checksums
d4ce56b4d2c40bb0fa1ff25e883b865111fed28bf3dafc5f31bfbf55cffd6c65
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 25, 2026.

Transparency log

Security for pyfaro 0.5.0b1

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 6 files in this release have been uploaded with provenance metadata.

Select from 6 files

Attestation for pyfaro-0.5.0b1.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 25, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release
Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page