Repository navigation
v1.0.0
PnP CLI v1.0.0
Pixel & Process Kubernetes Deployment Manager — Run pnp deploy in any project and it's live on the cluster. Fully automatic.
Install
brew install fwartner/tap/pnpOr download binaries below (linux/darwin, amd64/arm64).
What It Does
Run pnp deploy inside a Laravel, Next.js, or Strapi project. The CLI:
- Detects project type automatically
- Runs an interactive wizard to configure domain, database, Redis, queues, etc.
- Generates Kubernetes manifests and pushes them to your GitOps repo
- Generates a Dockerfile and GitHub Actions CI/CD pipeline
- Commits and pushes everything — both to the GitOps repo and the project repo
- Sets up GITOPS_TOKEN so CI can push cross-repo automatically
After that, every push to main is fully automatic: build → push to GHCR → update GitOps repo → ArgoCD syncs → app is live.
Features
Project Types
- Laravel Web/API — nginx + PHP-FPM, queue workers, scheduler, Horizon, Reverb
- Laravel Octane — FrankenPHP, Swoole, or RoadRunner
- Next.js — Fullstack (with DB) or Static
- Strapi — Headless CMS with persistence
Infrastructure
- ArgoCD GitOps with auto-sync and self-heal
- CloudNativePG for PostgreSQL databases
- Redis via redis-operator
- cert-manager + Let's Encrypt for TLS
- external-dns + Cloudflare for DNS
- Infisical for secrets management (optional)
- Traefik ingress with HTTPS
Scope-Based Organization
apps/customer/{name}— client projectsapps/agency/{name}— agency/internal toolsapps/previews/{name}— preview/staging deployments
Pre-Built Base Images
Laravel builds use pre-built base images on GHCR for fast CI:
ghcr.io/fwartner/pnp/laravel-fpmghcr.io/fwartner/pnp/laravel-frankenphpghcr.io/fwartner/pnp/laravel-swooleghcr.io/fwartner/pnp/laravel-roadrunner
Security
- Docker BuildKit secrets for
COMPOSER_AUTH(no build args) - Auto-generated
APP_KEYand DB passwords - Private Composer package support
Commands
| Command | Description |
|---|---|
pnp deploy |
Full deploy wizard (first-time setup) |
pnp sync |
Re-render and push GitOps manifests (non-interactive) |
pnp update |
Re-render templates from existing config |
pnp destroy |
Remove app from cluster |
Configuration
Global (~/.pnp.yaml):
gitopsRepo: /path/to/local/gitops-repo
gitopsRemote: https://github.com/org/gitops.git
defaults:
domain: example.com
imageRegistry: ghcr.io
profiles:
customer:
domain: preview.example.com
githubOrg: my-orgPer-project (.cluster.yaml) — auto-generated by the wizard.