This release is a pre-release and may not be stable for production use.
One command-line workflow for Python projects.
Fast, opinionated, built with Rust.
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,testand more, instead of remembering four tools and their flags. pyfaro checkis 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 fastapigenerates a typed FastAPI app, andpyfaro devruns 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 withpyfaro run <task>, with no implicit shell and the same behavior on Linux, macOS and Windows. - No second ecosystem. Standard
pyproject.tomland uv'suv.lock. Pyfaro adds a tiny[tool.pyfaro]table and leaves everything else alone. - Adopt it in place.
pyfaro initpreviews what it would change before touching your existing project. - Predictable by design. Nothing syncs, installs or downloads behind your
back.
doctorexplains 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 --applyis Linux-only for now; on macOS and Windowsinitpreviews but does not apply. - Implemented:
create,init,sync,add,remove,run,dev,python,build,tools,doctor,lint,fmt,type,check,testandcompletions.
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)
| 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)
| File | Actions Reset | |||
|---|---|---|---|---|
| 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 logRelease 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 logRelease 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 logRelease 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 logRelease 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 logRelease 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 logSecurity 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.
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 logA 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.