neuron-explorer
Steering-first neuron explorer for Qwen3.5-4B: push every MLP neuron, keep every rollout, browse the results
Composable CI/CD pipelines with fast feedback and resilient release controls. Docker Compose setup in 60 seconds.
Developer toolsPython · ShellGitHub @paruffOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Woodpecker CI-based DevSecOps platform with Cloud Native Buildpacks, DORA observability, and standardized pipeline contract for polyglot applications
Taken from the repository README
Loading the full README. The saved excerpt is shown below.
Integration & Delivery Plane of the Fawkes IDP Family
Start here: INTENT.md. Covers standalone vs. suite mode, the contracts other repos depend on, and non-goals.
uFawkesPipe is a Woodpecker CI-based CI/CD platform with integrated SAST (SonarQube, Trivy, Gitleaks), Cloud Native Buildpacks, and DefectDojo security scan ingestion — the CI/CD plane of the Fawkes IDP.Read the full README ↗Integration & Delivery Plane of the Fawkes IDP Family
Start here: INTENT.md. Covers standalone vs. suite mode, the contracts other repos depend on, and non-goals.
uFawkesPipe is a Woodpecker CI-based CI/CD platform with integrated SAST (SonarQube, Trivy, Gitleaks), Cloud Native Buildpacks, and DefectDojo security scan ingestion — the CI/CD plane of the Fawkes IDP.
.fawkespipe.yml configuration (see docs/pipeline-contract.md)policy-check pipeline step — see Security Plane belowEvery pipeline in uFawkesPipe follows these standardized stages (defined in .woodpecker.yml):
| # | Stage | Steps | Parallel | Branch Gate |
|---|---|---|---|---|
| 1 | validate | init → lint-yaml + lint-shell | Yes (lint) | None |
| 2 | test | unit-tests + integration-tests + contract-tests | Yes | None |
| 3 | security | secrets-scan → vuln-scan-fs → vuln-scan-image | Sequential | vuln-scan-image: main only |
| 4 | build | build-image | — | main only |
| 5 | publish | upload-defectdojo | — | main only |
| 6 | deploy | notify-obs | — | main only |
Step details:
compose.yaml, .woodpecker.yml, .env.example with yamllintscripts/*.sh and validate.sh.gitleaks.toml rulesAll steps emit structured JSON logs via scripts/dora-log.sh compatible with uFawkesObs/Loki ingestion.
┌─────────────────────────────────────────────────────────────┐
│ uFawkesPipe Platform │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌────────────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Woodpecker Server │ │ SonarQube │ │ Portainer │ │
│ │ + Agent │ │ (SAST) │ │ CE (CD) │ │
│ │ │ │ │ │ │ │
│ │ - Pipeline YAML │ │ - Quality │ │ - Stacks │ │
│ │ - GitHub OAuth │ │ Gates │ │ - Secrets │ │
│ │ - CLI triggers │ │ - Coverage │ │ - Volumes │ │
│ └────────────────────┘ └──────────────┘ └──────────────┘ │
│ │ │ │ │
│ └──────────────────────────┴────────────────┘ │
│ │ │
│ ┌────────▼────────┐ │
│ │ CNB Builder │ │
│ │ (Buildpacks) │ │
│ └────────┬────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────┐ │
│ │ Docker │ │
│ │ Registry │ │
│ └─────────────────┘ │
│ │
│ Suite mode: ┌────────────┐ ┌───────────────────┐ │
│ │ uFawkesRes*│ │ uFawkesObs │ │
│ │ (Postgres, │◄──│ (OTEL, Loki, │ │
│ │ Traefik) │ │ Prometheus) │ │
│ └────────────┘ └───────────────────┘ │
└─────────────────────────────────────────────────────────────┘
* uFawkesRes is deprecated; suite mode is unsupported until #97.
make up): Woodpecker + SonarQube + Portainer, local storagemake up-suite): unsupported until #97. It adds uFawkesObs's OTEL Collector, Alloy, Loki, and Prometheus, but still points databases at the deprecated uFawkesRes.The security plane (formerly the standalone uFawkesSec repo) is merged into this
repo's compose.yaml / compose.suite.yaml, gated behind the security Compose
profile — it does not start with a plain make up / docker compose up -d.
Run docker compose --profile security up -d (or make up-security) to bring it
up. uFawkesPipe stays a lightweight CI/CD plane by default; the full DefectDojo/
Infisical/Falco suite is for users who want it here rather than in Fawkes proper.
trivy-server is the exception — it stays in the default profile since the
pipeline itself uses it for image/fs scanning.
| Service | Image | Role |
|---|---|---|
defectdojo | defectdojo/defectdojo-django:2.38.0 | Security findings aggregation (Django) |
defectdojo-nginx | defectdojo/defectdojo-nginx:2.38.0 | Reverse proxy for DefectDojo |
defectdojo-celery-beat | defectdojo/defectdojo-django:2.38.0 | Periodic task scheduler |
defectdojo-celery-worker | defectdojo/defectdojo-django:2.38.0 | Async task worker |
infisical | infisical/infisical:v0.93.1-postgres | Zero-trust secrets store |
trivy-server | aquasec/trivy:0.74.0 | Shared Trivy CVE cache server |
falco | falcosecurity/falco-no-driver:0.39.2 | Runtime container security monitoring |
Standalone mode embeds its own postgres/valkey; suite mode (compose.suite.yaml)
redirects these services to the deprecated uFawkesRes's fawkes-postgres/fawkes-cache
instead (unsupported until #97). Rego policies live in policy/ and run as the policy-check pipeline
step (see docs/policy-guide.md).
docker compose plugin, not standalone docker-compose)Clone the repository
git clone https://github.com/paruff/uFawkesPipe.git
cd uFawkesPipe
Configure environment
cp .env.example .env
# Edit .env with your credentials and OAuth keys
nano .env
Start the platform
# Standalone mode (Woodpecker + SonarQube + Portainer)
make up
# Suite mode is unsupported until #97 (it still needs the deprecated uFawkesRes)
# make up-suite
Access the platform
| Service | Port | URL | Auth |
|---|---|---|---|
| Woodpecker CI | 8000 | http://localhost:8000 | GitHub OAuth |
| Portainer CE | 9443 | https://localhost:9443 | Admin account (first use) |
| SonarQube | 9000 | http://localhost:9000 | admin / (from .env) |
.fawkespipe.yml to your application repository (see docs/pipeline-contract.md)Full details: QUICKSTART.md
uFawkesPipe owns every reusable workflow the suite shares and publishes them under a release tag
(cut by release-please; tags are currently pre-releases, v1.x.y-beta.N). A suite repo calls them
at the commit SHA of a release tag, with the tag as a comment, and keeps no copy of them:
jobs:
preflight:
uses: paruff/uFawkesPipe/.github/workflows/reusable-preflight.yml@<40-hex SHA of the tag> # v1.14.0-beta.1
| Reusable | Does | Inputs |
|---|---|---|
reusable-preflight.yml | The repo's pre-commit hooks at the pre-commit and pre-push stages, PR size, commit format | pr-size-limit, commit-format, emergency-bypass, timeout-minutes, skip-hooks, runner, ci-image |
reusable-lint.yml | Language linters | languages, auto-detect, fail-on-warning, emergency-bypass, timeout-minutes |
reusable-security-scanning.yml | Secret scanning, Trivy, dependency scans, SARIF upload | scan-type, scan-path, severity-threshold, fail-on-critical, upload-sarif, gitleaks-config |
reusable-dependency-review.yml | Dependency review on pull requests | fail-on-severity, comment-summary-in-pr, base-ref, head-ref, deny-licenses |
reusable-build.yml | Build and validate (observability stack config, image pins, coverage gate) | validate-*, *-image, fail-on-latest, allow-latest, enable-coverage-gate, coverage-threshold, python-version, coverage-paths |
reusable-tests.yml | Test tiers (unit, integration, health checks) | test-tiers, python-version, run-unit, unit-test-command, integration-test-command, compose-profile, compose-file, health-endpoints, coverage-threshold, coverage-paths, setup-command |
reusable-rollback.yml | Roll a deploy back | deploy-path, restart-command |
reusable-main-ci-guard.yml |
Read the workflow_call block of a reusable for the exact types and defaults; they are the contract.
Every reusable's gate steps fail when their check fails (ci-pipeline spec R5).
Hook stages in the CI image. Pass ci-image: ghcr.io/paruff/ufawkes-ci@sha256:<digest> to
reusable-preflight.yml and its hook stages run in that container, with the same toolchain as a laptop
(spec R4). The ref must be this repo's image by digest; anything else fails the job. The image is
signed (cosign, keyless): cosign verify ghcr.io/paruff/ufawkes-ci@<digest> --certificate-identity-regexp '^https://github.com/paruff/uFawkesPipe/' --certificate-oidc-issuer https://token.actions.githubusercontent.com.
Self-hosted runner. runner is honoured only when the caller was triggered by workflow_dispatch;
every other event runs on ubuntu-latest, whatever is passed.
Moving the suite to a new release. scripts/suite-bump.sh <tag> [--dry-run] [repo...] rewrites every
Pipe call in each suite repo to the tag's SHA and opens one PR per repo; --dry-run shows the diff and
pushes nothing.
The .fawkespipe.yml file is the standard pipeline contract that defines how your application is built, tested, scanned, and deployed. It is placed at the root of your application repository.
app - Application metadata (name, type, language, version)build - Build configuration: cnb (Cloud Native Buildpacks), docker, or customstages - Enable/disable and configure pipeline stages (lint, test, sast, dependency_scan, build, image_scan, push)notifications - Slack and email notification configurationkubernetes - Kubernetes deployment configuration (promotion path)advanced - Timeout, retry, parallel execution, artifact retentionFull reference: docs/pipeline-contract.md
uFawkesPipe exposes Woodpecker CI webhooks for external plane integration.
Woodpecker CI automatically receives push webhooks from GitHub when a repository is activated. The webhook URL is auto-configured by Woodpecker during repository activation.
GitHub Webhook Integration:
Configured automatically when you activate a repository in Woodpecker. The webhook points to:
http://<woodpecker-host>:8000/api/hooks/<repository-id>application/jsonWoodpecker CLI triggers from the command line:
# List repositories and pipelines
woodpecker-cli repo ls
woodpecker-cli repo info <org/repo>
woodpecker-cli pipeline ls --repo <org/repo>
# Trigger a specific pipeline
woodpecker-cli pipeline start <org/repo> <pipeline-number>
See Woodpecker CLI documentation for full usage.
uFawkesPipe is designed for single-node development with Docker Compose. Kubernetes deployment support is planned but not yet implemented for the Woodpecker stack.
See the kubernetes section in the pipeline contract for the planned configuration schema.
.gitleaks.toml allowlist for test fixtures / placeholders; runs in pre-commit, Woodpecker CI, and GitHub Actions.fawkespipe.yml):latest)The tests/unit/ suite validates the .woodpecker.yml pipeline definition statically — it does not execute the pipeline against a live Woodpecker instance. End-to-end pipeline execution is verified manually via make up + Woodpecker UI.
pytest tests/unit/ Verifies| Test Module | Coverage |
|---|---|
test_woodpecker_yml.py | Pipeline structure: Valid YAML, steps list exists, when section present. Step ordering: init first, lint before security, test before security. Step configuration (per step): correct image & version pinning (e.g., alpine:3.20, zricethezav/gitleaks:v8.18.2, curlimages/curl:8.6.0), required commands/flags (--format json, --no-progress, --exit-code=1 for secrets), output paths (artifacts/security/*.json), secret wiring (from_secret), branch conditions (when: branch: main), DORA logging (source dora-log.sh, dora_start, dora_emit), non-blocking behavior (dora_warn on failure). Artifact directories: init creates artifacts/security, artifacts/coverage, artifacts/tests via mkdir -p. |
test_docker_compose_validation.py | Compose structure: Valid YAML, services section, all services have image, no :latest tags, all services have labels, volume declarations exist, named volumes (no host paths), no secrets in compose. Healthchecks: Services declare healthcheck (except dependency-check, pack-cli). |
test_compose_network.py | Standalone mode: compose.yaml declares NO fawkes-net, no services attach to it, woodpecker-agent has no WOODPECKER_BACKEND_DOCKER_NETWORK. Suite mode: compose.suite.yaml declares fawkes-net as external: true with name: fawkes-net, all 4 services attach, agent has WOODPECKER_BACKEND_DOCKER_NETWORK=fawkes-net. Makefile: network target creates fawkes-net idempotently (double-pipe true); up has NO network dep; up-suite HAS network dep. |
# All unit tests (fast, no external deps)
python3 -m pytest tests/unit/ -v
# With markers (unit, integration, smoke, acceptance)
python3 -m pytest tests/ -m unit
python3 -m pytest tests/ -m integration
python3 -m pytest tests/ -m smoke
python3 -m pytest tests/ -m acceptance
The CI pipeline is defined in .woodpecker.yml. Customize it to:
Application teams configure their pipeline behavior via .fawkespipe.yml at the root of their repository. See docs/pipeline-contract.md for the full reference.
Edit compose.yaml to:
Persistent data is stored in Docker volumes:
woodpecker_data — Woodpecker CI database and configportainer_data — Portainer CD datasonarqube_data — SonarQube analysis datapack_cache — CNB build cacheBackup volumes:
docker run --rm -v ufp_woodpecker_data:/data -v $(pwd):/backup alpine \
tar czf /backup/woodpecker-backup.tar.gz -C /data .
# Check logs
make logs
# Check Woodpecker status
make status
# Verify GitHub OAuth config in .env
grep WOODPECKER_GITHUB .env
# Reset Woodpecker data
make down
docker volume rm ufp_woodpecker_data
make up
lsof -i :8000
lsof -i :9000
lsof -i :9443
Edit compose.yaml to change the host port mapping if needed.
# Check logs
make logs sonarqube
# Increase vm.max_map_count (required for Elasticsearch)
sudo sysctl -w vm.max_map_count=262144
# Make permanent
echo "vm.max_map_count=262144" | sudo tee -a /etc/sysctl.conf
WOODPECKER_HOST in .env matches the webhook callback URL# Verify OTEL endpoint is set
grep OTEL_ENDPOINT .env
# Check connectivity from Woodpecker agent container
docker compose -f compose.yaml exec woodpecker-agent wget -qO- http://otel-collector:4318
# Check Docker access
docker ps
# Verify builder image
docker pull paketobuildpacks/builder:base
# Check pack logs in Woodpecker CI build output
Contributions are welcome! Please read our contributing guidelines and submit pull requests.
Full findings and sources: research foundation, reviewed quarterly.
This repo follows the shared Fawkes and uFawkes design reference: DESIGN.md, with tokens at https://ufawkes.dev/design/tokens.json. It is owned by uFawkes.dev.
Apache License 2.0 — see LICENSE for details.
Built for platform engineers and developers
uFawkesPipe is part of the uFawkes platform engineering ecosystem:
| Stack | Description | Link |
|---|---|---|
| uFawkesRes | Deprecated — was the resource plane (PostgreSQL, Valkey, Traefik, Authelia) | GitHub |
| uFawkesPipe | CI/CD — Woodpecker, Buildpacks, DevSecOps | GitHub |
| uFawkesObs | Observability — Prometheus, Grafana, Loki, OTEL | GitHub |
| uFawkesDORA | DORA metrics — merged into uFawkesObs | merged |
| uFawkesSec | Security — merged into uFawkesPipe (DefectDojo, Infisical, Trivy, Falco) | merged |
| uFawkesDevX | Developer experience — golden paths, IDP templates | GitHub |
| uFawkesAI | AI agent templates — golden path scaffolding | GitHub |
Product Suite Roadmap: fawkes/ROADMAP.md
Fails a PR while main's last CI run is red |
workflow-id, workflow-name |
test_artifact_dirs.py | Init step: First step is init with alpine:3.20; commands include mkdir -p artifacts/security, artifacts/coverage, artifacts/tests using mkdir -p. |