This project has been archived by its maintainers, and is no longer receiving any updates.
pp
A declarative, language-agnostic task runner and build system.
Stop memorizing different build tools. Define your commands once in pp.yaml and run them anywhere.
pp myapp build # Build your app
pp myapp test # Run tests
pp myapp deploy # Deploy
Works with any language: Python, Node.js, Rust, Go, Docker, or shell scripts.
Why pp?
- ✅ One interface for everything - Same commands across all projects
- ✅ Task dependencies - Automatic execution ordering (lint → test → build)
- ✅ Type-safe parameters - Validated arguments with defaults and constraints
- ✅ Environment management - Automatic venv activation, env vars, working directories
- ✅ Simple & fast - 1,000 lines of straightforward code, zero dependencies
Quick Start
1. Install:
pip install ppbuild
macOS users: click for installation options
If you get an "externally-managed-environment" error:
# Option 1: Use pipx (recommended)
brew install pipx
pipx install ppbuild
# Option 2: Use venv
python3 -m venv ~/.pp-env
source ~/.pp-env/bin/activate
pip install ppbuild
2. Create pp.yaml:
applications:
myapp:
help: "My awesome application"
actions:
build:
help: "Build the project"
command: ["cargo", "build", "--release"]
test:
help: "Run tests"
command: ["cargo", "test"]
depends_on: [build]
deploy:
help: "Deploy to production"
command: ["./deploy.sh"]
depends_on: [test]
3. Run:
pp myapp deploy # Automatically runs: build → test → deploy
Features
Task Dependencies
Actions run in the correct order automatically:
actions:
deploy:
command: ["./deploy.sh"]
depends_on: [lint, test, build] # Runs lint → test → build → deploy
Typed Parameters
Add validated, type-safe parameters to your commands:
actions:
run:
parameters:
port:
type: integer
default: 8000
min: 1024
max: 65535
debug:
type: boolean
default: false
command: ["python", "app.py", "--port", "{port}", "{debug:--debug}"]
pp myapp run --port 3000 --debug
Environment Management
Automatic environment setup:
applications:
backend:
directory: "~/projects/backend" # Auto-changes directory
venv: ".venv" # Auto-activates venv
env_vars:
DATABASE_URL: "postgresql://localhost/db"
API_KEY: "${SECRET_API_KEY}" # Substitutes env vars
actions:
# ... your actions
Flexible Configuration
- Global:
~/.pp/pp.yamlfor system-wide tools - Project:
./pp.yamlfor project-specific commands - Environment:
.pp.envfor secrets and local overrides
Examples
Web Development:
applications:
web:
directory: "./frontend"
actions:
dev:
command: ["npm", "run", "dev"]
build:
command: ["npm", "run", "build"]
deploy:
command: ["vercel", "deploy"]
depends_on: [build]
Python Project:
applications:
api:
venv: ".venv"
env_vars:
PYTHONPATH: "./src"
actions:
install:
command: ["pip", "install", "-r", "requirements.txt"]
test:
command: ["pytest", "--cov=src"]
depends_on: [install]
lint:
command: ["black", ".", "--check"]
Multi-Service:
applications:
stack:
actions:
up:
command: ["docker-compose", "up", "-d"]
logs:
command: ["docker-compose", "logs", "-f"]
down:
command: ["docker-compose", "down"]
See examples/ for more configurations.
Documentation
- TEMPLATE.md - Complete configuration reference
Development
# Clone and install
git clone https://github.com/JoshCap20/pp.git
cd pp
pip install -e .
# Run tests
pytest # Run all tests
pytest --cov=lib # With coverage
# Format and lint
black .
isort .
Architecture
Simple, straightforward Python code. No design patterns, no over-engineering.
pp/
├── pp.py # Main entry point (144 lines)
└── lib/ # Core library (~850 lines)
├── config.py # YAML loading & validation
├── params.py # Parameter handling
├── execution.py # Command execution
├── dependencies.py # Dependency resolution
└── cli.py # Argument parser
Test coverage: 72% overall, 99% on core logic
License
MIT License - see LICENSE
Contributing
Contributions welcome! This project values simplicity above all else. Before adding features, consider whether they truly need to exist.
Stop context-switching between build tools. Use pp.
Metadata
Release files for ppbuild 2.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| ppbuild-2.0.0.tar.gz | 20.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| ppbuild-2.0.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 35.6 kB
Release files / ppbuild-2.0.0.tar.gz
| Download URL | ppbuild-2.0.0.tar.gz |
|---|---|
| Size | 20.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
1de2ffffa9f7f66390bb03c660a4678b34b0c27a30ad0d9d9e378e358818e165
|
|
BLAKE2b-256 checksum How to use checksums |
2c07f3ebfdabafe251332ec14e53bee1c205a71a0196cadfe3fb8421d79fa63b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
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 21, 2025.
Transparency logRelease files / ppbuild-2.0.0-py3-none-any.whl
| Download URL | ppbuild-2.0.0-py3-none-any.whl |
|---|---|
| Size | 15.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
4b0f96a436bdf3775bc2bd2addf61e2367cfc53e262b45b6fc4b3087946d56ff
|
|
BLAKE2b-256 checksum How to use checksums |
9d97266436dd08ed39ee400f3032b6068e6815a47cbb0ee692372f76d9ddd914
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
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 21, 2025.
Transparency log